2016-10-11 7 views
4

Ich bin ein wenig verwirrt darüber, wie Variablen in Assembly implementiert werden. Ich weiß, dass die folgende Erklärung eine benannte Speicherstelle im data Abschnitt des Programms erstellt:Wie werden Baugruppenvariablen implementiert?

.section .data 
     var: 
       .long 23 

Dann können Sie die Variable zugreifen wie:

movl var, %eax //read from var location 

Was ich nicht klar bin auf, wie die Die obigen Anweisungen sind tatsächlich implementiert. Ich hatte den Eindruck, dass eine Speicherreferenz, sogar eine absolute Speicherreferenz, in ein Register geladen werden musste, bevor sie verwendet werden konnte.

Hat der Monteur braucht die obige Anweisung in mehrere Anweisungen, wie zu konvertieren:

leal var, %ebx 
movl (%ebx), %eax 

Oder hat der Monteur den Überblick über die Adresse var und diesen Ort zugreifen, als ob es ein absoluter direkter Zugang waren zB:

movl ($addr_of_var), %eax 
+0

Nein. Sie haben ein Missverständnis der Anforderungen. Sie müssen die Adresse nicht in ein Register laden. Sehen Sie sich die Befehlsreferenz für die MOV-Befehlsfamilie an. –

Antwort

8

der x86-Befehlssatz keinen Speicher benötigt Adressen geladen in den Register werden, bevor sie verwendet werden kann - so ziemlich alle Anweisungen direkte oder indirekte Speicherreferenzen in denen verwenden können, Anweisung. Weitere Informationen finden Sie unter Intel architecture manual.

Die Anforderung, Adressen zuerst in Register zu laden, ist eine Eigenschaft einiger RISC-Cpus wie MIPS.

+0

Danke! Ist die zweite Aussage korrekt? (Verfolgt der Assembler absolute Verweise auf Variablen?) – David

+2

@David: Der Assmebler behandelt symbolische Symbole im Allgemeinen symbolisch, überlässt es dem Linker, die endgültigen Positionen von allem zu bestimmen und den Code nach Bedarf zu reparieren. –

+0

Macht Sinn, danke für Ihre Hilfe! – David

Verwandte Themen