ASM funciones
#include
int main(){
float x,y,z;
printf("Escribe el primer numero ");
scanf("%f",&y);
printf("Escribe el segundo numero ");
scanf("%f",&z);
asm_main();printf("La suma es %f\n",x);
return 0;
}
Código ASM
segment .text
global asm_main
asm_main:
push EBP
mov EBP, ESP
fld dword[ESP+28]
;Nota1
fadd dword[ESP+32];Nota2
fst dword[ESP+36]
;Nota3
mov ESP, EBP
pop EBP
ret
Archivo driver.s
.file "driver.c"
.section .rodata
.LC0:
.string "Escribe el primer numero "
.LC1:.string "%f"
.LC2:
.string "Escribe el segundo numero "
.LC3:
.string "La suma es %f\n"
.text
.globl main
.type main, @function
main:
.LFB0:
pushl %ebp
movl %esp,%ebp
andl $-16, %esp
subl $32, %esp
movl $.LC0, (%esp)
call printf
leal 20(%esp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call __isoc99_scanf
movl $.LC2, (%esp)call printf
leal 24(%esp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call __isoc99_scanf
call asm_main
flds 28(%esp)
fstpl 4(%esp)
movl $.LC3, (%esp)
call printfmovl $0, %eax
leave
ret
;Nota1: La instrucción fld carga su parámetro en el registro st0 del FPU.
;Nota2: La instrucción fadd suma su parámetro con el contenido del registro st0, elresultado es almacenado en el mismo registro st0.
;Nota3: La instrucción fst toma el elemento que se encuentra en el tope de la pila del FPU y lo mueve hacia donde se le indica en el parámetro.
; Acada una de las instrucciones anteriores se les hace una suma que se debe a lo siguiente: la función asm_main obtiene sus parámetros desde la pila. Cómo cada uno de sus parámetros son float, entoncesocupan cada uno 4 bytes y según el archivo driver.s, son almacenados en las direcciones 20, 24 y 28, sin embargo, cuando se hace la llamada se agregan 4 bytes más a la pila (valor de retorno) y...
Regístrate para leer el documento completo.