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"?

È stato utile?

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top