2016-04-03 3 views
0
section .data 

    intArray dw 100,90,80,70,60 

    twoNums db ' %d %d ',0,10 

num dw 10 
numIs db ' %d ',10,0 


hello : db 'hello',10,0 


section .text 


global main 
extern printf 


main : 


mov ebx,intArray 

mov esi,0 



arrayTravel: 

movzx eax,word[intArray+esi] 

movzx ebx,word[intArray+esi+2] 



push ebx 

push eax 

push twoNums 

call printf 

add esp,12 



sub eax,ebx 

push eax 

push numIs 

call printf 

add esp,8 



ret 

результат должен быть 10, а не я т давая -78Почему результат неполноценности неверен? сборка x86

ответ

1

При вызове printf она возвращает количество напечатанных символов в EAX, в данном случае 12. Вычтите 90 из этого и вы получите -78.

Вы не можете предположить, что функции, которые вы вызываете, не будут изменять значения в регистрах, особенно EAX, вы должны сохранить их. Вызывающая конвенция будет определять, какие регистры сохраняются, а какие нет.

+0

спасибо, что я заменил add esp, 12 с добавлением esp, 4 затем использовал pop для обоих regs. работающ отлично. большое спасибо. – matheromqq

+1

@matheromqq, в то время как ваше исправление может работать в этом случае, оно не будет делать этого вообще. Здесь параметры функции (передаваемые по значению) копируются в стек для передачи функции. Однако, если вызывающая конвенция не говорит иначе, вызываемая функция имеет право изменять эти копии. Поэтому вы должны сохранять значения в месте, которое контролирует вызывающая функция. например, (сохраненный) регистр, стек, память и т. д. С другой стороны, если вы предполагаете, что, как вы, кажется, делаете, что регистры не сохраняются, вы делаете жизнь намного сложнее для себя! –

Смежные вопросы