首页 > 其他分享 >NASM 与 GDB 简易调试指南

NASM 与 GDB 简易调试指南

时间:2024-08-27 22:37:19浏览次数:4  
标签:调用 mov rbp GDB test hello 调试 NASM

本文目标:在 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 提供了两种生成方法。

  1. 生成可重定向目标代码,然后再链接代码。

    nasm -f elf64 test.asm -o test.o
    ld -o test test.o
    
  2. 直接生成可执行文件。

    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处理器为小端方式

标签:调用,mov,rbp,GDB,test,hello,调试,NASM
From: https://www.cnblogs.com/somata/p/18383681

相关文章

  • esp-idf vscode debug command 'espIdf.getXtensaGdb' not found
    esp32idfvscodedebug错误vscode中配置文件采用的是正点原子的,调用gdb的时候,提示报错,找不到相应的命令launch.json文件中gdb的配置如下{"version":"0.2.0","configurations":[ { "name":"GDB", "type":"cppdbg", &......
  • delphi初级教程之delphi断点调试一
    所谓断点,就是在程序代码的某一行上设置一个标记,程序执行到这里将暂停,由调试器接管对程序的控制。使用断点与使用【RuntoCursor】命令有些相似,都是执行到某一行后暂停。不同的是,程序中可以设置多个断点并且能够给断点设置条件。断点通常设置在有疑点的区域。在遇到断点之前,程序......
  • 在Delphi中:如何在调试时跳过部分代码?
    在Delphi中调试时,我经常无意地进入我不感兴趣的代码。让我们首先说,我知道您可以使用F8,并且可以使用f4运行到特定的行。示例:functionTMyClass.DoStuff():Integer;begin//dosomestuffbla();end;procedureTMyClass.Foo()beginifDoStuff()=0then//pressF7......
  • 基于SpringBoot企业公司人事管理系统的设计与实现(源码+LW+调试文档+讲解等)
     博主介绍:  ......
  • 基于Springboot+Vue的房屋租赁管理系统的设计与实现(源码+LW+调试文档+讲解等)
     博主介绍:  ......
  • 电动汽车整车控制器 UDS诊断功能开发调试优化方法
    摘要:通过某电动汽车VCU开发过程中,UDS诊断功能的调试,发现一些测试中存在的问题,比如覆盖度不够、效率低下等,提出了相应的优化方法,并经过测试验证其可行性,此方法亦可推广应用至BMS、HCM等其他控制器的UDS诊断开发调试过程中。希望能给相关技术人员带来参考和帮助。一、UDS诊断功......
  • 电动汽车功能调试故障排查及处理方法
    在一款纯电动汽车装车及电气三电调试过程遇到的问题,故障排查方法及处理办法,进行分享,希望能给相关技术人员带来帮助一、故障现象:仪表一闪一闪,报BMS通讯故障,无法上电故障排查:1、测量整车CAN及驱动CAN终端电阻,断电状态整车CAN及驱动CAN终端电阻均为60Ω左右测量整车CAN,CAN高及......
  • Linux 下 gdb 的使用
    目录一、概述1、安装和启动GDB二、GDB常用命令1、查看源码2、断点2.1设置断点2.2查看断点信息2.3删除断点2.4激活/禁用断点2.5观察断点2.6捕获信号2.7线程中断3、查看信息3.1查看数据3.2查看内存3.3查看栈信息3.4查看栈帧信息4、运行、调试5、编辑和搜......
  • gdb学习记录
    目录如何查看地址值查看当前函数参数多线程调试只暂停指定线程,其他线程不影响总结如何查看地址值查看下一个地址:x/x0x12345679以八进制显示:x/o0x12345678以十进制显示:x/d0x12345678显示更多的地址和值:x/8xw0x12345678(显示从该地址开始的8个字(word),每个字以十六进制格式......
  • [20240824]利用gdb抽取kglnaobj内容.txt
    [20240824]利用gdb抽取kglnaobj内容.txt--//上午测试跟踪librarycachelocklibrarycachepin使用gdb,利用handleaddreess+0x1c8偏移可以取出kglnaobj内容.--//灵光一现,是否可以直接通过gdb抽取kglnaobj内容,新的gdb版本支持管道操作,在测试环境尝试一下.--//千万不要在生产系......