两个数组相减并将结果存储在第三个数组中并以汇编语言 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 以获取有关 迭代 解决方案的信息,该解决方案肯定更快(并且可以通过一次输出所有数字进一步改进)。
我已经编写了添加两个数组并将结果存储在第三个数组中的代码。但是在处理负号数字以使用 (-) 号显示时会出现问题。下面是下面列出的代码,同时用数组 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 以获取有关 迭代 解决方案的信息,该解决方案肯定更快(并且可以通过一次输出所有数字进一步改进)。