我编写一个程序集程序,使用户输入2个整数,将它们存储在一个堆栈中,然后显示它们的子部分:
这是我的代码:
.MODEL SMALL
.STACK 100H
.DATA
msg2 db 0dh,0ah, 'Result: ',0dh, 0ah, '$'
.CODE
MAIN PROC
mov ax,@data
mov ds,ax
mov cx, 2
mov ah,1
TOP:
int 21h
add al, 48h
push ax
LOOP TOP
mov ah,9
lea dx,msg2
int 21h
XOR bx, bx
mov cx,2
add_:
pop ax
sub bx,ax
LOOP add_
mov ah, 2
mov dl,bl
sub dl,48h
int 21h
但它打印得像个角色!如何用正确的整数打印?
注意:如果我添加了两个数字,但是sub dl,30h
它打印了一个正确的整数,那么错误是什么?
答案 0 :(得分:2)
mov cx, 2 mov ah,1 TOP: int 21h add al, 48h push ax LOOP TOP
从DOS获得的单个数字输入是[48,57]范围内的ASCII。您将其转换为可以通过减去48 进一步处理的数字。那是48位十进制或30h十六进制!
mov cx, 2
mov ah, 01h
TOP:
int 21h
sub al, 30h ;From character "0", "1", ... to number 0, 1, ...
push ax
loop TOP
XOR bx, bx mov cx,2 add_: pop ax sub bx,ax LOOP add_ mov ah, 2 mov dl,bl sub dl,48h int 21h
当要减去这两个数字时,这不是你的程序所做的。你现在否定他们的总和,那种!
这两个数字都保存在AX
的最低8位的单个字节中,更好地称为AL
。减法必须仅处理这个8位部分。
pop dx ; pop the 2nd inputted number
pop ax ; pop the 1st inputted number
sub dl, al ; calculate (2nd - 1st)
mov ah, 02h
add dl, 30h
int 21h
要将减法的结果变回可显示的字符,可以添加48十进制或30h十六进制。
要获得正确的结果(程序无法处理负数),请确保输入的第一个数字小于或等于您输入的第二个数字。例如“4”然后“9”将输出“5”。
答案 1 :(得分:0)
嗯,你正在使用一个非常古老而过时的汇编程序hehehe,它不是那么灵活。好吧,首先,处理器在谈论字符时只知道整数,因此,如果你想打印一个整数,它将被打印为char的表示。考虑到这种情况,你必须将子结果的每个数字路由到它的正确字符表示,因为你需要一个ASCII表(如果我没有错,那么emu有一个内置的ASCII图像)字符)。
例如,如果您执行“6-3”,则子结果为“3”,因此,要将其路由到正确的ASCII字符(根据给定的表格)您必须将其添加48或30h ,所以,48 + 3 = 51,或30h + 3 = 33h,该整数是“3”字符的正确ASCII整数。如果你有类似“23-3 = 20”的东西,那么你必须对每个数字做同样的事情,这意味着,0 + 30h = 30h,2 + 30h = 32h,所以你必须先打印32h字符,然后是30h字符,两者都对应于它们正确和相应的ASCII表示。
所以,简而言之,根据给定的表格(对于你的emu可能有所不同),要正确打印结果,你必须为每个数字添加30h然后打印它们。