用gdb调试nasm汇编程序

摘要:
然而,在过去,我一直在Linux下调试c,而且从未在Linux下编译汇编程序。直接使用sys _写系统调用int0x80movebx,-g是目标文件的生产调试信息,然后直接使用命令gcc-g-ohellohellhello.o连接以生成可执行文件。当使用gcc进行连接时,会直接报告以下错误:就像我们需要在c中编写一个主函数一样,gcc连接器在连接时会查找主标签。
用gdb调试nasm汇编程序

 对于一个程序员来说,调试是很重要的,可以节约找到bug的时间,不过以前在linux下一直是对c进行调试的,今天突然要对汇编进行调试还真不知道怎么调,特别是对linux下调试汇编程序基本没搞过。记得以前上课学masm时,用的是debug,貌似映像中对汇编挺难调试的。于是就在网上查了下在linux下调试nasm汇编程序的资料,看起来比debug简单点。

1 写和编译源文件

  首先准备个hello.asm文件,这个学语言必编的程序,代码如下:

复制代码
    section .data
msg:
    db "hello, world", 10
len equ $-msg

    section .text
    global main
main:
    mov edx, len
    mov ecx, msg
    mov ebx, 1
    mov eax, 4 ;直接使用sys_write系统调用
    int 0x80

    mov ebx, 0
    mov eax, 1
    int 0x80
复制代码

  然后直接敲命令:nasm -f elf -l hello.lst -g hello.asm,-f elf是表示生产elf格式的目标文件,-g 是生产调试信息到目标文件,-l hello.lst对应的是指令和数据在段中偏移量,不要这个也可以。然后直接用命令gcc -g -o hello hello.o连接生成可执行文件,这个和c是一样的。注意在源代码中加:

    global main
main:

开始我就没加,用gcc连接的时候直接报下面的错误:

用gdb调试nasm汇编程序第3张

其实这很正常,因为程序的入口函数是main,就像c中我们要写个main函数一样,gcc连接器在连接的时候就是找这个main标号,其实在目标代码中它就是一个符号名。

2 调试

  和调试c语言一样,直接用gdb hello命令进入调试。

  2.1 用list命令查看代码

用gdb调试nasm汇编程序第4张

  

 

  2.2 将main设置为断点

用gdb调试nasm汇编程序第5张

  2.3 运行程序,然后程序直接到main出停下

用gdb调试nasm汇编程序第6张

  2.4 查看此时寄存器的值

用gdb调试nasm汇编程序第7张

  2.5 运行一条指令,用nexti,而next是运行一条语句。

用gdb调试nasm汇编程序第8张

从上面可以看到edx的值已经改为13了。

  2.6 反汇编特点地址的代码。不过要先用命令set disassembly-flavor intel设置反汇编后显示什么类型的汇编代码,默认是AT&T类型的。左边的=>表示代码执行处。

用gdb调试nasm汇编程序第9张

  2.7 显示内存中的数据。也可以用来查看代码

用gdb调试nasm汇编程序第10张

  2.8 打印某个寄存器的值

用gdb调试nasm汇编程序第11张

3 总结

  感觉用gdb调试比在windows下用debug更方便些,不过汇编的调试才刚开始学,还有很多不懂的,好在在gdb里对于不懂的命令可以中help 命令来查看,以后再慢慢加强

 
 
分类: linux编程汇编

免责声明:文章转载自《用gdb调试nasm汇编程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何搭建本地WordPress如何把一个Post过来的图片Base64编码转化为Stream下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

R语言基本操作函数---变量的基本操作

1.变量变换        as.array(x),as.data.frame(x),as.numeric(x),as.logical(x),as.complex(x),as.character(x),...转换变量类型;使用如下命令可得到全部列表,methods(as)        factor():将一个向量转化为一个因子2.变量信息        ...

SonarQube系列一、Linux安装与部署

【前言】 随着项目团队规模日益壮大,项目代码量也越来越多。且不说团队成员编码水平层次不齐,即便是老手,也难免因为代码量的增加和任务的繁重而忽略代码的质量,最终的问题便是bug的增多和代码债务的堆积。因此,代码review便日益提上了日程。当然人工review的效率还是相当低下的,于是我们采用了自动化代码review的工具,便是今天的主角:SonarQube...

使用git提交代码在不切换分支的情况下向不同的分支提交代码

我们都会提交代码,尤其是当项目的分支比较多的时候,我们就会向不同的分支提交代码,这时候,如果来来回回切换分支修改了之后在提交,那么会很费时间的,一天也改不了几个bug。 在一个分支上修改了代码,先向一个分支进行提交  比如;本地B-1分支,提交合并到B分支上面去 然后关键一步:选择Cherry-pick  意思是  炼选    最后,将自己本次修改的代码...

css3新特性总结(视觉表现方面)

1.半透明rgba 在rgba出现之前,半透明可以用opacity来创建,可是这样子导致的结果是不仅元素的背景会变透明,标签元素包含的文字也会变透明。这样子会导致可读性降低,所以都会嵌套一个包装标签来创建半透明,这样子很麻烦,自从可以用rgba来表示颜色之后就方便多了。rgba表示方法为: .rgba{ background:rgba(25...

墨者学院靶场之PHP代码分析溯源(第1题)

申请靶场环境后 点开题目 一段奇怪的PHP代码 因为我自己电脑重装了win10系统,php+apache+mysql的环境本地主机觉得没必要弄了,于是我们用在线的PHP编码(百度一下到处都是) 复制进去以";"来排个格式 运行下,报错。 看看源码,"$_"     "$__"     "$___" 这三个是变量名,我们用echo输出下内容 连在一起...

Linux 打开端口方法(防火墙操作)

Linux防火墙操作(经测试部分命令无效) 关闭防火墙:service iptables stop 开启防火墙:service iptables start 防火墙状态:service iptables status 永久关闭:chkconfig iptables off 永久开启:chkconfig iptables on 方法一(命令):    1. ...