Primer programa para entender como utilizar los registros:
ORG 100h mov ax, 10 ;AX=10 mov bx, 00F9h ;BX=0xF9 inc bx ;BX++ add ax, 4 ;AX=AX+4 mov cx,45 ;CX=45 sub cx,cx ;CX=CX-CX ret
Utilizar Loop:
ORG 100h MOV CX, 5 MOV BX, 1 MOV DL, 2 comienzo: MOV AX, BX MUL DX MOV BX, AX LOOP comienzo RET
Potencia:
name "potencia" ;8 chars DOS org 100h ;counter to 100h mov cx, num2 mov ax, num1 inicio: mov bx,num1 mul bx ;ax = ax * bx loop inicio ;c-- mov num3,ax ;copiamos el resultado ret ;Variables "db" para byte y "dw" para word num1 dw 0Ah num2 dw 03h num3 dw 0h
Raiz cuadrada:
org 100h siguiente: inc r mov ax, r mul ax cmp ax, m jbe siguiente ;(r*r) MENOR O IGUAL a m dec r ret ;Variables m dw 146 r dw 0 ;Al final debe ser r=sqrt(m).
Arreglos:
name "arreglo" org 100h ;un areglo se puede acceder a travez de [] mov cx, 9 ;cuantos elementos voy a recorrer, empezamos con el 9 inicio: mov si, cx mov dl, v[si] cmp dl, mayor jng siguiente: mov mayor,dl siguiente: loop inicio ret v db 1,32,64,32,98,12,5,21,91,38 mayor db 0
Saber si un numero es mayor:
name "mayor" mov AX, 5 mov BX, 5 ;mov DX, AX ;CX el valor más grande entre AX Y BX ;AX-BX mayor a 0 sub AX,BX js A_MENOR_B mov CX,AX jmp FIN A_MENOR_B: mov CX,BX FIN: ;mov AX,DX ret
Multiplicacion:
ORG 100h MOV AL, 200 ; AL = 0C8h MOV BL, 4 MUL BL ; AX = 0320h (800) RET
Interrupciones (Ejemplo de 21h):
name "int01" org 100h mov ah, 1 ;Leer un caracter de la entrada estandar int 21h ;Llamada al sistema operativo (DOS) mov tecla, al mov ah, 2 ;imprime un simbolo a la consola mov dl, simbolo ;el caracter a mostrar, en este caso la E int 21h ;Llamada al DOS inc tecla mov ah, 7 ;NO imprime un simbolo a la consola mov dl, tecla ; int 21h ;Llamada al DOS ret ;Variables tecla db 0 simbolo db 45H ;ah que queres hacer ;ah = 1 guarda caracter en al ;ah = 2 escribe un caracter en la consola. El ascii del cacacter a imprimir se pone el dl ;AH = 7 es igual a el ah=2 pero el resultado no se ve en pantalla ;ah = 9 imprime una cadena en la consola. Considera el caracter $ como fin de cadena. ;La direccion de la cadena se expresa en DX
Cadenas:
org 100h mov msg[2], 34H mov dx, offset msg mov ah, 9 int 21h ret msg db "hello world $"
Cambiar a mayúsculas:
name "int02" ORG 100H lectura: mov ah,7 int 21h mov tecla, al cmp al,13 jz fin: cmp tecla, 122 ;si tecla es mayor a 122 entonces ir a fin3 (tecla > 122) ja fin3 cmp tecla,96 ;si tecla no es mayor a 96 ir a fin3 (tecla <= 96) jng fin3 sub tecla, 32 ;si es 'a' hasta 'z' entonces restarle 32 fin3: mov ah,2 mov dl,tecla int 21h jmp lectura fin: ret tecla db 0
Procedimientos:
org 100h mov bx, 5h mov ax, 10h call inicializar inc ax ret inicializar PROC MOV ax, 1234h ret inicializar ENDP
Archivos:
org 100h mov al, 0 ;modo de acceso para abrir arhivo, modo lectura/escritura mov dx, offset archivo ;offset lugar de memoria donde esta la variable mov ah, 3dh ;se intenta abrir el archivo int 21h ;llamada a la interrupcion DOS jc error ; si se prendio la bandera c ir a error mov handle, ax ;si no paso mover a lo que le dio el SO jmp leer error: ; .... ;leer archivo leer: mov bx, handle mov cx, 5 mov dx, offset leido mov ah, 3fh int 21h ;cerramos archivo mov bx, handle mov ah, 3eh int 21h ;imprimir el contenido de leido mov dx, offset leido mov ah, 9 int 21h ret archivo db "C:\prueba.txt", 0 ;ascii del nombre del archivo leido db "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" handle dw ? ;identificador del arhivo
Interrupción 13h (Gráficos)
mov cx,1 mov al, 13h mov ah, 0 int 10h ; set graphics video mode. bucle1: mov dx, cx mov al, color ;AL = pixel color mov ah, 0ch ;Change color for a single pixel int 10h ;set pixel cmp cx, 101 ;llegar hasta 100 x 100 (va en diagonal) jz fin inc cx ;DX = row. add color, 2 ;para cambiar colores jmp bucle1 ;CX = column fin: ret color db 1