欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于在汇编语言中,输入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

注意:

  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中添加指令的同时不干扰数据



相关标签: 汇编语言