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