Domanda:
Traduzione da funzione C in Assembly?
Rosalinda
2011-02-15 02:36:02 UTC
Ciao a tutti ragazzi :-P

A breve ho un esame di programmazione e mi servirebbe un aiuto da qualche esperto.

Come posso tradurre questa funzione C in una procedura Assembly?

int sign(int x) {
if(x<-0) return -1;
else return +1;
}

Non ho capito come faccio a restituire -1 oppure 1...Sono in alto mare :-(

Grazie a tutti in anticipo,

un bacio :-*
Quattro risposte:
cronos
2011-02-15 05:12:45 UTC
il codice assembly generato dai compilatori è di solito molto diverso da

quello usato dai programmatori assembly.

in primo luogo i parametri delle funzioni: mentre i compilatori li inseriscono

sullo stack (e lo si può vedere dalle istruzioni di contorno che generano il

cosidetto 'stack frame'), nella programmazione assembly vengono usati i

registri.

in secondo luogo il valore di ritorno; i compilatori usano il registro (e)ax

mentre in assembly non esiste una regola al riguardo anche se (e)ax è

il più usato.



la funzione potrebbe essere tradotta in assembly in questo modo:



;-----------------------------------------------------

; Ritorna il segno dell'intero fornito come parametro

;

; Parametro:

; eax intero con segno

;

; Valore di ritorno

; eax 1 se parametro positivo

; -1 se parametro negativo

;

; Registri modificati

; nessuno

;-----------------------------------------------------

sign PROC

push edx ; salva registro

mov edx,eax

mov eax,1 ; inizializza il risultato a 'positivo'

cmp edx,0

jg label1

mov eax,-1

label1:

pop edx ; recupera valore originale di edx

ret

sign ENDP
nicoladc89
2011-02-15 04:43:36 UTC
usa il compilatore gcc e scrivi, da riga di comando:



gcc prova.c -S -O0 -masm=intel -m32
?
2011-02-15 02:58:39 UTC
Potrebbe essere qualcosa del genere:



pushl %esp #Setup

movl %esp, %ebp #Setup

movl $1, %eax #eax = 1

movl 8(%ebp), %edx) #edx=x

cmpl $0, %edx

jg .L4 #se x>0 vai a L4

jl .L3 #se x<0 vai a L3

.L3 movl $-1, %eax #eax=-1

.L4 movl %ebp, %esp

popl %ebp

ret





Più o meno dovrebbe essere questo, poi dipende dalla macchina..Se hai studiato le ConditionalMove (cmov) il programma precedente può essere semplificato.

Ma cmq puoi ottenere l'assembly di un programma c compilando con l'opzione -S se usi il gcc
girossi
2011-02-15 02:48:39 UTC
per convenzione sulle cpu x86 il risultato della funzione finisce nel registo ax per gli int a 16 bit, o eax per gli int a 32 bit.



una roba tipo:



mov ax,[x]

cmp ax,0

jl @2

mov ax,1

ret

@2:

mov ax,-1

ret


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...