Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - onca

#1
Hola a todos:

Estoy aprendiendo a programar assembler en Linux con NASM.

En el programa que muestro más abajo, trato de comparar el contenido de dos registros "cmp eax,ebx" y mostrar el cartel correspondiente según sean iguales, eax mayor o eax menor.

Para ello después de comparar, trato de saltar a la etiqueta correspondiente, pero no funciona la instrucción "jmp MOSTRAR"

Si los dos registros son iguales, entonces la salida es:

son iguales
el primero es mayor
el segundo es mayor


A continuación copio el código completo:

;###############################################################################
; PROGRAMACION ASSEMBLER EN LINUX CON NASM
;
; COMPILAR:  nasm -f elf comparar.asm
; LINKEAR :  ld -o comparar comparar.o
; EJECUTAR:  ./comparar
; -------------------------------------------------------------------------------
; SECCION DE DATOS INICIALIZADOS
; -------------------------------------------------------------------------------
section .data

  msj1: db "son iguales",0xA               ; Cadena 1 (incluye ENTER).
  msj2: db "el primero es mayor",0xA    ; Cadena 2 (incluye ENTER).
  msj3: db "el segundo es mayor",0xA   ; Cadena 3 (incluye ENTER).

  l1: equ $-msj1                       ; Cantidad de bytes de Cadena 1.
  l2: equ $-msj2                       ; Cantidad de bytes de Cadena 2.
  l3: equ $-msj3                       ; Cantidad de bytes de Cadena 3.

;-------------------------------------------------------------------------------
; SECCION DE CODIGO
;-------------------------------------------------------------------------------
section .text

  global _start            ; Declaracion de etiqueta global "_start"
                               ; necesaria como punto de incio.

  _start:                    ; Punto de inicio.

  mov eax,15              ; Mueve un 15 al registro AX.
  mov ebx,15              ; Mueve un 15 al registro BX.

  cmp eax,ebx             ; Compara AX con BX.

  jg MAYOR                 ; Si el contenido de AX es mayor que el de BX
                               ; salta a la etiqueta "MAYOR".

  jl MENOR                 ; Si el contenido de AX es menor que el de BX
                               ; salta a la etiqueta "MENOR".
  IGUALES:
    mov ecx,msj1          ; Mueve al CX la direccion de la cadena 1.
    mov edx,l1             ; Mueve al DX la longitud de la cadena 1.

    jmp MOSTRAR        ; Deberia saltar a la etiqueta "MOSTRAR",
                              ; pero no lo hace.

  MAYOR:
    mov ecx,msj2         ; Mueve al CX la direccion de la cadena 2.
    mov edx,l2            ; Mueve al DX la longitud de la cadena 2.

    jmp MOSTRAR        ; Deberia saltar a la etiqueta "MOSTRAR",
                             ; pero no lo hace.

  MENOR:
    mov ecx,msj3         ; Mueve al CX la direccion de la cadena 3.
    mov edx,l3            ; Mueve al DX la longitud de la cadena 3.

  MOSTRAR:
    mov eax,4             ; Mueve al AX el numero de servicio para escribir.
    mov ebx,1             ; Mueve al BX el descriptor de archivo (1 = stdout).
    int 0x80                ; Realiza la llamada al kernel.

;-------------------------------------------------------------------------------
; TERMINAR EL PROGRAMA
;-------------------------------------------------------------------------------
  SALIR:
    mov eax,1             ; Mueve al AX el numero de servicio para salir.
    mov ebx,0             ; Mueve al BX el valor de retorno.
    int 0X80               ; Realiza la llamada al kernel.
;###############################################################################

Desde ya les quedo agradecido.
Rubén.
#2
General Programadores / leer caracter sin eco con int 0x80
06 de Julio de 2013, 04:02:20 PM
Hola a todos:

Estoy aprendiendo a programar assembler I8086 en Linux.

Utilizo el compilador nasm, y el linker ld.

Mi problema es que no sé cómo leer un carácter desde el teclado pero "sin eco", y que además no espere un ENTER.

He probado usando

   mov eax,3      ; servicio de lectura
   mov ebx,0      ; descriptor del teclado
   mov ecx,tecla ; la variable receptora
   mov edx,1      ; cantidad de bytes a leer
   int 0x80         ; llamada al kernel

pero no sólo me muestra la tecla apretada, sino que además espera un ENTER. 

He leído todo el listado de los servicios de la int 0x80, y la verdad es que no entiendo nada.

¿existe alguna forma de leer sólo un carácter del buffer sin esperar nada más?  :ayuda:

Desde ya les agradezco su atención, y les mando un saludo fraternal.

Rubén.





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.