Ejemplos Sobre Instrucciones de Salto
Ejemplos Sobre Instrucciones de Salto
Ejemplos Sobre Instrucciones de Salto
;**********************************************************
; MAYOR3.ASM
;
; Este programa encuentra el mayor de tres datos signados
; almacenados en variables de una palabra. El pseudocódigo
; de este programa es:
;
; AX = dato1
; if(AX > dato2) goto sigcmp
; AX = dato2
;
; sigcmp:
; if(AX > dato3) goto fincmp
; AX = dato3
;
; mayor = AX
;**********************************************************
1
;****** CÓDIGO DE INICIO **********************************
ideal
dosseg
model small
stack 256
;****** VARIABLES DEL PROGRAMA ****************************
dataseg
codsal db 0
dato1 dw ?
dato2 dw ?
dato3 dw ?
mayor dw ?
;****** CÓDIGO DEL PROGRAMA *******************************
codeseg
inicio:
mov ax, @data ; Inicializa el
mov ds, ax ; segmento de datos
mov ax, [dato1] ; AX = dato1
cmp ax, [dato2] ; if(AX > dato2)
jg sigcmp ; goto sigcmp
mov ax, [dato2] ; AX = dato2
sigcmp: cmp ax, [dato3] ; if(AX > dato3)
jg fincmp ; goto fincmp
mov ax, [dato3] ; AX = dato3
fincmp: mov [mayor], ax ; mayor = AX
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
;****** CÓDIGO DE TERMINACIÓN *****************************
end inicio
2
;****** CÓDIGO DE INICIO **********************************
ideal
dosseg
model small
stack 256
;****** VARIABLES DEL PROGRAMA ****************************
dataseg
codsal db 0
nfinal dw ?
suma dw ?
;****** CÓDIGO DEL PROGRAMA *******************************
codeseg
inicio:
mov ax, @data ; inicializa el
mov ds, ax ; segmento de datos
xor ax, ax ; AX = 0
mov cx, [nfinal] ; CX = nfinal
while: jcxz endwhi ; while(CX > 0)
; {
add ax, cx ; AX += CX
dec cx ; CX--
jmp while ; }
endwhi:
mov [suma], ax ; suma = AX
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
end inicio
Instrucciones Repetitivas
El ensamblador del 8086 posee tres instrucciones especiales que permiten la construcción de
ciclos.
Esta instrucción decrementa el contenido del registro CX en uno, si el valor que queda en CX es
diferente de cero, entonces la instrucción salta a la dirección especificada por etiqueta, la cual no
debe encontrarse más allá de los 126 bytes hacia atrás o de los 127 bytes hacia adelante.
3
Esta instrucción se utiliza para crear ciclos que se repiten el número de veces especificado por el
registro CX. Como la instrucción loop decrementa CX antes de probar si vale cero. Si CX vale
cero al principio, al decrementar CX tomará el valor de 65535 y por lo tanto el ciclo ejecutará
65536 veces. Para prevenir esto preceda el ciclo con la instrucción jcxz como se muestra en el
siguiente código.
Sintaxis:
loope | loopz etiqueta
Los mnemónicos loope y loopz representan la misma instrucción. Esta instrucción decrementa el
contenido del registro CX en uno, si el valor que queda en CX es diferente de cero y la bandera
de cero Z vale 1, presumiblemente puesta por una comparación previa, entonces la instrucción
salta a la dirección especificada por etiqueta, la cual no debe encontrarse más allá de los 126
bytes hacia atrás o 127 bytes hacia adelante.
Sintaxis:
loopne | loopnz etiqueta
Los mnemónicos loope y loopz representan la misma instrucción. Esta instrucción decrementa el
contenido del registro CX en uno, si el valor que queda en CX es diferente de cero y la bandera
de cero Z vale 0, presumiblemente puesta por una comparación previa, entonces la instrucción
salta a la dirección especificada por etiqueta, la cual no debe encontrarse más allá de los 126
bytes hacia atrás o 127 bytes hacia adelante.
4
Ejemplo sobre instrucciones repetitivas
El siguiente programa es una modificación del ejemplo 2 sobre las instrucciones de salto. Suma
los números enteros desde 1 hasta n final.
;*************************************************************
; SERIE2.ASM
; Este programa suma los números enteros de 1 hasta nfinal.
; Esta versión utiliza la instrucción repetitiva loop. El
; pseudocódigo de este programa es:
; AX = 0
; CX = nfinal
; if(CX == 0) goto endo
; do
; {
; AX += CX
; } while(--CX > 0)
; enddo:
; suma = AX
;*************************************************************
;****** CÓDIGO DE INICIO *************************************
ideal
dosseg
model small
stack 256
;****** VARIABLES DEL PROGRAMA *******************************
dataseg
codsal db 0
nfinal dw ?
suma dw ?
;****** CÓDIGO DEL PROGRAMA **********************************
codeseg
inicio:
mov ax, @data ; Inicializa el
mov ds, ax ; segmento de datos
xor ax, ax ; AX = 0
mov cx, [nfinal] ; CX = nfinal
jcxz endo ; if(CX == 0) goto endo
do: ; do{
add ax, cx ; AX += CX
loop do ; } while(--CX > 0)
enddo:
mov [suma], ax ; suma = AX
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
end inicio
5
ALPS