汇编小程序:字符和数据计算的实验
- 再创世纪·代码厨房
- 2008-03-16
- 142热度
- 0评论
实验内容:先在屏幕上显示“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文件,然后用反汇编工具实现。最后如有需要,再用汇编对反汇编得出的结果进行小面积的修改。