装配x86控制流程

时间:2013-09-16 10:16:50

标签: assembly control-flow

我在编写一个应该在堆栈中找到最小数字的简单程序时遇到问题,并且只留下包含该数字的堆栈。 0表示堆栈的结尾,不应计为数字。似乎控制流程存在问题。我也试过用 cmp a,b jle更新 相反,但结果相同:程序只是继续循环,不退出也不更新最小的数字。

push 0 ; 
push 7 ;
push 2 ; 
push 8 ; 
push 5 ; 
push 4 ; 

data a
data b
pop b

loop:
    pop a
    je a, zero, done
    jle a, b, update
    jmp loop

update:
    add b, a, zero
    jmp loop

done:
    push b
    jmp theend

附带一份最终: 结束主要

1 个答案:

答案 0 :(得分:1)

我很确定你想要的是这个:

; a and b are defined as 16-bit words
; if you're using 32-bit, you probably want
; to use 'dd' instead.
a dw 0
b dw 0

pop b

loop:
    pop a
    or a,a  ; Sets the Z flag if a is 0
    je done
    cmp a,b ; compares a and b, and sets flags
    jle  update
    jmp loop

update:
    add b, a
    jmp loop

done:
    push b
    jmp theend

另请注意,您可以更改此内容:

    jle update
    jmp loop
update:

到此:

    jg loop  ; jump greater
update: