交易小代码汇编->;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;
}
...