linux下如何利用gdb调试汇编代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/listener51/article/details/77336420

1、gdb调试汇编代码

(1)、假设有如下代码,test.c
/*test.c*/
void main()
{
     int a, int b, int c;
     a = 1;
     b = 2;
     add_mmx(a, b, c);
}

注意:上述代码只是举例,add_mmx(a,b,c)是纯汇编写的。目的告诉gdb调试方法。
代码写完后,gcc编译成可执行文件
gcc -g -m32 test.c -o test
注意,上述代码不能编过,不要拷贝上面的代码,旨在举例。
gdb调试
gdb ./test

当然,你如果要给main函数传参,请通过 set args 命令
(2)、设置断点
b test.c:6
注意:断点一定要打在 调用纯汇编代码的前一条语句
(3)、gdb下运行程序
r
(4)运行到断点处,可以使用disassemble指令获取汇编代码
disassemble
(5)使用display /i $pc 显示当前正要执行的汇编指令
display  /i $pc
(6)  单步步过
(gdb) ni    (next instruction)
(7)  单步步入  
(gdb) si    ( step instruction )
  继续执行
  ( gdb )c
执行到返回
  (gdb) finish
(8)查看各寄存器的值
i r
(gdb) i r
(gdb) i r a                     # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc
(gdb) p $esp



参考网址:http://blog.csdn.net/ll352071639/article/details/42304619
参考网址:http://www.cnblogs.com/20145205y/p/6132211.html
参考网址:http://blog.csdn.net/mergerly/article/details/8538272
参考网址:http://blog.csdn.net/liuqiaoyu080512/article/details/8457528  内联汇编


参考地址:http://blog.csdn.net/cymycs/article/details/47313557
参考地址:http://blog.csdn.net/eastonwoo/article/details/8763216
参考地址:http://www.cnblogs.com/taek/archive/2012/02/05/2338877.html
参考网址:https://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf
参考网址:http://www.hoverlees.com/blog/?p=17
参考网址:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
参考网址:http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/
http://aandds.com/blog/lang-assembly.html
https://zhidao.baidu.com/question/329522821.html

2、汇编常用跳转指令及检测的标志位

 

助记符

条件( 执行 CMP A,B 之后的标志位)

表达式

无符号数

JB/JNAE

CF=1

A < B

JAE/JNB

CF=0

≥ B

JA/JNBE

CF=0 and ZF=0

A > B

JBE/JNA

CF=1 or ZF=1

≤ B

有符号数

JL/JNGE

SF ≠ OF

A < B

JGE/JNL

SF=OF

≥ B

JG/JNLE

SF=OF and ZF=0

A > B

JLE/JNG

SF ≠ OF or ZF=1

≤ B

无符号数或有符号数

JZ/JE

ZF=1

A = B


参考网址:http://blog.csdn.net/farmwang/article/details/50194337

猜你喜欢

转载自blog.csdn.net/listener51/article/details/77336420