反汇编和位置代码无关
- 示例代码
#include <stdio.h>
int main(void)
{
int count = 0;
printf("count = %d\n", count);
count = 0;
while (count < 10)
{
count++;
printf("result = %d\n", count);
}
/*
do
{
count++;
printf("result = %d\n", count);
} while(count < 10);
*/
return 0;
}
- 无论是
while
循环或者是do while
循环,在C语言中都是级别不同的两种循环结构,它们在汇编或者机器语言这个角度用到的都是两条非常重要的指令,比较和跳转 - 通过
objdump -d Executable File
就可以帮助我们进行反汇编这个可执行文件
callq
指令 - 调用函数cmpl
指令 - 比较,后面的l
表示long
,上图中表示左边的0x9
比较右边的-0x4
jle
指令 - 跳转,后面的le
表小于等于,当上面的cmpl
小于等于的时候就需要跳转到4004f3
地址值,而对应的机器指令只有7e df
,这就是编程中的专业术语位置无关代码记录的是一个相对值,而不是地址的绝对值!意思就是记录的跳转4004f3
与自己的400512
的一个差值,优点就是当上面的代码被搬移到其他地址处,那么这段代码记录的是相对值,运行是没有任何问题的。如果是一个绝对值那么可能存在程序无法运行, 绝对值是这样的
- 位置有关代码就是上图所示,记录的绝对值,读法是反过来读
addl
指令 - 加法,后面的l
表示long
,在C程序中就是count++
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态
如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦
如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我:vforbox@gmail.com