Programación General > ASM (Ensamblador)
Usando Sys_read
_elhaz_:
Saludos, este es mi primer post en este foro, y espero hacerlo bien.
la duda que tengo, es como puedo utilizar esta syscall de linux utilizando asm con sintaxis at&t
ya se q se puede hacer una llamada a scanf y todo muy facil.
simplemente quiero aprender
al hacer un man read
la sinopsis es esta:
ssize_t read(int fd, void *buf, size_t nbytes);
pues si, fd, el descriptor, osea 0 para stdin, void *buf, supongo q sera la variable q almacenara
lo q entra por stdin, no se si estare muy perdido, la duda me llega con el ultimo argumento, size_t nbytes
se supone q es la longitud de lo q se pasa con stdin, pero como lo calculo :S
e ahi el problema y la mayor duda
intente algo como:
.data
x: .int 0
lx = . -x
.text
.globl _start
_start:
movl $lx, %ebx
movl $x, %ecx
movl $0, %ebx
movl $3, %eax
int $0x80
salir: movl $1, %eax
int $0x80
si ensambla y enlaza bien. pero no da..
muchas gracias por la ayuda :)
Eternal Idol:
fd como 0 es correcto (ebx), buf tiene que ser la direccion de memoria de comienzo de algun tipo de array (ecx) y nbytes es el tamaño de ese array (edx).
No uso sintaxis de AT&T pero creo que lo vas a entender:
--- Código: Text --- ...section .bss Nombre resb 256section .textmain: mov eax, 3 mov ebx, 0 mov ecx, Nombre mov edx, 255 int 80h...
_elhaz_:
Muchas gracias, funciona perfectamente, tanto en sintaxis intel como rn at&t
muchas gracias Eternal Idol
Eternal Idol:
De nadas :kicking:
_elhaz_:
una pequeña duda mas..
:P
teniendo lo siguiente:
.data
nombre: .byte 255
.section .text
.globl _start
_start:
mov $255, %edx
mov $nombre, %ecx
mov $0, %ebx
mov $3, %eax
int $0x80
mov (nombre),%ebx #esto carga lo q hay en la dirección apuntada por nombre
mov $1, %eax
int $0x80
el dato q se entra con stdin se supone q se guarda en nombre, no ?
al ejecutar el programa da lo siguiente:
~/Desktop$ ./stdinasm
5
~/Desktop$ echo $?
53
y con el debugger ald me muestra esto al mover el resultado a %ebx:
0804808A 8B1D98900408 mov ebx, dword [+0x8049098]
eax = 0x00000002 ebx = 0x732E0A35 ecx = 0x08049098 edx = 0x000000FF
esp = 0xBFE89F70 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000
ss = 0x007B cs = 0x0073 eip = 0x08048090 eflags = 0x00200292
Flags: AF SF IF ID
no entiendo porq me carga una direccion de memoria :S
me podrian guiar un poco en esto ?
Gracias de antemano :)
Navegación
[#] Página Siguiente
Ir a la versión completa