Il codice èRicerca di codice C mancante, dato codice assembly?
int f(int x, int y, int z) {
if (/* missing code here */)
return z;
else
return -z;
}
e l'Assemblea è
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
E la domanda chiede di me per trovare ciò che l'espressione di test mancanti devono essere per ottenere il codice assembly data. Ok, abbastanza facile. Esiste un confronto ovvio tra x
e . L'operatore jge
preformerà il salto nel corpo del ciclo se 12(%ebp) > %eax
.
Le scelte possibili sono
x<=y
x>=y
x>y
x<y
mia risposta è stata x<=y
, dal momento che 12(%ebp)
è un riferimento a y
, ed è la destinazione. Ma questa risposta era sbagliata, e non vedo come. Qualche suggerimento? Grazie mille.
jge non significa: salta maggiore o uguale? '> =' –
Puoi decompilare/disassemblare ma onestamente non c'è molto, quindi potresti probabilmente provare a capire cosa succede tu stesso. Penso che stia facendo x - y ('8 (% ebp)' e '12 (% ebp)' sono i primi due argomenti della funzione fuori dallo stack) e poi saltano se è maggiore di zero. Il che, a mio avviso, implicherebbe che x sia maggiore di y. –
Utilizzando la sintassi intel e lo pseudo codice, il confronto è equivalente a 'cmp x, y'. Da qui, si arriva al ramo 'return -z' se x> = y.Dal momento che vogliamo sapere qual è la condizione testata, semplicemente invertiamo questo test, dandoci così il test che deve risultare vero per il ramo desiderato. Diventa subito chiaro che la condizione effettiva testata era x = y) –
enhzflep