NASM 与 GDB 简易调试指南
本文目标:在 Linux 平台中,利用 nasm 与 gdb 快速构建一个编译与调试工具链,以下仅做简单演示。
主要还是因为学习“计算机组成原理”中 intel 指令相关内容的时候,太生涩难懂了。就是想简单实操一下,深刻理解,因此才出了这篇文章。
我们以一下程序为例举例说明。
section .data
hello db "hello, world", 10 ; 定义要输出的字符串,10 是换行符的 ASCII 码
hello_len equ $ - hello ; 计算字符串长度
section .text
global _start ; 必须声明 _start 为全局符号,这是链接器识别的入口点
; 调用系统调用 exit
exit:
mov rax, 1 ; 系统调用号,这里是 exit
int 0x80 ; 触发系统调用
; 一个简易的加法函数
; 传参寄存器 edi, esi
add:
push rbp
mov rbp, rsp
; 函数无变量
mov [rbp - 4], edi
mov [rbp - 8], esi
mov edx, [rbp - 4]
mov eax, [rbp - 8]
add eax, edx
pop rbp
ret
; 入口函数
_start:
; 调用系统调用 write 功能, 向终端输出文本
mov eax, 4 ; 系统调用号,这里是 write
mov ebx, 1 ; 文件描述符 1,代表标准输出
mov ecx, hello ; 字符串的地址
mov edx, hello_len ; 字符串长度
int 0x80 ; 触发系统调用
mov edi, 10
mov esi, 20
call add
mov rbx, rax
jmp exit
如何使用 NASM 编译生成可执行文件
在 Linux 平台上,我们可以直接使用 nasm 生成 elf 可执行文件,目前 nasm 提供了两种生成方法。
-
生成可重定向目标代码,然后再链接代码。
nasm -f elf64 test.asm -o test.o ld -o test test.o
-
直接生成可执行文件。
nasm -f aout test.asm -o test
如何使用 GDB 调试生成的代码
由于我们生成的代码并不可能包含调试信息,以至于我们在调试的时候困难重重。我们只能使用 disassemble
指令来查看调试内容。
gdb ./test # 执行指令
# 以下是交互式界面需要执行的命令
break _start # 在 _start 处添加短点信息
run # 执行程序
layout asm # TUI显示汇编信息
layout regs # TUI显示寄存器信息
以下是一些常用命令:
info registers
:查看所有寄存器信息stepi
:单次执行一条指令continue
:继续执行指令break *0x401016
:在指定内存位置添加端点x /10x $sp - 16
:查看 esp - 16 所在内存的连续 10 个 dword 大小的内存空间数据。
调试的时候需要注意位数(64 位占 8 字节),以及intel处理器为小端方式。
商务转载请邮件联系,非商务合作请标明出处:https://somata.cnblogs.com/
经常会有各种错别字,请留言提醒,或者向我邮件 mailto:somata@foxmail.com.
经常会有各种错别字,请留言提醒,或者向我邮件 mailto:somata@foxmail.com.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!