augend DB 2 DUP(?)被加数
addend DB 2 DUP(?)加数
msg1DB 0DH,0AH,'请输入被加数: $'
msg2DB 0DH,0AH,'请输入加数: $'
msg3DB 0DH,0AH,'结果:$'msg3存放结果
0DH和0AH分别是回车和换行的ASCII码,
'$'是DOS功能调用INT 21H中肢纤辩9号功能要求的要显示字符串的结束标志
.CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CLD 方向标志位清零 CLD与STD是用来 *** 作方向标志位DF(Direction Flag)。
CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串 *** 作指令中
NOP 空 *** 作 NOP指令只使程序计数器PC加1,所以占用一个机竖枣器周期
其目的为保证写、读之间有个稳定时间
MOV AH,00H
MOV AL,03H
INT 10H 清屏
START1: MOV AH,09H 9号调用DX指向被加数的首地址,输出提示信息
LEA DX,msg1将源 *** 作数给出的有效地址传送到指定的的寄存器中
INT 21H
LEA DI,augend DI->augend的首地址
MOV CX,4按键次数
CALLGetBCDKey 得到双字节十进制数(被加数)
JNB START2 没有输入任何数字,结束 CF=0
MOV AH,09H 9号调用DX指向加数的首地址
LEA DX,msg2将源 *** 作数给出的有效地址传送到指定的的寄存器中
INT 21H
LEA DI,addend di指向加数
MOV CX,4按键次数
CALLGetBCDKey 得到双字节十进制数(加数)
JNB START2 没有输入任何数字,结束
MOV AL,augend 被加数的低8位送al
ADD AL,addend al与加数的低位相加的结果送al
DAA BCD算术运算调整,转换为压历缺缩型BCD
XCHGAL,AH 高位与低位互换
MOV AL,augend + 1
ADC AL,addend + 1 高位
DAA
XCHGAL,AH
MOV BL,0
ADC BL,0进位 bl存放的是进位 bl和ax相加是最后的结果
STD 方向标志置1
LEA DI,BUFFER+4 存放显示结果
CALLB1toB2 低位
MOV AL,AH
CALLB1toB2 高位
MOV AL,BL
OR AL,30H 转换成数字
STOSB 存数
LEA SI,BUFFER
MOV CX,5
CALLBlackDisplay将高位0消隐
MOV AH,09H
LEA DX,msg3 9号调用DX指向结果的首地址
INT 21H
MOV AH,09H
LEA DX,BUFFER 9号调用DX指向BUFFER的首地址
INT 21H
JMP START1 跳转到START1
START2: MOV AH,4CH 结束程序
INT 21H
JMP $
将一个字节压缩BCD码转换成二个字节数字
B1toB2 PROCNEAR段内
PUSHAX ax存放的是相加后的结果
AND AL,0FH 高四位置0
OR AL,30H 加30H
STOSB 存数 个位 百位
POP AX
AND AL,0F0H 低四位置0
ROR AL,4循环右移4位
OR AL,30H 加30H
STOSB 存数 十位 千位
RET
B1toB2 ENDP
BlackDisplayPROCNEAR
CLD方向标志清零
MOV DI,SI si送给di si指向buff的第一个缓冲区 增量变化
BlackDisplay1: LODSB 将高位0消隐,取串
CMP AL,'0'
JNZ Exit 若al不等于0跳转EXIT
LOOPBlackDisplay1否则cx不为0一直循环 cx次
INC CX cx加1
Exit: DEC SI si前移
REP MOVSB重复传送字节
MOV AL,'$' 把$符送al
STOSB存数
RET
BlackDisplayENDP
GetBCDKey PROCNEAR
LEA SI,BUFFER
MOV AL,4 把4写入到buff
MOV [SI],AL 【】是内存单元
MOV DX,SI
MOV AH,0AH dx指向缓冲区
MOV AL,02H 0:任意字符 1:16进制数 2:10进制数,10进制数输入
INT 21H
GetBCDKey1: LODSBds:si->al
AND AL,0FH 高4位清零
CMP CX,1
JE GetBCDKey2
DEC CX 进数位-1
MOV AH,AL
LODSB
AND AL,0FH
SHL AL,4 逻辑左移4位
OR AL,AH
GetBCDKey2: CLD
STOSB 存串指令
STD
LOOPGetBCDKey1 cx=2 原先为4 上面减了一次一 loop再减一所以等于2
MOV CL,[BUFFER]
SUB CL,[BUFFER+1]
SHR CL,1逻辑右移1位
MOV AL,0
CLD
REP STOSB 重复存数
STC进位标志位置1
RET
GetBCDKey3: CLC 进位标志位清零cf=0
RET 返回
GetBCDKey ENDP
:对于给定字符串的每一个字符,检查它是否是数字或大写字母,是则作相应处理,不是则继续读下一个.由此可以看出字符串什么时候结束得有限拿旅定条件,可以将字符串长度保存在寄存器或存储器中,也可设字符串以特定字符结束,通常以0结束.为了不和别人重复,设长度保存在前面的单元中.DATAS SEGMENT
STRLEN DB 6
STR DB "38A4CE"
DATAS ENDS
编程时进行
1 设指针指向第一个字符,CX为循环次数
2 读当前指向字符
3 是数字么,是则替换为#
4 是大写字母么,是则改为小写
4 指针加瞎敏含1
5 LOOP 第2步
是数字或是大写字母可用函数表示
以下附代码:
DATAS SEGMENT
STRLEN DW 6
STR DB "38A4CE",13,10,'$'
DATAS ENDS
STACKS SEGMENT
DB 100 DUP (0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET STR
MOV AH,9
INT 21H显示修改前的字符串
MOV CX,[STRLEN]字符串长度值送CX控制循环次数
MOV SI,OFFSET STRSI指向第一个字符
ABC:MOV AL,BYTE PTR [SI]读当前指向字符
CALL IS0_9是数字么?
JC NEXT1
MOV BYTE PTR [SI],'#'CF=0表示是0-9
JMP AG
NEXT1:CALL ISA_Z是大写字母么?
JC AG
ADD BYTE PTR [SI],20HCF=0表示是A-Z
AG: INC SI
LOOP ABC
MOV AH,9
MOV DX,OFFSET STR
INT 21H显示修改后的字符串
MOV AH,4CH
INT 21H
入口参数:AL为待比较字符
出口参数:如是0-9则CF=0,否则为1
IS0_9:
CMP AL,'0'
JB NOO
CMP AL,'9'
JA NOO
CLC
RET
NOO:STC
RET
入口参数:AL为待比较字符
出口参数:如是A-F则磨笑CF=0,否则为1
ISA_Z:
CMP AL,'A'
JB NOO1
CMP AL,'Z'
JA NOO1
CLC
RET
NOO1:STC
RET
CODES ENDS
END START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)