我接受了数组中的输入。然后,我尝试在数组中打印偶数。我得到了预期的输出,但是在打印结果后得到了额外的数字。就像假设我的数组是1,2,3输出是
200000000000 ...
并继续。
我的代码:
include emu8086.inc
org 100h
define_scan_num
define_print_num
define_print_num_uns
.model small
.stack 100h
.data
a dw ?
b dw 50 dup(?)
z dw ?
.code
main proc
mov ax, @data
mov ds,ax
call scan_num
printn ""
mov a,cx
mov bx,1
for1:
push cx
call scan_num
printn ""
mov b[bx],cx
add bx,2
pop cx
loop for1
mov bx,1
mov cx,a
for2:
mov ax, b[bx]
mov dx,0
mov z,2
div z
cmp dx,0
je even
jne odd
loop for2
jmp skip
even:
mov ax,b[bx]
call print_num
printn ""
add bx,2
jmp for2
odd:
add bx,2
jmp for2
skip:
ret
main endp
end main
答案 0 :(得分:1)
for2: mov ax, b[bx] mov dx,0 mov z,2 div z cmp dx,0 je even jne odd loop for2 jmp skip
上面的代码是一个循环,应该运行有限次。
并非如此,因为当放置在外部的 even 和 odd 案例应该跳回到loop for2
指令以获取它们时,它们会跳回到循环的顶部。正确执行循环。
test
最低位就足够了。如果该位为0(jz
),则该数字为偶数;如果该位为1(jnz
),则该数字为奇数。add bx, 2
的代码?看到这主要是表示结构不良的代码。一个例子:
xor bx, bx ; BX=0
mov cx, a
for2:
mov ax, b[bx]
test ax, 1 ; TEST does not change the value in AX ...
jnz odd ; print_num can use it without reloading!
even:
call print_num
printn ""
odd:
add bx, 2
dec cx
jnz for2
ret
main endp
end main
为获得更好的性能,您可以将loop ...
替换为dec cx
jnz ...
。