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.

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top