Loops 在程序集中获得偶数输出时遇到问题
我接受了数组中的输入。然后我尝试打印数组中的偶数。我得到了预期的输出,但在打印结果后我得到了额外的数字。假设我的数组是1,2,3,输出是 200000000 并继续 我的代码:Loops 在程序集中获得偶数输出时遇到问题,loops,assembly,x86-16,emu8086,Loops,Assembly,X86 16,Emu8086,我接受了数组中的输入。然后我尝试打印数组中的偶数。我得到了预期的输出,但在打印结果后我得到了额外的数字。假设我的数组是1,2,3,输出是 200000000 并继续 我的代码: 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
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
上面的代码是一个循环,应该运行有限的次数。但事实并非如此,因为外部放置的偶数和奇数情况会跳回循环的顶部,而此时它们应该跳回
循环for 2
指令以正确执行循环
一些原因和一个例子
- 为什么你要除以2看这个数是不是偶数?测试最低位就足够了。如果该位为0(
),则该数字为偶数;如果该位为1(jz
),则该数字为奇数jnz
- 为什么要将偶数和奇数案例置于循环外部?如果你把它们放在循环中,那就容易多了。少到处乱跳
- 为什么要重复像添加bx,2这样的代码?这主要是结构不良代码的表现
- 为什么开始在奇数偏移量1处对单词数组进行寻址?如果您决定将其更改为更合理的0,则可以在任何地方执行(在for1和for2中)李>
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
为了获得更好的性能,您可以将
循环…
替换为dec cx
jnz…
哦,我明白了。谢谢。我不知道测试的用法。谢谢
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