相关疑难解决方法(0)

如何使用GNU GAS汇编程序生成像nasm -f bin这样的普通二进制文件?

我有一些通常具有以下结构的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'指令.

  • 我应该传递什么gccas生成一个普通的二进制文件?即-f binNASM 的选项是什么.

assembly gnu-assembler nasm

21
推荐指数
2
解决办法
1万
查看次数

普通二进制格式(.bin)和Windows可执行文件(.exe)之间有什么区别?

普通二进制格式(.bin)和Windows可执行文件(.exe)之间有什么区别?

format binary executable

7
推荐指数
2
解决办法
6182
查看次数

如何用"x/i $ pc"在GDB中反汇编16位x86引导扇区代码?它被视为32位

例如,使用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位代码?

也可以看看:

x86 assembly gdb qemu disassembly

7
推荐指数
3
解决办法
3732
查看次数

标签 统计

assembly ×2

binary ×1

disassembly ×1

executable ×1

format ×1

gdb ×1

gnu-assembler ×1

nasm ×1

qemu ×1

x86 ×1