关于在汇编语言中,输入x,y,求并输出 Z =(X+20)/6 +Y 的值问题

书上的一道小练习题,记录一下我的解法,有不对的地方欢迎大佬来指正

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

注意:

  1. AH中会存入作为int 21H 指令的数字,这些数字会干扰到我们在AX中的数据运算,要在适当的时候将其清零

  2. DIV指令的功能是: 以 DIV DL 为例,
    将(DIV指令默认用AX来算)AX/DL的 商 存入AL,余数 存入AH

  3. AAA指令(ASCII Adjust Addition)的功能:
    如果AL中的值在十进制中大于9(两位数),则单纯的加上30H无法将其转化为我们想要的两位数,且INT 21H的2功能只能输出一个字符。
    此时若调用AAA指令,则可将AL中的数据进行调整,在调整后,原来AL中数据的十位数的二进制码存入AH,个位数的二进制码存入AL,此时,将AH,AL分别加上30H,再调用两次INT 21H的2号功能分别输出AH,AL,即输出了我们想要的两位数

  4. 将AX中的数据暂存进BX,以便在给AH中添加指令的同时不干扰数据



你可能感兴趣的:(萌新笔记)