2017-01-29 4 views
1

Warum .equ Richtlinie nicht auf diese Weise in Gas arbeiten:EQU Richtlinie in GAS Montag

.equ Mark64, 8(%rsi) 

, während es in dieser (Anmerkung funktioniert: .text Abschnitt, wo Mark32 befindet, festgelegt ist r/w in dieser Fall):

Mark32 EQU DWORD PTR [ESI + 4] 

Wie kann ich Mark64 Arbeit in GAS (.set auch nicht funktioniert) machen?

Vielen Dank im Voraus!

+2

Vorbearbeitete Baugruppe verwenden und '# definieren'. Alternativ können Sie nur den Offset definieren, wie zum Beispiel '.equ Mark64, 8', dann können Sie zB' '' '' Mark64 (% rsp),% eax '' machen. – Jester

+0

@fuz hast du? Es funktioniert nicht, weil '.equ' ein Symbol definiert und kein Text ersetzt und' 8 (% rsp) 'kein gültiger Wert für ein Symbol ist. – Jester

+0

@fuz, ja, ich habe es versucht. Komma ist hier ein Tippfehler. funktioniert immer noch nicht –

Antwort

-1

Abschnitt Datum:

MarksTable: 
    .quad Mark64_1 
    .quad Mark64_2 
    .quad Mark64_3 

wo Mark64_x ist nur ein Etikett in Codeabschnitt.

Und dann habe ich gesetzt gerade meine MarksTable in reg:

movq MarksTable, %rsi 

Denn ich Mark64_2 zum Beispiel von rsi wie folgt zugreifen können:

callq *0x8(%rsi) 
+0

'movq MarksTable,% rsi' ist eine Belastung des ersten Elements. Verwenden Sie 'lea MarksTable (% rip),% rsi' oder' mov $ MarksTable,% esi'. Oder besser, 'call * 8 + MarksTable (% rip)'. –

0

In einigen Assemblersprachen (zB MASM) equ ist eine Textersetzung.

Aber in GAS, .equ ist eine numerische Konstante, wie foo = 3 in MASM. Verwenden Sie für Textersetzungen den C-Präprozessor #define Mark64 8(%rsi). Benennen Sie Ihre Datei foo.S so gcc wird es durch CPP vor der Montage laufen.

equ in NASM definiert auch eine numerische Assembly-Zeitkonstante und verwendet für Textersetzungen.


Und BTW, scheint wie eine schlechte/verwirrende Idee Mark64 zu 8(%rsi) definieren. Leute erwarten nicht etwas, das wie ein Symbol aussieht, um eine Registerreferenz zu enthalten. Das Definieren der numerischen magischen Konstante 8 zu einem sinnvollen Namen könnte jedoch gut sein.