汇编小程序:字符和数据计算的实验

实验内容:先在屏幕上显示“INPUT STRING,”,输入字符串;再显示“RESULT=”。输出字符串并计算出数字的个数。

DATAS SEGMENT

MESSAGE DB 'Welcome to the system!',13,10,13,10

DB 'The function of the program is showing the string which you enter and scoring how many numbers you enter.',13,10,13,10

DB 'Please enter a string.',13,10,'$'

CR    DB 13,10,'$'

RESULT1    DB 'The string is:',13,10,'$'

RESULT2    DB 'The quantity of numbers is:',13,10,'$'

STRING   DB 100

DB 0

DB 80 DUP(0)   ;定义缓冲区

AGAIN   DB 'Do you want to try again?(Y or N)',13,10,'$'

ERROR   DB 'ERROR!',13,10,'Please enter the right letters.',13,10,'$' ;错误提示

DATAS ENDS

STACKS SEGMENT STACK

DB 200 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

HEAD:

MOV AX,DATAS

MOV DS,AX

LEA DX,MESSAGE ;输出提示语

MOV AH,09H

INT 21H

LEA DX,STRING

MOV AH,0AH

INT 21H         ;字符串输入

LEA DX,CR

MOV AH,09H

INT 21H         ;回车换行

LEA SI,STRING+2 ;把字符串首地址存入SI

MOV CL,STRING+1 ;把字符个数存入CX

MOV CH,0

LEA      DX,RESULT1

MOV      AH,09H

INT      21H

MOV      BL,30H      ;置BL为字符0

;LOOP1用于判断字符是否为数字

LOOP1:

MOV DL,[SI]

CMP DL,'0'

JB       LOOP2

CMP DL,'9'

JA       LOOP2       ;ASCII码小于0和大于9的BL+1,其他情况不加

INC      BL

;LOOP2实现指针向下一位移动

LOOP2:

MOV      DL,[SI]

MOV      AH,02H

INT      21H

INC SI          ;SI自加,判断下一个字符

DEC CX          ;CX自减,最终将是0

JNE LOOP1       ;CX非零时,跳回NEXT1

LEA DX,CR

MOV AH,09H

INT 21H

LEA      DX,CR

MOV      AH,09H

INT      21H

LEA      DX,RESULT2

MOV      AH,09H

INT      21H

MOV      DL,BL

MOV      AH,02H

INT      21H

LEA DX,CR

MOV AH,09H

INT 21H

JMP      EXIT

OVERFLOW:                   ;错误提示

LEA     DX,CR

MOV     AH,09H

INT     21H

LEA     DX,ERROR

MOV     AH,09H

INT     21H

EXIT:

LEA DX,CR

MOV AH,09H

INT 21H

LEA      DX,AGAIN    ;提示是否再试一次

MOV     AH,09H

INT     21H

MOV     AH,01H

INT     21H

PUSH    AX

LEA     DX,CR

MOV AH,09H

INT 21H

POP      AX

CMP     AL,'Y'

JZ      HEAD

CMP     ,'y'

JZ      HEAD

CMP     ,'N'

JZ      OVER

CMP     ,'n'

JZ     OVER

JMP     OVERFLOW

OVER:

MOV AH,4CH

INT 21H

CODES ENDS

END START

没有调整字符对齐,不过无伤大雅。

这个程序设有两个附加功能,即提示错误和提示是否重试一次。有一些汇编程序会出错,删掉是否重复即可运行。

其实现在已经很少人在用手动汇编了,主流的方法是把需要的程序用高级语言编号后生成.exe文件,然后用反汇编工具实现。最后如有需要,再用汇编对反汇编得出的结果进行小面积的修改。