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.
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.