计算两位以内的a+b数。
;---------------------------
ASSUME CS:CC, DS:QW
;---------------------------
QW SEGMENT
;数据段
;DB一字节,DW两字节,DD四字节
M1 DB 'Please input n1 : $'
M2 DB 13, 10, 'Please input n2 : $'
M3 DB 13, 10, 'SUM = $'
M4 DB 13, 10, 'Press any key to continue ... $'
N1 DB ?
N2 DB ?
S DB ?
QW ENDS
;---------------------------
CC SEGMENT
;代码段
START:
;引入QW段
MOV AX, QW
MOV DS, AX
;显示M1
LEA DX, M1
MOV AH, 9 ;DX=串地址,$结束字符串
INT 21H;中断号
;段标志
IN_N1:
;输入
MOV AH, 1
INT 21H
;判断是否在0-9之间
CMP AL, '0'
JB IN_N1 ;比0小转移
CMP AL, '9'
JA IN_N1 ;比9大转移
AND AL, 0FH ;与
MOV N1, AL
;输出
LEA DX, M2
MOV AH, 9
INT 21H
IN_N2:
MOV AH, 1
INT 21H
CMP AL, '0'
JB IN_N2
CMP AL, '9'
JA IN_N2
AND AL, 0FH
MOV N2, AL
;操作N1+N2
ADD AL, N1
MOV S, AL
DISP:
;输出提示字符串
LEA DX, M3
MOV AH, 9
INT 21H
;进位操作
MOV AL, S
MOV AH, 0
MOV BL, 10
DIV BL ;结果AL保存商,AH保存余数,
PUSH AX ;压入栈,临时保存
ADD AL, '0' ;低八位与操作
MOV DL, AL ;DL输出字符
MOV AH, 2
INT 21H
POP AX
ADD AH, '0' ;高八位与操作
MOV DL, AH ;DL输出字符
MOV AH, 2
INT 21H
EXIT:
LEA DX, M4
MOV AH, 9
INT 21H
MOV AH, 7;AH功能输出不回显
INT 21H
MOV AH, 4CH;结束本程序
INT 21H
;返回DOS;---------------------------
CC ENDS
END START
计算字符串的长度,数字个数,字母个数。如果有兴趣可以自己改计算大写字母个数,计算小写字母个数。
;Step1:利用0AH号功能调用接受一个字符串;
;Step2:分别统计其中数字字符、英文字母的个数;
;Step3:用十进制数的形式显示它们。
;数据定义
MLENGTH =128 ;缓冲区长度
DSEG SEGMENT ;数据段
BUFF DB MLENGTH ;符合0AH号功能调用所需的缓冲区
DB ? ;实际键入的字符数
DB MLENGTH DUP(?)
MESS0 DB "Please input:$"
MESS1 DB "Length = $"
MESS2 DB "number = $"
MESS3 DB "word = $"
DSEG ENDS
CSEG SEGMENT ;代码段
ASSUME CS:CSEG, DS:DSEG
START:
MOV AX,DSEG ;将数据时段首址DSEG送入DS寄存器
MOV DS,AX ;设置DS
MOV DX,OFFSET MESS0
CALL DISPMESS ;显示提示
MOV DX,OFFSET BUFF
MOV AH,10 ;接受一个字符串
INT 21H
CALL NEWLINE ;回车换行
MOV BH,0 ;清数字字符计数器
MOV BL,0 ;清字母符计数器
MOV CL,BUFF+1 ;取字符串长度
MOV CH,0
;若CX=0, JCXZ COK: 跳转到标号COK处
JCXZ COK ;若字符串长度等于0,不统计
MOV SI,OFFSET BUFF+2 ;指向字符串首
AGAIN:
MOV AL,[SI] ;取一个字符
INC SI ;调整数据指针,指向下一个数据
CMP AL, '0' ;判断是否是数字字符
JB NEXT ;小于‘0’,不属于统计字符,
CMP AL, '9' ;大于‘9’,不是数字字符,
JA NODEC ;转向字母字符判断
INC BH ;‘0’~‘9’,数字符计数加1
JMP SHORT NEXT ;转向取一个字符, NEXT->AGAIN (LOOP)
NODEC:
OR AL,20H ;大写转小写经典语句
CMP AL, 'a' ;判断是否是字母符
JB NEXT
CMP AL, 'z'
JA NEXT
INC BL ;字母符计数加1
NEXT:
LOOP AGAIN ;下一个
COK:
MOV DX,OFFSET MESS1
CALL DISPMESS ;显示提示
MOV AL,BUFF+1 ;取字符串长度
XOR AH,AH ;AH 取0
CALL DISPAL ;显示字符串长度(变成十进制显示)
CALL NEWLINE ;回车换行
MOV DX,OFFSET MESS2
CALL DISPMESS ;显示提示
MOV AL,BH
XOR AH,AH
CALL DISPAL ;显示数字符个数(变成十进制显示)
CALL NEWLINE ;回车换行
MOV DX,OFFSET MESS3
CALL DISPMESS
MOV AL,BL
XOR AH,AH
CALL DISPAL ;显示字母符个数
CALL NEWLINE
MOV AX,4C00H ;程序正常结束
INT 21H
DISPAL PROC NEAR ;子程序,二进制数以十进制形式显示
MOV CX,3 ;8位二进制数最多转换成3位十进制数
MOV DL,10
DISP1:
DIV DL ;AL商, AH余数
XCHG AH,AL ;使AL=余数,AH=商
ADD AL, '0' ;得ASCII码
PUSH AX ;压入堆栈
XCHG AH,AL
MOV AH,0
LOOP DISP1 ;继续
MOV CX,3 ;循环计数器重置
DISP2:
POP DX ;弹出一位
CALL ECHOCH ;显示一个字符
LOOP DISP2 ;继续
RET
DISPAL ENDP
DISPMESS PROC NEAR ;子程序,显示提示信息
MOV AH,9
INT 21H
RET
DISPMESS ENDP
ECHOCH PROC NEAR ;子程序,显示一个字符
MOV AH,2
INT 21H
RET
ECHOCH ENDP
NEWLINE PROC NEAR ;子程序,形成回车和换行
PUSH AX
PUSH DX
MOV DL,0DH ;回车符的ASCII码是0DH
MOV AH,2 ;显示回车符
INT 21H
MOV DL,0AH ;换行符的ASCII码是0AH
MOV AH,2 ;显示换行符
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
CSEG ENDS
END START