Как разобрать 16-битный код загрузочного сектора x86 в GDB с помощью «x / i $ pc»? Это рассматривается как 32-разрядный
Например, с загрузочным сектором, который печатает BIOSa
на экранmain.asm
:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$) db 0
dw 0xaa55
Затем:
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'
Я получил:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Так выглядитmov ax, 0x0E61
был интерпретирован как 32-разрядныйmov %eax
и съел следующую инструкциюint 0x10
как данные.
Как я могу сказать GDB, что это 16-битный код?
Смотрите также:
в 2007 году разработчик GDB ответил "использоватьobjdump
" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html как объяснено вКак мне разобрать сырой код x86? Может быть, это было реализовано тем временем?надстройка:Использование GDB в 16-битном режимепохоже, но у ОП там была ошибка, так может это что то другое?Как мне разобрать win16 с GDB