两个数组相减并将结果存储在第三个数组中并以汇编语言 8086 在屏幕上显示结果

Subtraction of Two Arrays and Stores Result in 3rd array and display the result on screen in Assembly language 8086

我已经编写了添加两个数组并将结果存储在第三个数组中的代码。但是在处理负号数字以使用 (-) 号显示时会出现问题。下面是下面列出的代码,同时用数组 2 减去 array1 的第 6 个元素,结果是 GARBAGE 值 需要立即帮助。 运行 执行代码后,所有带符号的值都无法正确显示。

 org 100h
 Array1 db 1,3,2,2,2,2,2,2,2,2
 Array2 db 4,5,6,7,8,9,0,1,2,3  
 Array3  db  10 dup (?)


 lea dx, msg1
 mov ah, 9
 int 21h 

 mov cx, 10
 mov bx, 0

 L1001:

  mov     al, Array1 [bx]
  ; Extend (unsigned) AL to AX (to print)    
  mov     ah, 0
  call    printd
 
  mov     ah, 2
  mov     dl, 09 ;TAB Character
  int     21h

  inc     bx
 loop    L1001       ;End Loop1
 
 mov ah,2
 mov dl,10
 int 21h
 mov dl,13
 int 21h

 ; print msg2     
 lea     dx, msg2
 mov     ah, 9
 int     21h

 ; Use loop to print values of Array2                
 mov     cx, 10
 mov     bx, 0       

 L1002:

  mov     al, Array2 [bx]
  ; Extend (unsigned) AL to AX (to print)    
  mov     ah, 0
  call    printd
  
  mov     ah, 2
  mov     dl, 09 ;TAB Character
  int     21h
  inc     bx
loop    L1002   End Loop2

 mov ah,2
 mov dl,10
 int 21h
 mov dl,13
 int 21h

; print msg3    
lea     dx, msg3
mov     ah, 9
int     21h     

mov cx,10
mov bx, 0

L1003:                          ; Main Addition
 mov     al, Array1 [bx]
 sub     al, Array2 [bx]
 mov     Array3 [bx], al
 ; Extend (unsigned) AL to AX (to print)    
 mov     ah, 0
 call    printd

 mov     ah, 2
 mov     dl, 09 ;TAB Character
 int     21h   

 inc     bx
loop    L1003  ; End of lOOP3  


 lea dx, pkey
 mov ah, 9
 int 21h        ; output string at ds:dx

 ; wait for any key....    
 mov ah, 1
 int 21h

 mov ax, 4c00h ; exit to operating system.
 int 21h

 printd  proc

  ; preserve used registers
  push    ax  
  push    bx
  push    cx    
  push    dx

 ; if negative value, print - and call again with -value     
 cmp     ax, 0
 jge     L1

 mov     bx, ax

 ; print -    
 mov     dl, '-'
 mov     ah, 2
 int     21h   

 ; call with -AX             
 mov     ax, bx
 neg     ax
 call    printd
 jmp     L3

L1:

 ; divide ax by 10
 ; ( (dx=0:)ax / cx(= 10) )
 mov     dx, 0
 mov     cx, 10
 div     cx

 ; if quotient is zero, then print remainder              
 cmp     ax, 0
 jne     L2 
    
add dl, '0'
mov ah, 2
int 21h
jmp L3

L2: 
 ; if the quotient is not zero, we first call
 ; printd again for the quotient, and then we
 ; print the remainder.

 ; call printd for quotient:
 call    printd             

 ; print the remainder
 add     dl, '0'
 mov     ah, 2
 int     21h        

L3:
 ; recover used registers
 pop     dx
 pop     cx
 pop     bx
 pop     ax
 ret
printd  endp 

printud  proc ;Print Undecimal Numbers
 push    ax  
 push    bx
 push    cx    
 push    dx

 mov     dx, 0
 mov     cx, 10
 div     cx

 cmp     ax, 0
 jne     L4

 add     dl, '0'
 mov     ah, 2
 int     21h

 jmp     L5

L4:
  call    printud
  add     dl, '0'
  mov     ah, 2
  int     21h        

L5:
  pop     dx
  pop     cx
  pop     bx
  pop     ax
  ret
printud  endp ; 

ret  
 msg1    db  "Array 1 = $"
 msg2    db  "Array 2 =  $"
 msg3    db  "Array 3 =      : $"
 pkey    db "press any key...$" 



                                           
mov     al, Array1 [bx]
sub     al, Array2 [bx]
mov     Array3 [bx], al
; Extend (unsigned) AL to AX (to print)    
mov     ah, 0
call    printd

你说你的程序在显示负数时遇到问题,但你的代码从来没有向 printd 例程提供任何负数!无论 AL 中减法的带符号结果是什么,后面的 mov ah, 0 都会在 AX 中产生一个正数,而 printd 就是 AX 进程...
您应该将 mov ah, 0 替换为 cbw.

但是,最严重的错误是3个数组的位置。他们不能像那样处于计划的顶端。 cpu 正在执行它们的字节(数据),就好像它是指令(代码)一样!
将这 3 行移到源的底部。

看到这些 递归 解决方案显示十进制数,我感到很惊讶。我相信他们是正确的,但有一个例外!如果你给 printd 输入负数 -32768 那么程序就会陷入死循环。发生这种情况是因为该特定值的否定又是 -32768。
您可能想调查 Displaying numbers with DOS 以获取有关 迭代 解决方案的信息,该解决方案肯定更快(并且可以通过一次输出所有数字进一步改进)。