Nasm汇编GDB调试
本文主要介绍了对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调试相关推荐
- 解决nasm汇编gdb无法单步调试
我的环境:Ubuntu-desktop-20.04 LTS. 使用gdb调试nasm汇编时,无法单步调试,报错: Single stepping until exit from function _s ...
- X86 Linux 汇编 GDB 调试
mov (%rax) %rax 寄存器中%rax所保存的内存地址对应位置的值加载进%rax mov -8(%rbp) rax 将%rbp内存所保存的值减8作为内存地址,喷对应的内存地址中的值进%ra ...
- 用gdb调试nasm汇编程序
对于一个程序员来说,调试是很重要的,可以节约找到bug的时间,不过以前在linux下一直是对c进行调试的,今天突然要对汇编进行调试还真不知道怎么调,特别是对linux下调试汇编程序基本没搞过.记得以前 ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 .c代码文件 #include<stdio.h>short addend1 = 1;static int addend2 = 2;const stat ...
- 【汇编优化】之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, ...
- GDB调试汇编堆栈过程的学习
GDB调试汇编堆栈过程的学习 分析过程 这是我的C源文件: 1.安装32位兼容包 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用 ...
- 第19部分- Linux x86 64位汇编GDB单步调试
第19部分- Linux x86 64位汇编GDB单步调试 本篇我们使用gdb来调试上篇中的汇编代码. gdb调试 使用gdb进行调试. #gdb ./addsum_arg 设置参数: (gdb) s ...
- GDB调试--以汇编语言为例
#rpm -qa |grep gdb 下载: 安装 #tar -zxvf #./configure #make 使用GDB 以汇编语言调试为例 汇编语言实现CPUID指令 CPUID cpuid是I ...
最新文章
- 冲量(momentum)的原理与Python实现
- java 图像刺绣算法_图像处理:OpenCV3源代码文件解析
- p20pro 鸿蒙,后置镜头变液态双摄?华为P50Pro再曝光,搭载鸿蒙OS传感器变1寸
- viewmodel+livedata+binding 实现listview+adapter
- 移动医疗的服务怎么做?来听听传统医疗器械厂商怎么说
- 【Proteus仿真】矩阵键盘中断扫描
- linux机顶盒怎么破解wifi,折腾一下数字电视的机顶盒
- 【考试总结贴】工程测量学
- 改图宝,快速修改图片大小
- CAN总线技术2--CAN网络控制芯片SJA1000
- 网传美团今年应届生年薪 35w+,严重倒挂老员工,为什么互联网大厂校招的薪资一年比一年高?
- 三大分析法——SWOT、PEST、波特五力
- 切换到/etc/ppp/ipup文件,写出操作命令过程,并显示详细过程,和推迟30秒关机命令
- Mac解压命令之不解压__MACOSX相关文件
- win10快速关机_如何让win10开机默认开启小键盘?
- 鱼眼图像(fisheye image)通过几何变换形成透视图(a perspective view)[存疑]
- 70后80后90后00后网民研究报告(2017年)
- 围脖经典语录(16)
- UOJ#271. 【清华集训2016】连通子树(虚树+倍增)
- 三个bypass案例分享
热门文章
- 安徽科技学院 信网学院网络文化节 刘庞
- 猫吃老鼠问题的链表实现
- php文档阅读器,5.PHP - 作业部落 Cmd Markdown 编辑阅读器
- 2019AI人工智能新风向:全球智慧城市2.0报告,中国占了世界一半
- 在matlab中定义对数函数,对数函数在MATLAB(Octave)中有3种不同底数,下列选项中哪个是没有定义的:...
- 树莓派3B+安装Windows 10 ARM
- 论文笔记——YOLO-POSE
- 集训队每日一题3.23--蛇行方阵
- (PTA) 7-2 哈利·波特的考试 分数 25
- 数据可视化--实验3