Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Alguien me puede explicar qué está mal en este programa.

Iniciado por onca, 16 de Julio de 2013, 09:50:56 PM

« anterior - próximo »

onca

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.