Come tradurre “pushl 2000” asm AT & T per la sintassi Intel su i386
Domanda
Sto cercando di tradurre il seguente dal gruppo AT & T a Intel di montaggio:
pushl 2000
Ora questo compila fino a:
ff 35 d0 07 00 00 pushl 0x7d0
Ma non importa quello che provo, non riesco a ottenere la stessa Intel SYNAX, ho provato:
intel asm
disassembly after compiling to at&t
push 2000
68 d0 07 00 00 push $0x7d0
push [2000]
68 d0 07 00 00 push $0x7d0
push dword ptr [2000]
68 d0 07 00 00 push $0x7d0
push dword ptr 2000
68 d0 07 00 00 push $0x7d0
Quindi sono fuori di indizi, ciò che è l'equivalente di "pushl 2000"?
Soluzione
Credo che il codice originale non sta facendo quello che si pensa che sta facendo. Secondo MSDEV lo smontaggio è:
003AFCFC FF 35 D0 07 00 00 push dword ptr ds:[7D0h]
che è pari a spingere:
*((DWORD*)2000)
NON spingere il valore 2000 nello stack. Tuttavia - se questo è veramente ciò che si desidera, allora l'istruzione è:
push dword ptr ds:[2000]
ds:
è un'indicazione di usare il registro di segmento ds
. I registri di segmento sono una presa-over da brutte giornate a 16 bit. I principali sono cs
- segmento di codice, ds
- segmento di dati e ss
- segmento di stack (e fs
che è dove sono memorizzati i locali di thread). Pensare a loro come offset di base in memoria. Per impostazione predefinita, accede ai dati sono fuori dal segmento ds
.
La mia ipotesi sul motivo per cui push dword ptr [2000]
non ha funzionato è che il compilatore si rese conto che quella era una cosa sciocca per l'uso e 'risolto il tutto'. Forzando l'uso del prefisso ds
si indica che si ha realmente intenzione di fare un accesso alla memoria lì.
Altri suggerimenti
per me, in GNU assembler 2.18, per la destinazione a 32 bit
.intel_syntax
push dword [2000]
genera:
0: ff 35 d0 07 00 00 pushl 0x7d0
e per nasm:
push dword [dword 2000]