二进制炸弹 第六棵

ttlyfast 2007-11-26 09:40:17
最近在玩二进制炸弹
刚初步翻译了一汇编 是 二进制炸弹 实验里滴第六个炸弹
翻译了半天 累哦
大家来检查下俺有那里翻译滴不对吗?

00401409 <_phase_6>:
401409: 55 push %ebp
40140a: 89 e5 mov %esp,%ebp
40140c: 83 ec 08 sub $0x8,%esp
40140f: 8b 45 08 mov 0x8(%ebp),%eax
401412: 89 04 24 mov %eax,(%esp)
401415: e8 56 08 00 00 call 401c70 <_atoi>
40141a: a3 ac 34 40 00 mov %eax,0x4034ac
40141f: c7 04 24 ac 34 40 00 movl $0x4034ac,(%esp)
401426: e8 8e ff ff ff call 4013b9 <_fun6>
40142b: ba 01 00 00 00 mov $0x1,%edx
401430: 8b 40 08 mov 0x8(%eax),%eax
401433: 42 inc %edx
401434: 83 fa 05 cmp $0x5,%edx
401437: 7e f7 jle 401430 <_phase_6+0x27>
401439: 8b 00 mov (%eax),%eax
40143b: 3b 05 ac 34 40 00 cmp 0x4034ac,%eax
401441: 74 05 je 401448 <_phase_6+0x3f>
401443: e8 8a 06 00 00 call 401ad2 <_explode_bomb>
401448: c9 leave
401449: c3 ret

翻译过来滴结构貌似应该这样:
typedef struct LIST_T
{
int a;
int b;
struct LIST_T* next;
}List;

004013b9 <_fun6>:
4013b9: 55 push %ebp
4013ba: 89 e5 mov %esp,%ebp
4013bc: 56 push %esi
4013bd: 53 push %ebx
4013be: 8b 75 08 mov 0x8(%ebp),%esi //parameter liste head listeSi
4013c1: 8b 5e 08 mov 0x8(%esi),%ebx //(listeSi.a is input value) List* listeBx = listeSi.next
4013c4: c7 46 08 00 00 00 00 movl $0x0,0x8(%esi) //listeSi.next = null
4013cb: 85 db test %ebx,%ebx //if( NULL == listeBx ) goto finish
4013cd: 74 34 je 401403 <_fun6+0x4a>
4013cf: 89 f2 mov %esi,%edx //List* listeDx = listeSi; (l5)
4013d1: 89 f1 mov %esi,%ecx //List* listeCx = ListeSi;
4013d3: 85 f6 test %esi,%esi //if( NULL == listeSi ) goto l1
4013d5: 74 15 je 4013ec <_fun6+0x33>
4013d7: 8b 06 mov (%esi),%eax //listeSi.a
4013d9: 3b 03 cmp (%ebx),%eax //if(listeSi.a <= listeBx.a ) goto l1
4013db: 7e 0f jle 4013ec <_fun6+0x33>
4013dd: 89 d1 mov %edx,%ecx //listeCx = listeDx; (l2)
4013df: 8b 52 08 mov 0x8(%edx),%edx //listeDx = listeDx.next
4013e2: 85 d2 test %edx,%edx //if(NULL == listeDx) goto l1
4013e4: 74 06 je 4013ec <_fun6+0x33>
4013e6: 8b 02 mov (%edx),%eax //if( listeDx.a > listeBx.a ) goto l2
4013e8: 3b 03 cmp (%ebx),%eax
4013ea: 7f f1 jg 4013dd <_fun6+0x24>
4013ec: 39 d1 cmp %edx,%ecx //if (listeCx > listeDx) goto l3 (l1)
4013ee: 74 05 je 4013f5 <_fun6+0x3c>
4013f0: 89 59 08 mov %ebx,0x8(%ecx) //listeCx.next = listeBx;
4013f3: eb 02 jmp 4013f7 <_fun6+0x3e> //goto l4
4013f5: 89 de mov %ebx,%esi //listeSi = listeBx; (l3)
4013f7: 8b 4b 08 mov 0x8(%ebx),%ecx //listeCx = listeBx.next; (l4)
4013fa: 89 53 08 mov %edx,0x8(%ebx) //listeBx.next = listeDx;
4013fd: 89 cb mov %ecx,%ebx //listeBx = listeCx;
4013ff: 85 c9 test %ecx,%ecx //if(NULL != listeCx) goto l5
401401: 75 cc jne 4013cf <_fun6+0x16>
401403: 89 f0 mov %esi,%eax //(finish)
401405: 5b pop %ebx
401406: 5e pop %esi
401407: 5d pop %ebp
401408: c3 ret
...全文
885 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
realray 2011-03-06
  • 打赏
  • 举报
回复
mark
mathe 2007-11-28
  • 打赏
  • 举报
回复
翻译的代码太难读懂了,整理一下

#include <stdio.h>
typedef struct Unknown_t
{
int value; //+0
int b; //+4
struct Unknown_t *next; //+8
}Unknown_t;

Unknown_t *fun6(Unknown_t *p )
{
Unknown_t *sorted_list,*before,*after,*left_list;
//In the beginning, only one element in sorted list and all others in left_list
sorted_list=p;
left_list=p->next;
p->next=NULL;

while(left_list!=NULL){
before=after=sorted_list;
//Try to find insert position of head element of 'left_list' in list 'sorted_list'
//It is insert between 'before' and 'after' after the loop
while(after!=NULL&&sorted_list->value > after->value){
before=after;
after=after->next;
}

if(before!=after){//Find, not insert before header of 'sorted_list'
before->next = left_list; //Insert head of 'left_list' into 'sorted_list' between 'before' and 'after'
}else{//Not find, head of 'left_list' is smaller than all element in list 'sorted_list'
sorted_list=left_list;//
}
before=left_list->next;
//Move head from 'left_list'
left_list->next=after;
left_list=before;
}

return sorted_list;

}
tanmeining 2007-11-27
  • 打赏
  • 举报
回复
4013be: 8b 75 08 mov 0x8(%ebp),%esi //parameter liste head listeSi
4013c1: 8b 5e 08 mov 0x8(%esi),%ebx //(listeSi.a is input value) List* listeBx = listeSi.next
4013c4: c7 46 08 00 00 00 00 movl $0x0,0x8(%esi) //listeSi.next = null

前两句没明白是什么意思,前面的都已经ebp,esi,ebx压栈了,不知道楼主用的是什么编译器,我用VC6.0貌似反汇编出来开辟一个函数的操作顺序不是这个样子,在VC6.0中是:
Push ebp
mov ebp,esp
sub esp,60h ;开辟函数局部变量空间
push ebx ;将基地址压栈保存
push esi ;将源变址寄存器压栈
push edi ;将目的变址寄存器压栈

但楼主出现的顺序却是ebp,esi,ebx?难道这样也能找到正确的地址?

仅有疑问还未发现有什么大的问题...
loops 2007-11-27
  • 打赏
  • 举报
回复
我没懂的一点是:这个程序看起来是:把输入的一个链表翻转,并且使之有序

这个跟炸弹有关系吗?不懂
loops 2007-11-27
  • 打赏
  • 举报
回复
12楼没贴好,15楼是总结一下,准备好jf么。
ttlyfast 2007-11-27
  • 打赏
  • 举报
回复
15 楼与 12楼说法一样
loops 2007-11-27
  • 打赏
  • 举报
回复
ok,如果不算返回值的问题,那么就发现一个问题:
 
4013ec: 39 d1 cmp %edx,%ecx //if (listeCx > listeDx) goto l3 (l1)
4013ee: 74 05 je 4013f5 <_fun6+0x3c>

这个应该是if(listeCx==listeDx)
因为下面是je指令,jump if equal


其他跟我翻译出来的程序对比一下后,都一样。
ttlyfast 2007-11-27
  • 打赏
  • 举报
回复
12楼 正确
俺把je 看成 ja 了 -_-!
ttlyfast 2007-11-27
  • 打赏
  • 举报
回复
10楼 loops
这是将链表的头返回。应翻译成
return listeSi;

---------------------------------------------
俺写滴finish 只是一个标号
指针用eax作为返回是默认
一下就能看出来
俺偷了下懒 9没翻译


感谢你滴热情 俺以前有个帖子也是你给的正确答案
呵呵


那题解的相当漂亮的说
http://topic.csdn.net/u/20071019/17/477435af-b5bd-47cd-ac2a-c9f8e0475539.html
loops 2007-11-27
  • 打赏
  • 举报
回复
[code=assembly]
4013ec: 39 d1 cmp %edx,%ecx //if (listeCx > listeDx) goto l3 (l1)
4013ee: 74 05 je 4013f5 <_fun6+0x3c>
[/code]
这个应该是if(listeCx==listeDx)
因为下面是je指令,jump if equal
loops 2007-11-27
  • 打赏
  • 举报
回复
说明一下:我的代码里
p是[ebp+8],即传来的参数
next是ebx
p1是esi
p2是edx
p3是ecx
loops 2007-11-27
  • 打赏
  • 举报
回复
我先指出一个最明显的不足

401403: 89 f0 mov %esi,%eax //(finish)

这是将链表的头返回。应翻译成
return listeSi;
飞哥 2007-11-27
  • 打赏
  • 举报
回复
汇编看不懂,太费劲,更不会反汇编
jf
loops 2007-11-27
  • 打赏
  • 举报
回复

004013b9 <_fun6>:
4013b9: 55 push %ebp
4013ba: 89 e5 mov %esp,%ebp
4013bc: 56 push %esi
4013bd: 53 push %ebx
4013be: 8b 75 08 mov 0x8(%ebp),%esi ; [ebp+8] -> esi
4013c1: 8b 5e 08 mov 0x8(%esi),%ebx ; [esi+8] -> ebx
4013c4: c7 46 08 00 00 00 00 movl $0x0,0x8(%esi) ; 0 -> [esi+8]
4013cb: 85 db test %ebx,%ebx ; if( ebx == 0 )
4013cd: 74 34 je 401403 <_fun6+0x4a>; goto 401403
4013cf: 89 f2 mov %esi,%edx ; esi -> edx
4013d1: 89 f1 mov %esi,%ecx ; esi -> ecx
4013d3: 85 f6 test %esi,%esi ; if( esi == 0 )
4013d5: 74 15 je 4013ec <_fun6+0x33>; goto 4013ec
4013d7: 8b 06 mov (%esi),%eax ; [esi]->eax
4013d9: 3b 03 cmp (%ebx),%eax ; if( [ebx]<=eax )
4013db: 7e 0f jle 4013ec <_fun6+0x33> ; goto 4013ec
4013dd: 89 d1 mov %edx,%ecx ; edx->ecx
4013df: 8b 52 08 mov 0x8(%edx),%edx ; [edx+8]->edx
4013e2: 85 d2 test %edx,%edx ; if( edx==0 )
4013e4: 74 06 je 4013ec <_fun6+0x33> ; goto 4013ec
4013e6: 8b 02 mov (%edx),%eax ; [edx]->eax
4013e8: 3b 03 cmp (%ebx),%eax ; if( [ebx]>eax )
4013ea: 7f f1 jg 4013dd <_fun6+0x24> ; goto 4013dd
4013ec: 39 d1 cmp %edx,%ecx ; if( edx==ecx )
4013ee: 74 05 je 4013f5 <_fun6+0x3c> ; goto 4013f5
4013f0: 89 59 08 mov %ebx,0x8(%ecx) ; ebx->[ecx+8]
4013f3: eb 02 jmp 4013f7 <_fun6+0x3e> ; goto 4013f7
4013f5: 89 de mov %ebx,%esi ; ebx->esi
4013f7: 8b 4b 08 mov 0x8(%ebx),%ecx ; [ebx+8]->ecx
4013fa: 89 53 08 mov %edx,0x8(%ebx) ; edx->[ebx+8]
4013fd: 89 cb mov %ecx,%ebx ; ecx->ebx
4013ff: 85 c9 test %ecx,%ecx ; if( ecx!=0)
401401: 75 cc jne 4013cf <_fun6+0x16> ; goto 4013cf
401403: 89 f0 mov %esi,%eax ; esi->eax
401405: 5b pop %ebx
401406: 5e pop %esi
401407: 5d pop %ebp
401408: c3 ret

我翻译的C代码

#include <stdio.h>
typedef struct Unknown_t
{
int a; //+0
int b; //+4
struct Unknown_t *next; //+8
}Unknown_t;
Unknown_t *fun6(Unknown_t *p )
{
Unknown_t *p1,*p2,*p3,*next;
p1=p;
next=p->next;
p1->next=NULL;
if( next==NULL )
{
return p1;
}
ADDR4013cf:
p2=p1;
p3=p1;
if( p1==NULL )
{
goto ADDR4013ec;
}else if( next->a<=p1->a )
{
goto ADDR4013ec;
}else
{
ADDR4013dd:
p3=p2;
p2=p2->next;
if( p2==NULL )
{
goto ADDR4013ec;
}else if( next->a > p2->a )
{
goto ADDR4013dd;
}
goto ADDR4013ec;
}

ADDR4013ec:
if( p2==p3 )
{
goto ADDR4013f5;
}
p3->next=next;
goto ADDR4013f7;
ADDR4013f5:
p1=next;
ADDR4013f7:
p3=next->next;
next->next=p2;
next=p3;
if( p3!=0 )
{
goto ADDR4013cf;
}else
{
return p1;
}

}

代码的功能:把输入的一个链表翻转,并且使之有序

这个貌似跟炸弹没有关系。
loops 2007-11-27
  • 打赏
  • 举报
回复
gcc的是AT&T的指令格式。
chlaws 2007-11-26
  • 打赏
  • 举报
回复
偶不会,以前学过做word炸弹,不过米成功,被杀。
lovewhzlq 2007-11-26
  • 打赏
  • 举报
回复
好晕啊,
huangxw000 2007-11-26
  • 打赏
  • 举报
回复
JF
ttlyfast 2007-11-26
  • 打赏
  • 举报
回复
第一个发现错误的35+

没发现翻译错误9散分
ttlyfast 2007-11-26
  • 打赏
  • 举报
回复
翻译错一点
9计算不出的正确滴结果
炸弹9爆炸挖! -_-!

70,021

社区成员

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

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