Programación General > ASM (Ensamblador)

 Usando Sys_read

(1/2) > >>

_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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa