我在汇编程序emu 8086中遇到问题,当我打印两个数字的子结果时

时间:2018-04-05 14:57:32

标签: assembly emu8086

我编写一个程序集程序,使用户输入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它打印了一个正确的整数,那么错误是什么?

2 个答案:

答案 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然后打印它们。