sábado, 28 de marzo de 2015

x86 Asembler scanf

x86 asembler

Para leer una cadena de caracteres desde el teclado usamos la funcion de ¨C¨ ¨scanf¨.


BITS 64
SECTION .text

extern printf
extern scanf

GLOBAL main
main:
 mov  rdi, yourname
 mov  al, 0         ; numero de argumentos en SSE
 call printf

 mov rax,  [welcome]
 mov [buf], rax

 mov  rdi, scanstring
 lea  rsi, [buf+8]
 mov  al, 0            ; numero de argumentos en SSE
 call scanf

 mov  rdi, buf
 mov  al, 0            ; numero de argumentos en SSE
 call printf

 mov  rdi, end
 mov  al, 0            ; numero de argumentos en SSE
 call printf

 ret

SECTION .bss
buf: resb 4096

SECTION .data
yourname:   db "Your name: ", 0
welcome:    db "Welcome "
end:        db "!", 10, 0
scanstring: db "%s"
Se lo asembla con:

nasm -f elf64 -l sf.lst -o sf.o sf.asm
 gcc -o sf  sf.o

Para leer un entero largo de 64 bits le pasamos a través del registro "rsi' el lugar donde lo va guardar y luego cargamos el valor leído en el registro "rsi' y lo imprimimos en pantalla.

BITS 64
SECTION .text

extern printf
extern scanf

GLOBAL main
main:
 mov rdi, scanstring
 mov rsi, numero
 xor al,al ; number of arguments in SSE
 call scanf
 mov rsi,[numero]
 mov rdi, scanstring
 mov al, 0 ; number of arguments in SSE
 call printf
 ret

SECTION .data
numero:   dq 0
scanstring: db "%ld"

Lo asemblamos con:

nasm -f elf64 -l sfd.lst -o sf.o sfd.asm
 gcc -o sfd  sfd.o

Para ingresar números en notación de punto flotante, se utilizan los registros "MMX" y en el registro "RAX" colocamos el numero de registros "MMX" usados, en el programa no se observan el uso de los registros "MMX" ya que quedan implícitos, la salida de la función "scanf" es el registro "MMX0" y la entrada de la función "printf" es el mismo registro.


BITS 64
SECTION .text

extern printf
extern scanf

GLOBAL main
main:
 push    rbp
 mov rdi, scanstring
 mov rax,1 ; number of arguments in SSE
 call scanf
 mov rdi, scanstringp
 mov rax, 1 ; number of arguments in SSE
 call printf
 pop rbp
 ret

SECTION .data

scanstring:  db "%lf",0
scanstringp: db "%lf",10,0


Se lo asembla con:

nasm -f elf64 -l sff.lst -o sff.o sff.asm
 gcc -o sff  sff.o

Muchas veces los registros "MMX" se pueden estar usando y es conveniente que la función "scanf" guarde los valores directamente en memoria, para esto usamos la siguiente variante del ejemplo anterior.


BITS 64
SECTION .text

extern printf
extern scanf

GLOBAL main
main:
 push    rbp
 mov qword  rax, 0    
 push qword 0  
 mov rdi, scanstring
 mov  rsi, rsp  
 mov rax,0 ; number of arguments in SSE
 call scanf
 movsd xmm0, [rsp]  
 pop rax  
 mov rdi, scanstring
 mov rax, 1 ; number of arguments in SSE
 call printf
 pop rbp
 ret

SECTION .data

scanstring: db "%lf",0
Se lo asembla con:

nasm -f elf64 -l sff.lst -o sff.o sff.asm
 gcc -o sff  sff.o

No hay comentarios:

Publicar un comentario