Implementación de Estructuras de Control en Código Ensamblador
Clasificado en Informática
Escrito el en español con un tamaño de 5,17 KB
Estructuras de Control en Ensamblador
Este documento describe la implementación de estructuras de control en código ensamblador. Se presentan ejemplos de las estructuras IF, IF-ELSE, WHILE, DO WHILE y FOR.
IF
La estructura IF se utiliza para ejecutar un bloque de código condicionalmente. Si la condición es verdadera, se ejecuta el bloque de código; de lo contrario, se omite.
IF if (x>y) maxx 1;
>if: mov r1,x >cmp r1,y >jle endif >mov maxx,1 >endif:
IF-ELSE
La estructura IF-ELSE proporciona una alternativa cuando la condición es falsa. Si la condición es verdadera, se ejecuta el primer bloque de código; de lo contrario, se ejecuta el segundo bloque.
IF-ELSE if(x>y) max=x; else max=y
if: mov r1, x > mov r2, y > cmp x, y > jle else > mov max, r1 > jmp endif > else: mov max, r2 > endif:
WHILE
La estructura WHILE ejecuta un bloque de código repetidamente mientras una condición sea verdadera.
WHILE while(num > 0){i = i*num;num = num 1;}resul = i;
mov r1, i > mov r2, num > while: cmp r2, 0 > jle end_w > mul r1, r2 > sub r2, 1 > jmp while > end_w: mov resul, r1 > mov i, r1 >
DO WHILE
La estructura DO WHILE es similar a la estructura WHILE, pero la condición se evalúa después de ejecutar el bloque de código al menos una vez.
DO WHILE: do {sum = sum + i;i = i + 1} while (i <= valor);
mov r1, i > do: add sum, r1 > add r1, 1 > cmp r1, valor > jle do > mov i, r1
FOR
La estructura FOR proporciona una forma concisa de ejecutar un bloque de código un número específico de veces.
FOR for (i=0; i<=valor; i++) sum = sum + i;
mov r1, 0 > for: add sum, r1 > add r1, 1 > cmp r1, valor > jle for > mov i, r1
Ejemplos Adicionales
CheckEnd
Verificar si se han marcado todas las minas y descubierto todas las casillas. Cambiar el estado a 2 (Gana la partida) si es así.
- Parámetros de entrada: Ninguno
- Parámetros de salida: Ninguno
- Es llamada por:
- Llama a:
CheckEnd:
push si
mov si,0 ;indice para acceder a los datos.
;Iniciamos el bucle para contar los espacios en blanco.
cmp NumMines,0 ;Miramos si hemos colocado todas las minas.
jg EndCheckend
LoopCE:
cmp Marks[SI],' '
je EndCheckEnd ;Si es un espacio en blanco no hemos terminado.
inc si ;incrementamos el indice para acceder a los datos
cmp si, 81
jl LoopCE
mov State,2 ;si hemos mirado todas las casillas y no hay ningun espacio
;en blanco, significa que hemos abierto todas las casillas.
ShowDigits
Convertir un valor decimal (entre 0 y 99) en dos caracteres ASCII. Dividir el valor entre 10, el cociente representa las decenas y el residuo las unidades, luego convertir a ASCII. Mostrar los 2 dígitos ASCII en la posición de pantalla indicada.
- Parámetros de entrada: valor [bp+6] y posición (fila,columna) [bp+4]
- Parámetros de salida: Ninguno
- Es llamada por:
- Llama a:
ShowDigits:
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push di
mov dx, [bp+4] Ponemos en dh la fila y en dl la columna donde escribiremos
mov ax, [bp+6] Ponemos en al el valor que queremos mostrar.
mov ah, 0
calcular ASCII de unidades y decenas
cmp ax,100
jl convert
mov ax,99
Convert:
mov bl,10
div bl cocient en al y residu en ah
add ah,'0' convertimos los valores a ASCII
add al,'0'
mov di, ax guardamos los caracteres en di Mostrar Digitos
Posicionamos el cursor
mov bh,00h pagina
mov ah,02h servicio para posicionar el cursor
int BIOSSERVICE Fijamos el atributo de color.
mov bl,07h atributo de color: fodo negro y color blanco mostrar 1er caracter ASCII
mov ax,di cogemos el 1er caracter
mov bh,00h pagina
mov cx,1
mov ah,09h servicio para escribir el caracter.
int BIOSSERVICE movemos una posición el cursor
add dl,1 nos ponemos en la siguiente posición
mov bh,00h pagina
mov ah,02h servicio para posicionar el cursor
int BIOSSERVICE mostrar 2o caracter ASCII
mov ax,di recuperamos los caracteres de di
mov al,ah cogemos el 2º caracter
mov bh,00h pagina
mov cx,1
mov ah,09h servicio para escribir el caracter.
int BIOSSERVICE
EndShowDigits:
pop di
pop dx
pop cx
pop bx
pop ax
pop bp
ret