• Miércoles 20 de Noviembre de 2024, 16:29

Autor Tema:  Alguien me puede explicar qué está mal en este programa.  (Leído 2694 veces)

onca

  • Nuevo Miembro
  • *
  • Mensajes: 6
  • Nacionalidad: ar
    • Ver Perfil
Alguien me puede explicar qué está mal en este programa.
« en: Martes 16 de Julio de 2013, 21:43 »
0
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.

 
 
Si de los tres valores de la Revolución Francesa "Libertad, Igualdad y Fraternidad", nos preocupáramos por ser Fraternos, los otros dos serían superfluos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re:Alguien me puede explicar qué está mal en este programa.
« Respuesta #1 en: Miércoles 24 de Julio de 2013, 11:53 »
0
El problema esta en el calculo del tamaño de las cadenas, esta imprimiendo una sola vez pero el tamaño es 0x34=52 y por lo tanto sale todo.

Asi parece ir al menos mejor:
Código: ASM
  1.   msj1: db "son iguales",0xA           ; Cadena 1 (incluye ENTER).
  2.   l1: equ $-msj1                       ; Cantidad de bytes de Cadena 1.
  3.   msj2: db "el primero es mayor",0xA   ; Cadena 2 (incluye ENTER).
  4.   l2: equ $-msj2                       ; Cantidad de bytes de Cadena 2.
  5.   msj3: db "el segundo es mayor",0xA   ; Cadena 3 (incluye ENTER).
  6.   l3: equ $-msj3                       ; Cantidad de bytes de Cadena 3.

PD. Notese que lo depure en Windows, asi que solamente comprobe los valores de ECX y EDX. ECX apuntaba correctamente al principio del texto (¿Una gran cadena sola? ¿No seria mejor terminar cada una de las frases con 0 para que sean cadenas independientes?) pero EDX era demasiado grande para funcionar bien.

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.