Dump of assembler code for function func4 <+0>: mov %rbx,-0x18(%rsp) <+5>: mov %rbp, -0x10(%rsp) <+10>: mov %r12,-0x8(%rsp) <+15>: sub $0x18,%rsp <+19>: mov %edi,%ebx <+21>: mov %esi,%ebp <+23>: test %edi, %edi <+25>: jg 0x400fb2<func4+34> <+27>: mov $0x0,%ebp <+32>: jmp 0x400fd2<func4+66> <+34> cmp $0x1, %edi <+37>: je 0x400fd2<func4+66> <+39>: lea -0x1(%rbx),%edi <+42>: callq 0x400f90 <func4> <+47>: mov %eax,%r12d <+50>: lea -0x2(%rbx),%edi <+53>: mov %ebp,%esi <+55>: callq 0x400f90 <func4> <+60>: lea (%r12,%rax,1),%eax <+64>: add %eax,ebp <+66>: mov %ebp, %eax <+68>: mov (%rsp),%rbx <+72>: mov 0x8(%rsp), %rbp <+77>: mov 0x10(%rsp),%r12 <+82>: add $0x18,%rsp <+86>: retq這是func4的反匯編代碼。而且我不確定我是否正確理解此功能。我沒有在這里編寫phase_4的反匯編代碼,但是它需要“%d%d”輸入,并且第一個(gè)整數(shù)應(yīng)該在1 <= x <4的范圍內(nèi)。因此它應(yīng)該是1,2或3。寄存器%edi首先具有值7。調(diào)用func4之后,代碼將0x10(%rsp)和%eax的值進(jìn)行比較,因此我應(yīng)該知道調(diào)用func4之后的%eax值。我以為,反匯編的func4代碼意味著put the stackebx = ediebp = esiif edi is not zero if edi is one: then eax=ebp. rearrange the stack return. else: edi = -0x1(rbx) func4 r12d = eax edi = -0x2(rbx) esi = ebp func4 eax = rax+r12+ebp rearrange the stack and return.else ebp=0 eax=ebp return但是據(jù)我了解,我無(wú)法解決。例如,如果%rsp的原始地址為0x7fffffffd5a8,則該地址將變小,直到edi的值變?yōu)?。我發(fā)現(xiàn)0x7fffffffd56f的值為0-并且第一個(gè)func4調(diào)用結(jié)束-但之后的值為0x7fffffffd56e為也為0-因此第二個(gè)func4調(diào)用結(jié)束-并且所有寄存器都變?yōu)?,包括eax。所以我認(rèn)為第二個(gè)數(shù)字的答案是零,但是(1,0),(2,0),(3,0)總是爆炸。你猜我在哪里錯(cuò)了,能幫上忙嗎?
3 回答

米琪卡哇伊
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
在phase_4的反匯編代碼中,esi設(shè)置為0x14(%rsp),這是phase_4的第二個(gè)輸入,而edi設(shè)置為7。根據(jù)您的解釋,func4(edi,esi)返回func4(edi-1,esi) )+ func4(edi-2,esi)+ esi。因此func4(7,esi)返回33 * esi。和phase_4比較0x10(%rsp)和eax。因此,phase_4的第一輸入應(yīng)為33 *(phase_4的第二輸入)。我理解正確嗎?
- 3 回答
- 0 關(guān)注
- 889 瀏覽
添加回答
舉報(bào)
0/150
提交
取消