版权声明:本文为博主原创文章,未经博主允许不得转载。 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 )c
执行到返回
(gdb) finish
(gdb) finish
(8)查看各寄存器的值
i r
(gdb) i r
(gdb) i r a # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc
(gdb) p $esp
参考网址: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 |
A ≥ B |
|
JA/JNBE |
CF=0 and ZF=0 |
A > B |
|
JBE/JNA |
CF=1 or ZF=1 |
A ≤ B |
|
有符号数 |
JL/JNGE |
SF ≠ OF |
A < B |
JGE/JNL |
SF=OF |
A ≥ B |
|
JG/JNLE |
SF=OF and ZF=0 |
A > B |
|
JLE/JNG |
SF ≠ OF or ZF=1 |
A ≤ B |
|
无符号数或有符号数 |
JZ/JE |
ZF=1 |
A = B |