You are on page 1of 6

uso de ciclos en masm

los sgtes ejemplos fueron hecho con masm32 version 6.14:


la instruccion que hace los ciclos en asm es loop.
esta trabaja en conjunto con una etiqueta.
ejemplo:
etiqueta1:
....
....
loop etiqueta1
pero para que funcione debemos declara en el registro contador cx un valor
digamos 5 entonces este bucle se ejecuta 5 veces cx va decreciendo de uno en uno
.
mov cx,5
etiqueta1:
...
loop etiqueta1.
veamos un ejemplo:
----------------------------;modelo
.model small
.data
numero1 dw 5
num2 dw 6
.code
.386
.startup
mov ax,0
mov dx,0
mov cx,numero1 ;ponemos a cx con el valor 5
repite:
mov ax,num2
;ax vale 6 en el primer ciclo
add dx,ax
;agrego el valor de ax=6 a dx,segundo ciclo dx=6 le sumo 6 mas=C
y asi hasta terminar el ciclo
loop repite
;llamo a la etiqueta repite y loop por defecto decrementa cx en
uno
.exit
end
---------------------------------------------------;ejemplo que repite el texto de la variable nombre
; 5 veces
.model small
.data
nombre db 10,13,'mi nombre es edgar$'
num1 dw 5

.code
.386
.startup
mov cx,num1
repite:
mov
mov
int
mov
int

ah,9h
dx,offset nombre
21h
ah,10h
16h

loop repite
.exit
end
--------------------------------------;repite 5 veces y al final sale otro mensage y termina programa
;modificacion del anterior
.model small
.data
nombre db 10,13,'mi nombre es edgar$'
num1 dw 5
fin1 db 10,13
db 10,13, 'fin del ciclo,chao$'
.code
.386
.startup
mov cx,num1
repite:
mov
mov
int
mov
int

ah,9h
dx,offset nombre
21h
ah,10h
16h

loop repite
mov
mov
int
mov
int

ah,9h
dx,offset fin1
21h
ah,10h
16h

.exit
end
---------------------------------------ejemplo simple del uso repeticiones de ciclos

pero usando las instruciones de salto je-->si es iguAL a salta


jne si es dif salta muy importate es otra instruccion que compara
cmp.
uso bx para incrementar ya que cx siempre se decrementa con la instrupcion loop
je===jz
jne==jnz
veamos un ejemplo simple:
data segment
; add your data here!
pkey db "fin de ciclo$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
mov ax,5
mov bx,0
repite:
inc bx
;incremento bx en 1
cmp bx,ax
je hola
;si bx=ax salta hola
loop repite ;si es dif salta a repite
hola:
mov dx,25
jmp fine ;cuando llego aqui salto directo a fine
fine:
lea dx, pkey
mov ah, 9
int 21h

; output string at ds:dx

; wait for any key....


mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
-------------------------------el mismo ejemplo sin loop
; multi-segment executable file template.

data segment
; add your data here!
pkey db "edgar albo$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
mov ax,5
mov bx,0
repite:
cmp bx,ax
je hola ;igual salta a hola
jne increment ;dif salta a incrementa
hola:
mov dx,25
jmp fine ;si llega aqui salta a fine
increment:
inc bx
jmp repite
fine:
lea dx, pkey
mov ah, 9
int 21h

; output string at ds:dx

; wait for any key....


mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.
--------------------igual pero modificado:
--------------mov ax,5
mov bx,0
repite:
inc bx
cmp bx,ax
je hola
jne repite

hola:
mov dx,25
jmp fine
fine:
...
...
el mismo ejemplo sin loop pero usando cx y trabaja bien
recuerde cx es el registro que se usa como contador pero con loop cx se decremen
ta
es el mismo codigo de arriba solo cambie bx por cx.
-------------------------otro simple sin loop con uso de jnz o jne si es dif salta
aqui puedo uasr bx o cx
mov bx,3
mov ax,1

;bx como contador con valor 3

repite:
add
dec
cmp
jnz

ax,1
bx
bx,0
repite

le sumo 1 a ax ,al final ax=4


;se decrementa bx en 1
;comparo bx con o
;si es dif de 0 salta a repite

*-------------------------hay una instruccion interesante que es jcxz que significa si cx =0 salta


esta lo hace automaticamente veamos.
mov cx,3
mov ax,1
repite:
add ax,1
dec cx
jcxz fine
cmp cx,0
jnz repite
fine:
mov ax, 4c00h ; exit to operating system.
int 21h
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------instrucciones de multiplicacion y divicion
------------------------------------------mul-->multiplicacion de numeros sin signos
imul-->multiplicacion de numeros con signos

- MUL (multiplicacin de datos sin signo).


Sintaxis: MUL operando.
Realiza la multiplicacin del operando dado, con el acumulador.
Dependiendo del tamao del operando introducido en la operacin, el
procesador toma AL o AX como segundo operando.
* Operando de tipo byte: El procesador asume que el otro operando se
encuentra almacenado en el registro AL, y el resultado de la operacin
lo deposita en el registro AX.
* Operando de tipo palabra: El procesador asume que el otro operando est
almacenado en el registro AX, y el resultado de la operacin lo depositar
en el par de registros DX,AX. Teniendo DX la parte ms significativa de
mayor peso del resultado.
The first number MUST be
in AL for the byte operation or in AX for the word operation. The
second number may be a register or a memory location (but not a
constant)

You might also like