大家好,我这个Masm for Windows的汇编代码运行和调试的结果都不一样,能不能帮我看一看,十分感谢!!
该程序目的是:接收一字符串,然后分别统计其数字及英文的数量,最后用十进制表示

DATAS SEGMENT
STR1 DB 'input a string :','$',0dh,0ah;提示输入字符串
STR2 DB 0dh,0ah,'the number of numbers :','$'
STR3 DB 0dh,0ah,'the number of letters :','$'
STR4 DB 0dh,0ah,'the length of the string :','$';显示各项数值
STR5 DB 100 ;准备接收100个字符.
NUMSTR DB ? ;接收输入的字符串个数
STR6 DB 100 DUP(?) ;开辟100字节的空间
NUMSHU DB ?
NUMLETTER DB ?;定义两个变量分别记录数字及字母的个数
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX, DATAS
MOV DS, AX
MOV NUMSHU, 0
MOV NUMLETTER, 0;将数字个数和字母个数置0
MOV DX, OFFSET STR1;取str1的地址给dx:ax
MOV AH, 9
INT 21H;调用bos的9h功能,显示出STR1
MOV DX, OFFSET STR5
MOV AH, 0ah
INT 21H;调用0ah号功能,将dx:ax作为地址接收键盘输入的字符
MOV CL, NUMSTR;实际收到字符的个数;
CMP CL, 0;判断实际接受字符个数是否大于0;;
JNZ LIUC;字符个数不等于0时,跳转到liuc这个子程序
CALL OVER;为0则结束
LIUC:
LEA SI, STR6 ;用si寄存器存收到字符的起始地址
FIRST:
MOV AL, [SI];将si指的内存单元里的内容转递给al寄存器
INC SI;地址加一
CMP AL,07h;判断字符串里单个字符是否等于07h
JNz SHU ;不等于07h,则跳转到判断字符是否为数字的子程序
call xiansi;调用显示有多少数字,字母的子程序
SHU:;判断字符是否在0到9之间
CMP AL, '0'
JC FIRST;字符比0小,则返回到first子程序,取下一个字符
CMP AL, ':'
JNC LETTERBIG ;字符比9大,跳转的letterbig子程序,判断字符是否为字母
INC NUMSHU ;字符在0到9之间,使numshu加一
JMP FIRST;返回first子程序,取下一个字符
LETTERBIG:;判断字符是否为大写字母
CMP AL, 'A'
JC FIRST ;字符比A小,则取下一个字符
CMP AL, '[' ;
JNC LETTERSMALL ;字符比Z大,跳转到lettersmall子程序,判断是否为小写字母
INC NUMLETTER ;字母个数加一
JMP FIRST;返回first子程序,取下一个字符
LETTERSMALL:;判断字符是否为小写字母
CMP AL, 'a';
JC FIRST ;字符比a小,取下一个字符
CMP AL, '{' ;
JNC FIRST ;字符比z大,取下一个字符
INC NUMLETTER ;字母个数加一
JMP FIRST;返回first子程序,取下一个字符
RET
XIANSI:;显示数字,字母,字符的个数
MOV DX, OFFSET STR2
MOV AH, 9
INT 21H;调用bos的9号功能,显示str2的内容
;;;;SUB NUMSHU,1
MOV AL, NUMSHU;将16进制的数转递给al寄存器
CALL ZHUANHUAN;调用16进制转换到10进制的子程序
MOV DX, OFFSET STR3
MOV AH, 9
INT 21H;调用bos的9号功能,显示str3的内容
SUB NUMLETTER,1
MOV AL, NUMLETTER;将16进制的数转递给al寄存器
CALL ZHUANHUAN;
MOV DX, OFFSET STR4
MOV AH, 9
INT 21H;调用bos的9号功能,显示str4的内容
MOV AL, NUMSTR;将16进制的数转递给al寄存器
CALL ZHUANHUAN;
OVER:;结束的子程序
MOV AH, 4CH
INT 21H
ZHUANHUAN: ;将al寄存器里16进制的数转换成10进制的数
MOV DL, 00H
MOV BX, 0
MOV Ah, 0 ; 清除AH寄存器
CMP AL, 9;判断是否为一位数
JLE SINGLE; 如果小于等于9,则跳转到SINGLE
MOV AH, 0 ; AH清零
MOV BL, 10;
DIV BL; 将AL中的值除以10,商在AL中,余数在AH中
ADD AL, 30H; 将商值转换为ASCII字符
MOV DL, AL;将ASCII字符放入DL中
MOV AH, 2
INT 21H; 调用DOS中断2号功能显示字符
ADD AH, 30H ; 将余数值转换为ASCII字符
MOV DL, AH
MOV AH, 2
INT 21H ; 调用DOS中断2号功能显示字符
CALL OVER
SINGLE:
ADD AL, 30H ; 将数字转换为ASCII字符
MOV DL, AL
MOV AH, 2
INT 21H; 调用DOS中断2号功能显示字符
RET
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START