2016-04-03 11 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 

Ergebnis sollte 10 statt sein i t -78Warum ist das Substraktionsergebnis falsch? Montage x86

Antwort

1

geben Wenn Sie printf Aufruf gibt es die Anzahl der Zeichen in EAX gedruckt, in diesem Fall 12 subtrahieren 90 von dem und Sie bekommen -78.

Sie können nicht davon ausgehen, dass die Funktionen, die Sie aufrufen, die Werte in Registern, insbesondere EAX, nicht ändern, Sie müssen sie beibehalten. Die Aufrufkonvention definiert, welche Register erhalten bleiben und welche nicht.

+0

danke ich ersetzt add esp, 12 mit add esp, 4 dann verwendet pop für beide regs. funktioniert gut. Danke vielmals. – matheromqq

+1

@matheromqq während Ihr Fix kann in diesem Fall funktioniert es wird nicht so allgemein tun. Hier werden die Funktionsparameter (die als Wert übergeben werden) in den Stapel kopiert, um sie an die Funktion zu übergeben. Sofern die Aufrufkonvention nichts anderes sagt, ist die aufgerufene Funktion berechtigt, diese Kopien zu ändern. Sie müssen daher die Werte an einer Stelle beibehalten, die die aufrufende Funktion steuert. z. B. ein (konserviertes) Register, der Stapel, Speicher usw. Andererseits, wenn Sie annehmen, dass, wie Sie zu tun scheinen, keine Register erhalten bleiben, machen Sie das Leben für Sie viel schwieriger! –