查看反编译问题

zll_lover 2010-09-01 08:31:10
我通过gdb查看汇编
disassemble main
但是看到的结果与我想像的不一样啊,请问如何解读?用这个方法编译的对吗?
能否举个例子,我只写了一个赋值语句就编译出好几十行的代码。谢谢
int main()
{
int aaa=300;
}

0x08048348 <main+0>: push %ebp
0x08048349 <main+1>: mov %esp,%ebp
0x0804834b <main+3>: sub $0x18,%esp
0x0804834e <main+6>: and $0xfffffff0,%esp
0x08048351 <main+9>: mov $0x0,%eax
0x08048356 <main+14>: add $0xf,%eax
0x08048359 <main+17>: add $0xf,%eax
0x0804835c <main+20>: shr $0x4,%eax
0x0804835f <main+23>: shl $0x4,%eax
0x08048362 <main+26>: sub %eax,%esp
0x08048364 <main+28>: movl $0x12c,0xfffffffc(%ebp)
0x0804836b <main+35>: leave
0x0804836c <main+36>: ret

...全文
151 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zll_lover 2010-09-06
  • 打赏
  • 举报
回复
请问ebp-4]是如何看出来的呢?
maoxing63570 2010-09-06
  • 打赏
  • 举报
回复
我只写了一个赋值语句就编译出好几十行的代码
那么你认为只一句代码就可以完成?你就是用纯汇编也不可以做到,不相信你可以去尝试。你要得到那句的汇编的代码不难,你可以写个空的框架,比如:

#include <iostream>
void main ()
{
//在这里设个断点
}

然后设个断点,然后调试运行,然后Ctrl+F11(这里说的是VC),然后就可以看到汇编的代码了,然后截图
然后你定个这样的框架

#include <iostream>
void main ()
{
int aaa=300;//在这里设个断点
}

然后在调试运行,然后Ctrl+F11,然后截图,最后对比,不就知道了。
zyj_604 2010-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zll_lover 的回复:]
请问ebp-4]是如何看出来的呢?
[/Quote]

0xfffffffc是-4
赵4老师 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 suchx 的回复:]
Assembly code

0x08048364 <main+28>: movl $0x12c,0xfffffffc(%ebp)


0x12c=1*16*16+2*16+12=300. 0xfffffffc(%ebp)=[ebp-4]
[/Quote]
正解
康斯坦汀 2010-09-02
  • 打赏
  • 举报
回复
基本上C跟汇编能做到很少的对应,也就是一句对两三句,多出来的是其他的处理,
比如你把这句话放在一个函数里,或者main里,转为汇编要增加额外的处理语句,
并不对对应你那句int aaa=300。
suchx 2010-09-02
  • 打赏
  • 举报
回复

0x08048364 <main+28>: movl $0x12c,0xfffffffc(%ebp)

0x12c=1*16*16+2*16+12=300. 0xfffffffc(%ebp)=[ebp-4]
zll_lover 2010-09-01
  • 打赏
  • 举报
回复
感谢一楼可我重点想知道
int aaa=300;这句再汇编的体现啊
svtanto 2010-09-01
  • 打赏
  • 举报
回复
没什么可以解释的,很多都是函数调用的开始部分和结束部分必须做的事情,经常需要看反汇编代码的话,花点时间一次研究透彻,以后只需集中精力看主要的代码就可以了。
CrySleeper 2010-09-01
  • 打赏
  • 举报
回复
objdump
swl82560397pq 2010-09-01
  • 打赏
  • 举报
回复
编译忘了。。。。。
c_song 2010-09-01
  • 打赏
  • 举报
回复
0x08048348 <main+0>: push %ebp            //把寄存器bp里的值压入栈
0x08048349 <main+1>: mov %esp,%ebp //将寄存器bp里德值传送给寄存器sp
0x0804834b <main+3>: sub $0x18,%esp //用寄存器sp的值减去16进制的0x18
0x0804834e <main+6>: and $0xfffffff0,%esp //用sp的值和16进制的0xfffffff0 做与运算 123&456
0x08048351 <main+9>: mov $0x0,%eax //将0传送给通用寄存器ax
0x08048356 <main+14>: add $0xf,%eax //0xf与通用寄存器ax求和
0x08048359 <main+17>: add $0xf,%eax
0x0804835c <main+20>: shr $0x4,%eax //让ax的值右移4位
0x0804835f <main+23>: shl $0x4,%eax //ax左移4位
0x08048362 <main+26>: sub %eax,%esp //寄存器ax与sp求差
0x08048364 <main+28>: movl $0x12c,0xfffffffc(%ebp)
0x0804836b <main+35>: leave
0x0804836c <main+36>: ret



刚开始学汇编,凑合能解释这么多

可能有不对的地方,高手指出

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧