2016-09-21 4 views
-1
movq %rax,%rdx 

movq 13(%rax),%rdx 

movq 0x47(%rax,%rcx),%rdx 

rcx = 0000000000000030 
rax = 0000000008048a37 

Ich fragte mich, was ist der Unterschied zwischen diesen drei Fließband Anweisungen. Ich weiß, dass der erste 8048a37 nach% rdx bewegt. In der zweiten, ich denke, ich muss 13 bis 8048a37 hinzufügen, um 8048a4a zu bekommen, und dann wird alles, was 8048a4a zeigt, auf% rdx verschoben. In der dritten, ich denke, ich füge rax, rdx und 47 hinzu, um 8048aae zu bekommen und dann wird alles, auf das 8048aae zeigt, nach% rdx verschoben.Montage Grundlagen - movq

+3

Die Prozessorhandbücher können sowohl von Intel als auch von AMD kostenlos heruntergeladen werden. Sie enthalten eine umfassende Referenz aller Anweisungen und Adressierungsmodi. –

+1

Genau. Deine Beobachtungen sind korrekt. – fuz

+0

Oh .. Habe deine Beobachtungen nicht richtig gesehen. Es tut uns leid!!! – amanuel2

Antwort

2

Der Unterschied zwischen diesen Assemblierungsanweisungen besteht darin, dass Sie auf den Offset zugreifen. Lässt durch sie gehen :)

movq %rax,%rdx 

Gerade rax-Register (64-Bit-Register für EAX-Bit) auf RDX-Register (64-Bit-Register für edx 32 Bit)

movq 13(%rax),%rdx 

Verschiebt die Adresse von rax Register bewegt mit einer von 13 Offsetregister RDX

movq 0x47(%rax,%rcx),%rdx 

Verschiebt die Adresse 0x47 + Rax Register + RCX Register zu dem Register RDX.

+3

Die lastwirksame Adressanweisung ('lea') würde die Adresse verschieben. Die Beschreibung in der Frage ist richtig. – user3386109

0

movq %rax, %rdx - Verschiebt den Inhalt des RAX-Registers in das RDX-Register.

movq 13(%rax), %rdx - Lädt den 8-Byte-Wert in der Adresse [RAX + 13] vom Speicher zum RDX-Register.

movq 0x47(%rax,%rcx),%rdx - Lädt den 8-Byte-Wert in der Adresse [RAX + RCX + 0x47] vom Speicher zum RDX-Register.

+0

Nein, die Verschiebung (0x47) wird nicht durch die Operandengröße skaliert. Verschiebungen in asm Quelle sind immer in Bytes. (Fun-Fakt: Die Maschinencodierung für AVX512 disp8-Verschiebungen wird durch die Operandengröße skaliert, so dass Sie +127 * 64 Bytes mit einer kompakten Verschiebung erreichen können, aber 'vcmpeqps 13 (% rax),% zmm1,% k1' (512 -Bit Speicheroperand) würde ein disp32 erfordern, weil 13 kein Vielfaches von 64 ist. Aber wie gesagt, es hat keinen Einfluss darauf, wie Sie es in die Quelle schreiben. –