Mi segundo programa en ASM

Iniciado por Debci, 2 Abril 2010, 12:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Debci

Hola a todos, esta vez he querido leer un caracter de stdin pero hay segmentation fault, es porque alamaceno lo leido en esi y no soy capaz de derteminar la length de este para darselo al sys_write, es basicamente un programa de echo:

Código (asm) [Seleccionar]

section .text
  global _start ;parida que necesita el linker xD

_start: ;entry point
       pop ebx
       pop ebx
       pop ebx
       pop ebx
       mov eax,5
       add     ebx,ecx
mov edx,len ;Longitud del mensaje
mov ecx,msg ;Mensaje que vamos a escribir
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;llama de sistema numero 4 (sys_write)
int 80h ;call al kernel para que ejecute las sentencias
       pushad ;Guardamos registros
       pushfd ;Guardamos flags
       mov     eax, 3 ;sys_read(3)
       mov     ebx, 0 ;stdin (0)
       mov     ecx, esi ;Guardamos la string en esi
       mov     edx, 1 ;nnumero de bytes a leer
       int     80h ;llamada al kernel de linux
       popfd ;re-establecemos flags
       popad ;re-establecemos registros
       ret ;retorno para llamar al procedimiento
       
       mov edx,length2 ;longitud del mensaje
mov ecx,esi ;mensaje a escribir
       mov ebx,1 ;file descriptor (stdout)
       mov eax,4 ;llamada a sistema numero 4 (sys_write)
int 80h ;linux esta aqui!
       mov     eax,1 ;llamada a sistema numero 1 (sys_exit)
int 80h ;llamada al kernel, linux acabará con la ejecución del proceso
       


section .data

msg db 'Hola mundo!',10 ;la primera cadena
mensaje2 db 'a',10
len equ $ - msg ;longitud de nuestra cadena
length2 equ  $ - mensaje2



Saludos

bizco

#1
Citar
popfd ;re-establecemos flags
       popad ;re-establecemos registros
       ret ;retorno para llamar al procedimiento


no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?

otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?

Debci

Cita de: ctlon en  3 Julio 2010, 17:41 PM
Citar
popfd ;re-establecemos flags
       popad ;re-establecemos registros
       ret ;retorno para llamar al procedimiento


no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?

otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?
Para sacar los argumentos de la pila, el primero es el argc y los otros son respectivamente arg[0] (filename) arg[1](argumento)
Y los voy depositando en ebx, asi de la pila los 3 primeros valores son esos, por tanto el tercer valor de la pila y por tanto el ultimo en estar en EBX es el argumento para trabajar el programa de maner dinamica.

Saludos

Eternal Idol

Tenes que pasar una direccion de memoria en ecx, ahora estas poniendo el VALOR que haya en esi. ¿Cual es ese valor? Igual depuralo con el gdb asi ves donde esta el problema exactamente ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón