Was bedeutet die Klammer in `movl ( %eAx), %eax`?
Frage
Ich habe genug gegoogelt, konnte aber nicht herausfinden, was die Klammer ()
meint. Außerdem sehe ich einige Syntax als movl 8(%ebp), %eax
Könnte jemand mir eine gute Referenz vorschlagen? Ich konnte keine unter den Top 20 von Google finden.
Lösung
%eax
ist Register eax; (%eax)
ist der Speicherort, dessen Adresse im Register EAX enthalten ist; 8(%eax)
ist der Speicherort, dessen Adresse der Wert von EAX plus 8 ist.
Andere Tipps
http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax ist eine schnelle Einführung in die UNIX (AT & T) ASM -Syntax. Gegoogelt vorbei at&t asm syntax
.
Der Beitrag ist "AT & T Assembly Syntax" von Vivek (http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek), 2003-09-01. Es gibt Hauptinformationen zu AT & T davon:
Zum Beispiel ist das allgemeine Format eines grundlegenden Datenbewegungsanweisung in Intel-Syntax,
mnemonic destination, source
Während im Fall von AT & T das allgemeine Format ist
mnemonic source, destination
(Ich erinnere mich an diese Reihenfolge, die AT & T ASM als echte Unix -ASM ansieht, also ist es so Rechts eins, und es fließt Daten nach rechts; Während die Intel -Syntax auf einem falschen MasMS -Dokument basierte, die für Unix World eindeutig nicht geeignet sind, sind sie es auch links und Daten fließen nach links)
Alle Registrierungsnamen der IA-32-Architektur müssen durch ein "%" -Schild, z. %Al, %BX, %ds, %cr0 usw.
Alle wörtlichen Werte müssen durch ein '$' -Schild vorangestellt werden. Zum Beispiel,
mov $100, %bx mov $A, %al
Die erste Anweisung bewegt den Wert 100 in die Register -Axe und die zweite verschiebt den numerischen Wert des ASCII A in das Al -Register.
In der AT & T -Syntax wird der Speicher auf folgende Weise verwiesen.
segment-override:signed-offset(base,index,scale)
Teile davon können abhängig von der gewünschten Adresse weggelassen werden.>%ES: 100 (%EAX,%EBX, 2)
Bitte beachten Sie, dass die Offsets und die Skala nicht durch '$' vorangestellt werden sollten. Ein paar weitere Beispiele mit ihrem äquivalenten Nasm-Syntax sollten die Dinge klarer machen,
GAS memory operand NASM memory operand ------------------ ------------------- 100 [100] %es:100 [es:100] (%eax) [eax] (%eax,%ebx) [eax+ebx] (%ecx,%ebx,2) [ecx+ebx*2] (,%ebx,2) [ebx*2] -10(%eax) [eax-10] %ds:-10(%ebp) [ds:ebp-10] Example instructions, mov %ax, 100 mov %eax, -100(%eax)
Operandengrößen. Insbesondere, insbesondere wenn sie die wörtlichen Werte in das Gedächtnis bewegen, wird es vornehm, die Größe der Transfer oder die Operandengröße anzugeben. Zum Beispiel die Anweisung,
mov $10, 100
Nur spezifiziert, dass der Wert 10 auf den Speicherversatz 100 verschoben werden soll, jedoch nicht auf die Übertragungsgröße. In Nasm erfolgt dies durch Hinzufügen des Casting -Keyword -Byte/Word/DWORD usw. zu einem der Operanden. In der AT & T -Syntax erfolgt dies durch Hinzufügen eines Suffix - b/w/l - zur Anweisung. Zum Beispiel,
movb $10, %es:(%eax)
Verschiebt einen Bytewert 10 an den Speicherort [EA: EAX], wohingegen,
movl $10, %es:(%eax)
Bewegt einen langen Wert (DWORD) 10 an denselben Ort.
Die Anweisungen JMP, Call, RET usw. übertragen die Kontrolle von einem Teil eines Programms auf einen anderen. Sie können als Kontrolltransfers in das gleiche Codesegment (in der Nähe) oder an verschiedene Codesegmente (FAR) eingestuft werden. Die möglichen Arten der Ast -Adressierung sind - relativer Offset (Etikett), Register-, Speicheroperat- und Segment -Offset -Zeiger.
Relative Offsets werden unter Verwendung von Etiketten angegeben, wie unten gezeigt.
label1: . . jmp label1
Die Ast -Adressierung unter Verwendung von Registern oder Speicheroperanden muss durch ein '*' vorangestellt werden. Um ein "weit" -Kontrolltranfers anzugeben, muss ein 'l' wie in 'LJMP', 'LCall' usw. vorangestellt werden. Zum Beispiel,
GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcall *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
Segment-Offset-Zeiger werden unter Verwendung des folgenden Formats angegeben:
jmp $segment, $offset
Er empfiehlt GNU auch als (Gas-) Dokumente: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html
Sie sind Bewegung Anweisungen, Verschieben von Daten von einem Ort zum anderen - in diesen Fällen vom Speicher in ein Register:
register_eax = *(unsigned long *)register_eax;
Ihr anderes Beispiel ist so etwas wie:
register_eax = *(unsigned long *)(register_ebp + 8);