在 CentOS 上调试汇编代码,通常分为 编写 → 汇编 → 链接 → 调试 四个阶段。下面以 x86‑64(最常见) 为例,给你一套完整、实用的流程。
sudo yum install -y gcc gdb nasm binutils
说明:
section .data
msg db "Hello, CentOS!", 10
len equ $ - msg
section .text
global _start
_start:
mov rax, 1 ; write
mov rdi, 1 ; stdout
mov rsi, msg
mov rdx, len
syscall
mov rax, 60 ; exit
xor rdi, rdi
syscall
nasm -f elf64 hello.asm -o hello.o
ld hello.o -o hello
./hello
输出:
Hello, CentOS!
gdb ./hello
| 命令 | 说明 |
|---|---|
layout asm |
显示汇编代码窗口 |
layout regs |
显示寄存器 |
b _start |
在程序入口下断点 |
run |
运行 |
stepi / si |
单步执行一条指令 |
nexti / ni |
单步(不进入函数) |
info registers |
查看寄存器 |
print $rax |
打印指定寄存器 |
x/10xb msg |
查看内存 |
disassemble |
反汇编当前函数 |
quit |
退出 |
(gdb) layout asm
(gdb) b _start
(gdb) run
(gdb) si
(gdb) info registers
(gdb) x/16xb msg
当程序无法运行或 GDB 不方便时:
objdump -d hello
查看机器码与汇编对应关系。
errno 或使用 strace:strace ./hello
x/20xw $rsp
disassemble 0x4000b0
纯汇编无源码,正常现象。
_start 中没有 exitcall main 却没定义asm volatile (
"mov $1, %%rax\n\t"
"mov $1, %%rdi\n\t"
"syscall"
);
调试方式同普通 C 程序。
如果你愿意,我可以:
你可以直接贴你的汇编代码。