2013-09-16 2 views
0

У меня возникли проблемы с записью простой программы, которая должна найти наименьшее число в стеке и оставить стек только с этим номером. 0 обозначает конец стека и не должен считаться числом. Кажется, что есть проблема с потоком управления. Я также попытался использовать cmp a, b jle update вместо этого, но с теми же результатами: программа просто продолжается в цикле, не выходя и не обновляя наименьшее число.Сборка x86 поток управления

главный

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

Какой ассемблер это ??? И какой процессор? Предоставьте соответствующий тег архитектуры. – johnfound

+0

http://www8.cs.umu.se/~ola/Dark/ Я предполагаю, что его x86 – user1803704

+0

В x86-архитектуре таких инструкций нет. Например, все ветви (jl, jle, je, etv.) Имеют только один аргумент - адрес, куда нужно прыгать, если условие истинно. – johnfound

ответ

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: 
Смежные вопросы