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;
}
'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). –
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. –