本文主要介绍了对Nasm汇编代码进行调试要如何编译,以及在调试过程中的会用到的一些基础指令。

1. 示例代码

section .datamessage db "hello, nasm!", 0ahmsgLen  equ $-messagesection .textglobal _start_start:mov eax, 4mov ebx, 1mov ecx, messagemov edx, msgLenint 80hmov eax, 1mov ebx, 0int 80h

2. 调试编译

2.1 通过ld命令链接

在编译和链接的时候要带上-g参数,如下:

nasm -felf32 -g hello.asm -o hello.o
ld -g -melf_i386 hello.o -o hello

这样编译后就有调试信息了。

2.2 通过gcc命令链接

网上有很多教程(包括官网)都是通过gcc做的链接,但如果你是在64位机器下,要注意nasm带上-felf32,gcc带上-m32参数,并且hello.asm汇编文件global指定的名称一定要是main。

编译命令如下:

nasm -felf32 -l hello.lst hello.asm
gcc -m32 -g hello.o -o hello

源文件修改:

section .textglobal mainmain:mov eax, 4

这两种方式都能实现编译调试的功能,但感觉使用ld命令生成的汇编码更贴进自已编写的源码,调试起来也更方便。

3. 调试

在调试的时候最主要是用到四个命令,如下:
ni:执行下一个指令
si:跳入当前函数(函数是指call调用的位置)
disas:显示当前执行到哪个汇编指令了。
r:显示当前所有寄存器的值。

3.1 调试命令 disas

这个指令可以很清楚的看到下个即将执行的汇编指令,但这个是AT&T风格的汇编,赋值是从左住右,如下:

(gdb) disas
Dump of assembler code for function _start:0x08048080 <+0>:  mov    $0x4,%eax
=> 0x08048085 <+5>:  mov    $0x1,%ebx0x0804808a <+10>:    mov    $0x80490a4,%ecx0x0804808f <+15>:  mov    $0xd,%edx0x08048094 <+20>:    int    $0x800x08048096 <+22>:    mov    $0x1,%eax0x0804809b <+27>:    mov    $0x0,%ebx0x080480a0 <+32>:    int    $0x80
End of assembler dump.

=>指示的就是当前正在执行的行。

如果想换成Intel风格的汇编,可以使用如下命令:

set disassembly-flavor intel

3.2 调示命令 r

(gdb) info r
eax            0x4  4
ecx            0x0  0
edx            0x0  0
ebx            0x0  0
esp            0xffffd000   0xffffd000
ebp            0x0  0x0
esi            0x0  0
edi            0x0  0
eip            0x8048085    0x8048085 <_start+5>
eflags         0x202    [ IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x0  0

有时候只想看某个寄存器的值,可以用print调试命令,如下:

print/x $eax         ; 查看寄存器eax的值

Nasm汇编GDB调试相关推荐

  1. 解决nasm汇编gdb无法单步调试

    我的环境:Ubuntu-desktop-20.04 LTS. 使用gdb调试nasm汇编时,无法单步调试,报错: Single stepping until exit from function _s ...

  2. X86 Linux 汇编 GDB 调试

    mov (%rax) %rax 寄存器中%rax所保存的内存地址对应位置的值加载进%rax mov -8(%rbp) rax  将%rbp内存所保存的值减8作为内存地址,喷对应的内存地址中的值进%ra ...

  3. 用gdb调试nasm汇编程序

    对于一个程序员来说,调试是很重要的,可以节约找到bug的时间,不过以前在linux下一直是对c进行调试的,今天突然要对汇编进行调试还真不知道怎么调,特别是对linux下调试汇编程序基本没搞过.记得以前 ...

  4. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  5. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 .c代码文件 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const stat ...

  6. 【汇编优化】之linux下如何利用gdb调试汇编代码

    1.gdb调试汇编代码 (1).假设有如下代码,test.c /*test.c*/ void main() {int a, int b, int c;a = 1;b = 2;add_mmx(a, b, ...

  7. GDB调试汇编堆栈过程的学习

    GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...

  8. 第19部分- Linux x86 64位汇编GDB单步调试

    第19部分- Linux x86 64位汇编GDB单步调试 本篇我们使用gdb来调试上篇中的汇编代码. gdb调试 使用gdb进行调试. #gdb ./addsum_arg 设置参数: (gdb) s ...

  9. GDB调试--以汇编语言为例

    #rpm -qa |grep  gdb 下载: 安装 #tar -zxvf #./configure #make 使用GDB 以汇编语言调试为例 汇编语言实现CPUID指令 CPUID cpuid是I ...

最新文章

  1. 冲量(momentum)的原理与Python实现
  2. java 图像刺绣算法_图像处理:OpenCV3源代码文件解析
  3. p20pro 鸿蒙,后置镜头变液态双摄?华为P50Pro再曝光,搭载鸿蒙OS传感器变1寸
  4. viewmodel+livedata+binding 实现listview+adapter
  5. 移动医疗的服务怎么做?来听听传统医疗器械厂商怎么说
  6. 【Proteus仿真】矩阵键盘中断扫描
  7. linux机顶盒怎么破解wifi,折腾一下数字电视的机顶盒
  8. 【考试总结贴】工程测量学
  9. 改图宝,快速修改图片大小
  10. CAN总线技术2--CAN网络控制芯片SJA1000
  11. 网传美团今年应届生年薪 35w+,严重倒挂老员工,为什么互联网大厂校招的薪资一年比一年高?
  12. 三大分析法——SWOT、PEST、波特五力
  13. 切换到/etc/ppp/ipup文件,写出操作命令过程,并显示详细过程,和推迟30秒关机命令
  14. Mac解压命令之不解压__MACOSX相关文件
  15. win10快速关机_如何让win10开机默认开启小键盘?
  16. 鱼眼图像(fisheye image)通过几何变换形成透视图(a perspective view)[存疑]
  17. 70后80后90后00后网民研究报告(2017年)
  18. 围脖经典语录(16)
  19. UOJ#271. 【清华集训2016】连通子树(虚树+倍增)
  20. 三个bypass案例分享

热门文章

  1. 安徽科技学院 信网学院网络文化节 刘庞
  2. 猫吃老鼠问题的链表实现
  3. php文档阅读器,5.PHP - 作业部落 Cmd Markdown 编辑阅读器
  4. 2019AI人工智能新风向:全球智慧城市2.0报告,中国占了世界一半
  5. 在matlab中定义对数函数,对数函数在MATLAB(Octave)中有3种不同底数,下列选项中哪个是没有定义的:...
  6. 树莓派3B+安装Windows 10 ARM
  7. 论文笔记——YOLO-POSE
  8. 集训队每日一题3.23--蛇行方阵
  9. (PTA) 7-2 哈利·波特的考试 分数 25
  10. 数据可视化--实验3