Programas Intraductorios a Saltos y Condicionales Ensamblador

El día de hoy les traigo unos cuantos programas introductorios a saltos condicionales en Ensamblador, veamos cada uno:

Programa 1:

En el siguiente programa vemos el uso del salto mas sencillo en ensamblador, hablamos del JMP, el cual es el nemonico de JUMP en ingles, este salta hacia el bloque de código indicado.

org 100h
mov ax,5
mov bx,2

jmp calc ;salta hacia el bloque calc

back: jmp stop  ;salta directamente a stop

calc:
add ax,bx
jmp back   ;salta hacia el bloque back

stop: ;termina el programa
ret  

;http://jbwyatt.com/253/emu/asm_tutorial_07.html

Resultado:




 


Programa 2:

En el siguiente programa veremos el uso de loops, en este caso utilizamos el registro CX como contador y la instrucción PUSH para decrementarlo, siendo asi este programa deberá imprimir 5 veces la secuencia 1233333233333233333233333233333.

org 100h

mov cx, 5 ;establecemos que CX valdra 5 para el loop externo
k1: 
    mov al, ' ' ;guardamos un espacio en al
    mov ah, 0eh ;invocamos el servicio de impresion de video
    int 10h     ;imprimimos
    mov al, '1' ;guardamos un 1 en al
    mov ah, 0eh ;invocamos el servicio de impresión de video
    int 10h     ;imprimimos
    push cx     ;restamos 1 a cx:  cx=cx-1 para el loop 1
    mov cx, 5   ;seteamos cx a 5 para el loop interno 2
      k2:        
      mov al, '2' ;guardamos 2 en al
      mov ah, 0eh ;invocamos al servicio de impresión de video
      int 10h     ;imprimimos
      push cx     ;restamos 1 a cx:  cx=cx-1 para el loop 2
         mov cx,5  ;seteamos cx a 5 para el loop 3
         k3:      
         mov al, '3' ;guardamos 3 en al
         mov ah, 0eh ;invocamos al servicio de impresión de video
         int 10h     ;imprimimos
         loop k3    ;cerramos el loop 3 
      pop  cx       ;restamos 1 a cx:  cx=cx-1 para el loop 3
      loop  k2      ;cerramos el loop2
    pop cx           ;restamos 1 a cx:  cx=cx-1 para el loop 2
loop k1             ; cerramos el loop 1

ret ;retornamos control al ordenador

Resultado:


Programa 3:

En el siguiente programa tenemos lo que conocemos como el famoso if, en este caso lo manejaremos bajo el nemonico CMP el cual hace referencia a COMPARACIÓN y todas las condiciones serán manejadas bajo otros nemonicos, como: JE el cual  define a JUMP IF IS EQUAL, que quiere decir que ejecutara las lineas del bloque si los valores son iguales. En este caso el programa deberá imprimir 'n' dado que los valores no son iguales. Te reto a intentar modificar el programa para que imprima 'y', solo es cambiar una linea de código.

include "emu8086.inc"

org    100h

mov    al, 25     ; set al to 25. 
mov    bl, 10     ; set bl to 10. 

cmp    al, bl     ; compare al - bl. 

je     equal      ; jump if al = bl (zf = 1). 

putc   'n'        ; if it gets here, then al <> bl, 
jmp    stop       ; so print 'n', and jump to stop. 

equal:            ; if gets here, 
putc   'y'        ; then al = bl, so print 'y'. 

stop:

ret               ; gets here no matter what. 



Resultado:


Programa 4:

El siguiente programa es un ejemplo similar al anterior, en este caso debería imprimir "los registros contienen valores diferentes", te reto a modificarlo para que imprima el otro mensaje, solo es una linea de código la que tenemos que cambiar.

include "emu8086.inc"

org    100h

mov    al, 25     ; set al to 25. 
mov    bl, 10     ; set bl to 10. 

cmp    al, bl     ; compare al - bl. 
je     equal      ; jump if al = bl (zf = 1). 
        print "los registros contienen valores diferentes"        ; if it gets here, then al <> bl, 
jmp    stop       ; so print 'n', and jump to stop. 

equal:            ; if gets here, 
print "los registros contienen valores iguales"        ; then al = bl, so print 'y'. 

stop:

ret               ; gets here no matter what. 



Resultado:


Programa 5:

El siguiente programa es exactamente igual a los anteriores, sin embargo en este caso incluimos mas nemonicos de comparación como: JZ (JUMP IF IT ZERO, Salta si la diferencia es cero) JNZ (JUMP IF IT'S NOT ZERO, Salta si la diferencia no es cero) y JC (JUMP IF CARRY, Salta si tenemos acarreo).

.model small
.stack
.data        
include "emu8086.inc"
    num1 db 8
    num2 db 9   
    msg1 db "NUMEROS IGUALES $" 
    msg2 db "NUMERO 1 MAYOR $"
    msg3 db "NUMERO 2 MAYOR $"
.code
    main:
        mov ax,@data
        mov ds,ax
        
        mov al,num1
    
        cmp al,num2
    
        jc mayor2   ;Salta si hay acarreo.
        jz igual    ;Salta si es igual o salta si es cero.
        jnz mayor1  ;Salta si no es igual o salta si no es cero.
.exit            


igual:
    MOV AH,09H
    LEA DX, MSG1
    INT 21H   
    jmp mfinal
 .EXIT
 
 mayor1:
    mov ah,09h
    lea dx,msg2
    int 21h   
    jmp mfinal
 .exit
 
 mayor2:
    mov ah,09h
    lea dx,msg3
    int 21h   
    jmp mfinal
.exit         

mfinal:
     gotoxy 5,4
     print "ejecucion terminada" 
.exit

END  
;https://www.youtube.com/watch?v=Ng4YEb2Jtcg 
;http://moisesrbb.tripod.com/unidad5.htm#u517    
;prox https://www.youtube.com/watch?v=CZyk7j3FVYw
;prox https://www.youtube.com/watch?v=llCG44dzPQM

Resultado:

En este caso debería imprimir "Numero 2 Mayor", dado que 9 es mayor a 8, te reto a modificar el programa para que imprima los otros 2 mensajes.




Comentarios