• Sábado 27 de Abril de 2024, 04:09

Autor Tema:  Duda Con Syscall Red()  (Leído 1200 veces)

_elhaz_

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Duda Con Syscall Red()
« en: Jueves 25 de Enero de 2007, 04:30 »
0
Saludos.
he estado haciendo algunas pruebas con esta syscall (read) pero tengo una duda la cual es:
como podria comprobar que no se leean mas de los bytes reservados..

read, devuelve los bytes leidos en %eax, y se podria hacer simplemente con un comprobacion simple
es justamente lo q tengo en este pequeño programa de prueba

(disculpen la suciedad del codigo, aun soy novato :) )

.section .data
##MENU##
   l1:   .string "1. Leer de un fichero\n"
   l1l   = . - l1

   l2:   .string "2. Sumar dos Numeros\n"
   l2l   = . - l2
########
##PEDIR OPCION##
   opcion:   .string   "Opcion: "
   oplen = . - opcion
##MENSAJES DE ERROR##
   m_no_option:   .string "Opcion invalida\n"
   m_no_option_len = . - m_no_option
########
##CONSTANTES##
   .equ STDIN, 0
   .equ STDOUT, 1
   .equ STDERR, 2
   .equ L_SYSCALL, 0x80

   .equ EXIT, 1
   .equ READ, 3
   .equ WRITE, 4
   
   .section .bss
##Buffer donde se leera la respuesta
   .equ B_SIZE, 4
   .lcomm B_DATA, B_SIZE

.section .text
##POSICIONES EN EL STACK PARA WRITE
   .equ _FD, 16
   .equ _LEN, 12
   .equ _POINT, 8
   
.globl _start
.globl _write

_start:   
      pushl $STDOUT
      pushl $l1l               #Argumentos para imprimer mensaje 1
      pushl $l1
      call _write
      addl $12, %esp
      
      pushl $STDOUT
      pushl $l2l               #Argumentos para imprimer mensaje 2
      pushl $l2
      call _write
      addl $12, %esp
      
      
      pushl $STDOUT
      pushl $oplen               #Argumentos para pedir forlmamente una opcion
      pushl $opcion
      call _write
      addl $12, %esp
         
      pushl $STDIN               #llamar a la funcion para leer
      pushl $B_SIZE
      pushl $B_DATA
      call _read
      addl $12, %esp
      
      cmpl $3, %eax               #mensaje de error si mide mas de 2 bytes
      jge error_input
      
      movl B_DATA, %ebx            #en el buffer de datos, se encuentra lo q leimos con _read
      cmpb $0x31, %bl               #0x31 representa el valor hexa en ascii para 1
      je op_1                  #si es la opcioen 1, salte   
      cmpb $0x32, %bl               #0x32 representa el valor hexa en ascii para 2
      je op_2                  #si es la opcioen 2, salta
      
      jmp error_input               #si no cumple las condiciones anteriores
                        #ir al mensaje de error de entrada
      
   end_program:
      movl $EXIT, %eax
      int $L_SYSCALL

op_1:
      jmp end_program
op_2:
      jmp end_program

_write:
      pushl %ebp
      movl %esp, %ebp
      movl _LEN(%ebp), %edx
      movl _POINT(%ebp), %ecx
      movl _FD(%ebp), %ebx
      movl $WRITE, %eax
      int $L_SYSCALL
   
      movl %ebp, %esp
      popl %ebp
      ret
   
_read:
      pushl %ebp
      movl %esp, %ebp
      movl _LEN(%ebp), %edx
      movl _POINT(%ebp), %ecx
      movl _FD(%ebp), %ebx
      movl $READ, %eax
      int $L_SYSCALL
      
      movl %ebp, %esp
      popl %ebp
      ret
error_input:
      pushl $STDOUT
      pushl $m_no_option_len
      pushl $m_no_option
      call _write
      addl $12, %esp
      jmp end_program

se puede ver claramente la comprobación, q no se pase de 2 bytes, pero.. cuando corro el programa.
ocurre un efecto gracioso :P, algo como:

]:~/Desktop$ ./menu
1. Leer de un fichero
2. Sumar dos Numeros
Opcion: 4000000
Opcion invalida
:~/Desktop$ 000
bash: 000: command not found
]:~/Desktop$

se ve claramente lo q sucede :), alguien me podria ayudar con un consejo para q no ocurra eso
Gracias de antemano

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Con Syscall Red()
« Respuesta #1 en: Jueves 25 de Enero de 2007, 09:41 »
0
Este problema no existe desde el mismo momento en que EDX indica el tamaño del buffer que pasas a read ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

_elhaz_

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda Con Syscall Red()
« Respuesta #2 en: Viernes 26 de Enero de 2007, 04:36 »
0
ok, gracias ;)