2016-04-03 21 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,而不是I T給予-78爲什麼減法結果是錯誤的?組件86

回答

1

當調用printf它返回在EAX打印的字符的數目,在這種情況下12減去90從和你-78。

您不能假定您調用的函數不會更改寄存器中的值,尤其是EAX,您必須保留它們。調用約定將定義哪些寄存器被保存,哪些不是。

+0

謝謝我更換了添加esp,添加了esp 12,然後使用了pop兩個regs。工作正常。非常感謝。 – matheromqq

+1

@matheromqq雖然你的修補程序可能在這種情況下工作,它不會這樣做一般。這裏函數參數(按值傳遞)被複制到堆棧以傳遞給函數。但是,除非調用約定另有說明,否則被調用函數有權修改這些副本。因此,您必須將這些值保存在調用函數控制的位置。例如一個(保存的)寄存器,堆棧,存儲器等。另一方面,如果你假設,就像你看起來正在做的那樣,沒有寄存器被保存,你就會讓自己變得更加困難! –

相關問題