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.






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.