SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: _elhaz_ en Miércoles 13 de Diciembre de 2006, 08:03
-
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 :)
-
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:
...
section .bss
Nombre resb 256
section .text
main:
mov eax, 3
mov ebx, 0
mov ecx, Nombre
mov edx, 255
int 80h
...
-
Muchas gracias, funciona perfectamente, tanto en sintaxis intel como rn at&t
muchas gracias Eternal Idol
-
De nadas :kicking:
-
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 :)
-
Como te decia antes:
"buf tiene que ser la direccion de memoria de comienzo de algun tipo de array"
Mira que hay en esa direccion tanto antes como despues de la interrupcion, antes tiene que haber basura y despues lo que hayas leido del teclado.
-
ok, gracias de nuevo, ya se me van aclarando varias cosas :hola:
-
De nadas again :ph34r: