我有一些通常具有以下结构的NASM文件:
[BITS 64]
[ORG 0x0000000000200000]
start:
...
ret
Run Code Online (Sandbox Code Playgroud)
我正在组装它们:
nasm -f bin abc.asm
Run Code Online (Sandbox Code Playgroud)
我想用GAS写一些这些.两个问题:
我应该在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎没有'.bits'指令.
我应该传递什么gcc或as生成一个普通的二进制文件?即-f binNASM 的选项是什么.
普通二进制格式(.bin)和Windows可执行文件(.exe)之间有什么区别?
例如,使用BIOS打印a到屏幕的引导扇区main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
然后:
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'
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x7c00: cli
0x7c01: mov $0x10cd0e61,%eax
0x7c06: hlt
Run Code Online (Sandbox Code Playgroud)
所以看起来它mov ax, 0x0E61被解释为32位mov %eax并且将下一条指令int 0x10作为数据.
我怎么能告诉GDB这是16位代码?
也可以看看:
objdump" https://www.sourceware.org/ml/gdb/2007-03/msg00308.html,如下所示:如何反汇编原始x86代码?也许这是在实施的同时实施的?