交易小代码汇编->;C
使用代码更新,很抱歉: 大会:交易小代码汇编->;C,c,assembly,x86,C,Assembly,X86,使用代码更新,很抱歉: 大会: 01: cmp edi, 5 02: ja short loc_10001141 03: jmp ds:off_100011A4[edi*4] 04: loc_10001125: 05: mov esi, 40h 06: jmp short loc_10001145 07: loc_1000112C: 08: mov esi, 20h 09: jmp short loc_10001145 10: l
01: cmp edi, 5
02: ja short loc_10001141
03: jmp ds:off_100011A4[edi*4]
04: loc_10001125:
05: mov esi, 40h
06: jmp short loc_10001145
07: loc_1000112C:
08: mov esi, 20h
09: jmp short loc_10001145
10: loc_10001133:
11: mov esi, 38h
12: jmp short loc_10001145
13: loc_1000113A:
14: mov esi, 30h
15: jmp short loc_10001145
16: loc_10001141:
17: mov esi, [esp+0Ch]
18: …
19: off_100011A4 dd offset loc_10001125
20: dd offset loc_10001125
21: dd offset loc_1000113A
22: dd offset loc_1000112C
23: dd offset loc_10001133
24: dd offset loc_1000113A
伪C:
switch(edi) {
case 0:
case 1:
// goto loc_10001125;
esi = 0x40;
break;
case 2:
case 5:
// goto loc_1000113A;
esi = 0x30;
break;
case 3:
// goto loc_1000112C;
esi = 0x20;
break;
case 4:
// goto loc_10001133;
esi = 0x38;
break;
default:
// goto loc_10001141;
esi = *(esp+0xC)
break;
}
我必须把一个小的汇编代码翻译成C语言,作为汇编编程的一个新手,我需要你的帮助
我已经找到了解决方案(你可以在上面看到),因为练习来自一本书,但这无助于我理解
因此,我花了很大的力气试图理解解决方案中汇编代码和开关之间的关系。我想这是因为我不能确切地说出代码是如何用汇编代码执行的
(更新:试图提出一个更清晰/具体的问题^^):跳转表是如何工作的,代码是如何执行的-汇编代码,而不是C-;)
我不知道我是否足够清楚,正如我所说,我是这里的新手,英语不是我的母语^^ 这是开始的代码。 装配 伪C
switch(edi) {
case 0:
case 1:
// goto loc_10001125;
esi = 0x40;
break;
case 2:
case 5:
// goto loc_1000113A;
esi = 0x30;
break;
case 3:
// goto loc_1000112C;
esi = 0x20;
break;
case 4:
// goto loc_10001133;
esi = 0x38;
break;
default:
// goto loc_10001141;
esi = *(esp+0xC)
break;
}
...
通过分析汇编代码,您可以看到对于edi==1和edi==0,您跳转到同一条指令。这同样适用于edi==2和edi==5。在伪C中,您确实有奇怪的case语句顺序,但请注意,其中一些语句在结尾错误地使用break
假设edi==2,在伪C中转到案例2,然后在伪C中转到案例5,并将0x30分配给esi。假设edi==5,则转到伪C中的情况5,并将0x30分配给esi。伪C是这样制作的,目的是为了减少指令量,并在最后具有更小的可执行文件。请在您的问题中发布代码。如果您a)发布代码,b)告知您使用的平台,这可能会有所帮助。不要提供链接…我也有理由相信你链接的书在法律上是不免费的(使链接介于非法和非道德之间)
switch(edi) {
case 0:
case 1:
// goto loc_10001125;
esi = 0x40;
break;
case 2:
case 5:
// goto loc_1000113A;
esi = 0x30;
break;
case 3:
// goto loc_1000112C;
esi = 0x20;
break;
case 4:
// goto loc_10001133;
esi = 0x38;
break;
default:
// goto loc_10001141;
esi = *(esp+0xC)
break;
}
...