Ensamblador
4
Vamos a ver diferentes ejemplos de instrucciones para entenderlas un poco mejor. Será bueno tener
un libro al lado para saber qué hace cada instrucción.
- Ejemplo de las instrucciones: CBW y CWD
;------------------------------------------------------------------------------
;Definicion del segmento de pila
;------------------------------------------------------------------------------
PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code, SS:pila
START:
mov ah,3 ;No sirve para nada, solo para ver que al convertir
;en palabra o doble palabra se machacan los registros
mov al,5
cbw ;Convertir un byte en palabra
cwd ;Convertir una palabra en doble palabra
neg al ;al pasa a ser un numero negativo (complemento a 2)
mov ah,4 ;basura, igual que en caso anterior
cbw ;Convertir un byte en palabra
cwd ;Convertir una palabra en doble palabra
mov ax,4C00h
int 21h
CODE ENDS
END START
- Ejemplo de la instruccion: AAM (ajuste ASCII en multiplicación)
;------------------------------------------------------------------------------
; Programa que prueba la instruccion: AAM
;
; ah <- cociente (al/10)
; al <- resto (al/10)
;
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code
START:
mov al,9
mov cl,5
mul cl ;Resultado: ax=002D
aam ;En el cociente hay un 4 y en el resto un 5
;Resultado es ax=0405
mov ax,4c00h
int 21h
CODE ENDS
END START
- Ejemplo de la instruccion: AAA (ajuste ASCII en suma)
;------------------------------------------------------------------------------
; Programa que muestra el uso de la instruccion AAA. Esta instruccion convierte
; el contenido de AL en un numero decimal ASCII (desempaquetado) tras una
; instruccion de suma. Se utiliza para ajustar el resultado despues de una suma
; de dos numeros decimales en formato ASCII
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;Definicion del segmento de pila
;------------------------------------------------------------------------------
PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code,SS:pila
START PROC
mov ax,8 ;
add al,1 ;
aaa ;AX=0009h
mov ax,8 ;
add al,2 ;
aaa ;AX=0100h
mov ax,11110001b ;
add al,1 ;
aaa ;AX=0002h
mov ax,8 ;
add al,7 ;
aaa ;AX=0105h
add al,4 ;
aaa ;AX=0109h
add al,9 ;
aaa ;AX=0208h
mov ax,4C00h ;
int 21h ;Terminar el programa
START ENDP
CODE ENDS
END START
- Ejemplo de la instruccion: AAA (ajuste ASCII en suma). Del examen de ETCII
del año 2001:
;------------------------------------------------------------------------------
; Programa que prueba la instruccion: AAA
;
; ah <- cociente (al/0Ah)
; al <- resto (al/0Ah)
;
;------------------------------------------------------------------------------
; Ejercicio: examen ETCII - 7/11/01
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code
start:
mov ax,16h
mov bx,191h
add ax,bx
aaa ;AX=0107h
add ax,7h
aaa ;AX=0204h
mov ax,4c00h
int 21h
CODE ENDS
END START
- Ejemplo que muestra la diferencia entre las instrucciones: AAA y DAA
;------------------------------------------------------------------------------
; Programa que prueba las instrucciones: AAA y DAA
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;Definicion del segmento de pila
;------------------------------------------------------------------------------
PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code, SS:pila
START:
mov al,5
add al,7
aaa ;Ajuste BCD no empaquetado
xor ax,ax
mov al,5
add al,7
daa ;Ajuste BCD empaquetado
mov ax,4C00h
int 21h
CODE ENDS
END START
- Ejemplo de la instrucción NEG (convertir a complemento a 2):
;------------------------------------------------------------------------------
;Definicion del segmento de pila
;------------------------------------------------------------------------------
PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code, SS:pila
START:
mov al,8
neg al ;Convertir a su complemento a 2
mov ax,4C00h
int 21h
CODE ENDS
END START
- Otra forma de convertir a complemento a 2 mediante las instrucciones NOT e INC:
;------------------------------------------------------------------------------
;Definicion del segmento de pila
;------------------------------------------------------------------------------
PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;------------------------------------------------------------------------------
;Definicion del segmento de codigo
;------------------------------------------------------------------------------
CODE SEGMENT
assume CS:code, SS:pila
START:
mov al,8
not al ;
inc al ;Convertir a su complemento a 2
mov ax,4C00h
int 21h
CODE ENDS
END START
|
|