Der Code istSuche nach fehlendem C-Code, gegebenem Assembler-Code?
int f(int x, int y, int z) {
if (/* missing code here */)
return z;
else
return -z;
}
Und die Montage ist
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L2
movl 16(%ebp), %eax
jmp .L3
.L2:
movl 16(%ebp), %eax
negl %eax
.L3:
popl %ebp
ret
Und die Frage bittet um mich zu finden, was die fehlenden Testausdruck der Assembler-Code gegeben zu erhalten sein muss. Okay, einfach genug. Es gibt einen offensichtlichen Vergleich zwischen x
und y
. Der jge
Operator wird den Sprung in den Körper der Schleife vorgeben, wenn 12(%ebp) > %eax
.
Die Wahlmöglichkeiten sind
x<=y
x>=y
x>y
x<y
Meine Antwort x<=y
, da 12(%ebp)
ist ein Verweis auf y
war, und es ist das Ziel. Aber diese Antwort war falsch, und ich sehe nicht wie. Irgendwelche Hinweise? Ich danke dir sehr. Hier
Bedeutet jge nicht: Sprung größer oder gleich? '> =' –
Sie könnten dekompilieren/zerlegen, aber ehrlich gesagt, es ist nicht viel da, also könnten Sie wahrscheinlich versuchen, herauszufinden, was passiert. Ich denke, es macht x - y ('8 (% ebp)' und '12 (% ebp)' sind die ersten beiden Funktionsargumente außerhalb des Stacks) und springt dann, wenn es größer als Null ist. Was für mich bedeuten würde, dass x größer als y ist. –
Mit Intelsyntax und Pseudocode entspricht der Vergleich "cmp x, y". Von hier aus gelangen wir zum 'return -z'-Zweig, wenn x> = y.Da wir wissen wollen, was die getestete Bedingung ist, kehren wir diesen Test einfach um und geben uns den Test, der für den gewünschten Zweig wahr sein muss. Es wird bald klar, dass die tatsächliche getestete Bedingung war x = y) –
enhzflep