Come smontare il codice del settore di avvio x86 a 16 bit in GDB con “x / i $ pc”? Viene trattato come 32-bit

Ad esempio, con un settore di avvio che il BIOS stampa sullo schermo main.asm :

 org 0x7c00 bits 16 cli mov ax, 0x0E61 int 0x10 hlt times 510 - ($-$$) db 0 dw 0xaa55 

Poi:

 nasm -o main.img main.asm qemu-system-i386 -hda main.img -S -s & gdb -ex 'target remote localhost:1234' \ -ex 'break *0x7c00' \ -ex 'continue' \ -ex 'x/3i $pc' 

Ottengo:

 0x7c00: cli 0x7c01: mov $0x10cd0e61,%eax 0x7c06: hlt 

Quindi sembra che il mov ax, 0x0E61 stato interpretato come un mov %eax a 32 bit e abbia mangiato l’istruzione successiva int 0x10 come dati.

Come posso dire a GDB che questo è un codice a 16 bit?

Guarda anche:

  • nel 2007 un GDB dev ha risposto “use objdump ” https://www.sourceware.org/ml/gdb/2007-03/msg00308.html come spiegato in Come faccio a smontare il codice x86 grezzo? Forse è stato implementato nel frattempo?
  • superset: utilizzo di GDB in modalità a 16 bit
  • simile, ma l’OP ha avuto un errore lì, quindi forse è qualcos’altro? Come posso smontare win16 con GDB