关于在汇编语言中,输入x,y,求并输出 Z =(X+20)/6 +Y 的值问题
程序员文章站
2024-02-01 18:39:40
...
书上的一道小练习题,记录一下我的解法,有不对的地方欢迎大佬来指正
DATAS SEGMENT
X DB ?
Y DB ?
Z DB ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AH,1
INT 21H;输入一个数作为x
SUB AL,30H;根据ascii,减去30H
ADD AL,20;x+20
MOV AH,0;高位清零,使AX值和AL值一样
MOV DL,6;DL赋值6
;MOV DH,0
DIV DL;将(DIV指令默认用AX来算)AX/DL的商存入AL,余数存入AH
MOV X,AL;将x赋值AL(其实是(x+20)/6)
MOV AH,1
INT 21H
SUB AL,30H;再次输入一个值作为Y,记得减去30H
ADD AL,X;将Y加上之前的(x+20)/6;此时AL中即为最终答案(小心进位)
AAA ;很重要,ASCII Adjust Addition 百位以内十进制数的调整
ADD AX,3030H ;将高位地位同时加30H
MOV BX,AX ;结果存入BX,因为AX还要存指令
SUB BH,1 ;前面AH存了个1
MOV DL,BH;将答案存入DL以便输出
MOV AH,2
INT 21H
MOV DL,BL
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
注意:
-
AH中会存入作为int 21H 指令的数字,这些数字会干扰到我们在AX中的数据运算,要在适当的时候将其清零
-
DIV指令的功能是: 以 DIV DL 为例,
将(DIV指令默认用AX来算)AX/DL的 商 存入AL,余数 存入AH -
AAA指令(ASCII Adjust Addition)的功能:
如果AL中的值在十进制中大于9(两位数),则单纯的加上30H无法将其转化为我们想要的两位数,且INT 21H的2功能只能输出一个字符。
此时若调用AAA指令,则可将AL中的数据进行调整,在调整后,原来AL中数据的十位数的二进制码存入AH,个位数的二进制码存入AL,此时,将AH,AL分别加上30H,再调用两次INT 21H的2号功能分别输出AH,AL,即输出了我们想要的两位数 -
将AX中的数据暂存进BX,以便在给AH中添加指令的同时不干扰数据