2015-09-08 11 views
5

Ich habe diesen x86-Assembler-Code und ich versuche, es zu C zu konvertieren:Convert x86 Assembly Jump-Tabelle C

.GLOBAL calculate 
calculate: 
    pushl %ebp 
    movl %esp,%ebp 
    movl 12(%ebp),%eax 
    movl 8(%ebp),%ecx 
    cmpl $2,%ecx 
    ja done 
    jmp *operations(,%ecx,4) 
operation1: 
    imull %eax,%eax 
    jmp done 
operation2: 
    negl %eax 
    jmp done 
operation3: 
    addl $0x80,%eax 
done: 
    leave 
    ret 
operations: 
    .long operation1, operation2, operation3 

Meine Frage ist, über die jmp *operations(,%ecs,4) Linie. Ich denke, das ist eine switch-Anweisung und ich weiß, wie es im Gedächtnis funktioniert, aber wie übersetzt sich das in c? Müsste ich nicht wissen, was auf dem Stapel an diesen Orten ist, um einen Schalter dafür zu schreiben?

Das ist, was ich habe:

int calculate(int a, int b) 
{ 
    if (2 > a) 
    { 
     return b; 
    } 
    switch(a) { 
     case /* ? */: 
      b = (b * b); 
      break; 
     case /* ? */: 
      b = (b * -1); 
      break; 
     case /* ? */: 
      b = (b + 128); 
      break; 
    } 
    return b; 
} 
+5

'Fall 0 sein:', 'Fall 1:'. 'Fall 2:' ist, was ich denke, dass Sie suchen. Der Schalter basiert auf dem Wert der Variablen "a" (was in Ihrem Assemblercode "ecx" ist). –

+2

Sie Assembler ist _at & t Syntax_ also das Ziel ist auf der rechten Seite und die Quelle auf der linken Seite. "cmpl $ 2,% ecx" wäre äquivalent zu "ecx" und subtrahiere 2 davon und setzt die Flags basierend auf dem Ergebnis. Der Assembler-Code 'ja' wäre also äquivalent zum Testen, wenn' ecx> 2' und das Springen zu getan ist, wenn es war. Das würde zu "if (a> 2)" führen, wenn b; 'in _C_ zurückgegeben wird. –

Antwort

0
%ecx == 0 -> operations(,%ecx,4) == operations+0 and operation1 is there 
%ecx == 1 -> operations(,%ecx,4) == operations+4 and operation2 is there 
%ecx == 2 -> operations(,%ecx,4) == operations+8 and operation3 is there 

Als Ergebnis sollte der Code

int calculate(int a, int b) 
{ 
    if ((unsigned int)a > 2) /* ja is a comparation instruction for unsigned integers */ 
    { 
     return b; 
    } 
    switch(a) { 
     case 0: 
      b = (b * b); 
      break; 
     case 1: 
      b = (b * -1); 
      break; 
     case 2: 
      b = (b + 128); 
      break; 
    } 
    return b; 
} 
Verwandte Themen