Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在程序集中获得偶数输出时遇到问题_Loops_Assembly_X86 16_Emu8086 - Fatal编程技术网

Loops 在程序集中获得偶数输出时遇到问题

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

我接受了数组中的输入。然后我尝试打印数组中的偶数。我得到了预期的输出,但在打印结果后我得到了额外的数字。假设我的数组是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 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(
    jz
    ),则该数字为偶数;如果该位为1(
    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