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 200 .AX jmp FIN A_MENOR_B: mov CX.mov AX. AX = 0320h (800) RET Interrupciones (Ejemplo de 21h): name "int01" org 100h . AX .5.21.32.32. 5 .38 mayor db 0 Saber si un numero es mayor: name "mayor" mov AX.CX el valor más grande entre AX Y BX .AX-BX mayor a 0 sub AX. 4 MUL BL .98.DX ret Multiplicacion: ORG 100h MOV AL.12.BX js A_MENOR_B mov CX.91.64. AL = 0C8h MOV BL.v db 1.BX FIN: . 5 mov BX.mov DX. Variables tecla db 0 simbolo db 45H . 9 int 21h ret msg db "hello world $" . 7 . al mov ah.el caracter a mostrar. 1 .La direccion de la cadena se expresa en DX Cadenas: org 100h mov msg[2]. en este caso la E int 21h .imprime un simbolo a la consola mov dl.ah = 9 imprime una cadena en la consola. 2 .mov ah.NO imprime un simbolo a la consola mov dl.ah = 1 guarda caracter en al . simbolo .ah = 2 escribe un caracter en la consola.AH = 7 es igual a el ah=2 pero el resultado no se ve en pantalla .Leer un caracter de la entrada estandar int 21h .ah que queres hacer . tecla . El ascii del cacacter a imprimir se p one el dl . offset msg mov ah. . Considera el caracter $ como fin de ca dena.Llamada al DOS ret . int 21h . 34H mov dx.Llamada al sistema operativo (DOS) mov tecla.Llamada al DOS inc tecla mov ah. 5h mov ax.tecla int 21h jmp lectura fin: ret tecla db 0 Procedimientos: org 100h mov bx.7 int 21h mov tecla.2 mov dl.Cambiar a mayúsculas: name "int02" ORG 100H lectura: mov ah.si tecla no es mayor a 96 ir a fin3 (tecla <= 96) jng fin3 sub tecla.13 jz fin: cmp tecla.96 . 10h call inicializar inc ax ret .si es 'a' hasta 'z' entonces restarle 32 fin3: mov ah.si tecla es mayor a 122 entonces ir a fin3 (tecla > 122) ja fin3 cmp tecla. 32 . 122 . al cmp al. 3eh int 21h .inicializar PROC MOV ax.. handle mov ah.modo de acceso para abrir arhivo.llamada a la interrupcion DOS jc error . handle mov cx..imprimir el contenido de leido . offset leido mov ah. si se prendio la bandera c ir a error mov handle. .leer archivo leer: mov bx. 1234h ret inicializar ENDP Archivos: org 100h mov al..offset lugar de memoria donde esta la variable mov ah. ax .se intenta abrir el archivo int 21h . 0 . modo lectura/escritura mov dx. 3dh . 5 mov dx.si no paso mover a lo que le dio el SO jmp leer error: . 3fh int 21h . . offset archivo .cerramos archivo mov bx. bucle1: mov dx.identificador del arhivo Interrupción 13h (Gráficos) mov cx. 13h mov ah. 9 int 21h ret archivo db "C:\prueba. 2 . color . 0 .para cambiar colores jmp bucle1 .txt". x mov al.ascii del nombre del archivo leido db "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" handle dw ? . 0 int 10h .CX = column fin: ret color db 1 Ejercicio 1: Escribir un código que verifique si dos cadenas son iguales org 100h comienzo: mov si. mov dx. add color. 0ch . 101 .set pixel cmp cx. msg2[si] . set graphics video mode. cx mov al.llegar hasta 100 x 100 (va en diagonal) jz fin inc cx . offset leido mov ah.Change color for a single pixel int 10h .DX = row.AL = pixel color mov ah.1 mov al. comparar letra por letra las cadenas. offset msg3 mov ah.si es el final y el programa llega aca. 1 . 9 int 21h fin: ret msg db "hello world $" msg2 db "hello world $" msg3 db "Son iguales $" x dw 0 Ejercicio 2: Escribir un código que verifique si una cadena es subcadena de otra. quiere decir que son i guales jz final: inc x loop comienzo final: mov dx. al .cmp msg[si]. al . La cadena: “233” es subcadena de la cadena “2122432234” org 100h mov si.comparar si encuentra la primera letra de la cadena jne seguir mov di.poner en 1 di comprobar: mov al. msg2[0] .si es el fin de la cadena mandar a final jz final cmp msg[si].copiar la primera letra de la palabra a al cmp msg[si]. Por ejemplo: “la Mu” es subcadena de “Hola Mundo”. 0 ."$" .ponemos si en 0 comienzo: mov al. si uno no coincide manda directamente a fin y termina el programa jne fin: cmp msg[si]. "$" . msg2[di] . comparar con la cade na jne seguir .bucle principal para recorrer palabra resultado: mov dx.si es el fin de la cadena mandar a final jz resultado . Por ejemplo: todas las letras de la cadena “casa” se encuentran en “escaso”.posicion de la letra coincidente + di.incrementar di para seguir recorriendo cadena cmp msg2[di].bucle para recorrer cadena seguir: inc si ."$" . mov bx.si es el fin de la cadena y el programa llego aca quiere deci r que la cadena es parte de la palabra jz resultado loop comprobar . al ."$" . offset msg3 .copiar msg3 a dx mov ah.ponemos si en 0 comienzo: cmp msg[si]. Pero no todas las letras de “cerro” se en cuentran en “recanate” org 100h mov si.para seguir recorriendo la palabra loop comienzo .mostrar contenido en dx final: ret msg db "Hola Mundo$" msg2 db "ola$" msg3 db "Si es subcadena$" Ejercicio 3: Escribir un código que verifique que todas los caracteres de una cadena se encuentran en otra. 0 .si no coincide mandar a seguir inc di . 9 .preparar ah con 9 para la interrupcion 21h int 21h . di cmp msg[si+bx]. 1 int 21h . 9 .poner en 0 di comprobar: mov al. sin utilizar una variable auxiliar.incrementar di para seguir recorriendo cadena cmp msg2[di].copiar msg3 a dx mov ah. 0 . "$" . entonces ya termina el programa jz final loop comprobar .comparar msg con su posicion con al jz seguir .mostrar contenido en dx final: ret msg db "cerro$" msg2 db "recanate$" msg3 db "Si se encuentran todos los caracteres$" Ejercicio 4: Escribir una programa que reciba una cadena ingresada por teclado. al . terminada en ENTER. mov di.bucle para recorrer seguir: inc si .bucle principal para recorrer palabra resultado: mov dx.para seguir recorriendo la palabra loop comienzo . msg2[di] . ORG 100H mov si.si es que llega al final y no encontro coincidencia.copiar msg2 con su posicion a al cmp msg[si].si se encuentra entonces continua inc di . offset msg3 . 0 lectura: mov ah.preparar ah con 9 para la interrupcion 21h int 21h . Luego que elimine todos los caracteres que no son dígitos. 47 .si tecla no es mayor a 47 ir a fin3 (tecla <= 47) jng fin3 mov bx[si].13 jz resultado: cmp al.incrementa si fin3: jmp lectura resultado: mov ah. al .00h . 9 . 0 mov al. "$" mov dx.03h int 10h mov bx[si]. "$" .si tecla es mayor a 57 entonces ir a fin3 (tecla > 57) ja fin3 cmp al. offset bx mov ah.limpia la pantalla mov al.si es un digito entonces guardo en bx inc si .mostrar contenido en dx ret Ejercicio 5: Escribir un programa que tome una cadena que representa un número decimal y escriba su equivalente octal org 100h .preparar ah con 9 para la interrupcion 21h int 21h . 0 cadAnum: cmp cad[si]. cmp al. 57 . inicio de programa mov si. mostrar contenido en dx ret cad db "64$" oct db 0 Ejercicio 6: Escribir un programa que tome tres cadenas. 9 . offset res . por ejemplo: “329”.preparar ah con 9 para la interrupcion 21h . jz seguir mov bl. si mov si. 8 pasar: div bl . cad[si] inc si loop cadAnum seguir: mov cx. la primera y la tercera representan un número y la segunda una operación. '0' add al.dividir al con bl mov oct[si]. al final: . ah .copiar a la cadena oct el resultado sobrante de la division inc si .int 21h .mov dx.incrementar si loop pasar fina: cmp ah. “-“. 10 mul bl sub cad[si]. 0 mov bl.mov ah. 0 jnz final mov oct[si]. “21” e imprima el resultado “308” . '0' . DEFINE_PRINT_STRING DEFINE_PRINT_NUM DEFINE_PRINT_NUM_UNS mov si.org 100h .Convertir segunda cadena a numero mov si. cad1[si] inc si loop cadAnum seguir: mov aux1.inc' . 10 mul bl sub cad1[si]. 10 mul bl sub cad3[si]. 0 cadAnum2: cmp cad3[si]. al . 0 . inicio de programa include 'emu8086.Convertir primera cadena a numero cadAnum: cmp cad1[si]. 0 mov al. "$" jz seguir mov bl. 0 mov al.Incluye funciones de libreria emu8086 . DEFINE_SCAN_NUM . "$" jz seguir2 mov bl. '0' add al. 09 . "*" jz multi cmp cad2. "+" jz suma cmp cad2. cad3[si] inc si loop cadAnum2 seguir2: mov bl.realizar operaciones normalmente teniendo ya los dos numeros decimales cmp cad2. al mov al. aux1 . "-" jz resta cmp cad2. bl jmp fin suma: add al. bl jmp fin multi: mul bl jmp fin divi: div bl jmp fin fin: mov bx. add al. ax mov ah. "/" jz divi resta: sub al. 'X' mov bh. name "keybrd" org 100h . and print keys: wait_for_key: .============================ . keyboard buffer: mov dh. pos mov bh.0 mov bl. print a welcome message: mov dx.Movemos el cursor mov al. 0 mov ah.lea dx. 2 int 10h . offset msg mov ah. bx call PRINT_NUM ret cad1 db "10$" cad2 db "-" cad3 db "2$" aux1 db ? aux2 dw ? msg dw "El resultado es: $" Ejercicio 7: Escribir un programa que imprima X en la pantalla hasta que se presiones ESC. check for keystroke in .1 .msg int 21h mov ax. 9 int 21h . eternal loop to get . pos mov dl. .".".. 0Dh.0Ah db "[Ctrl]+[Enter] .0Ah db "[Enter] .============================ exit: ret msg db "Type anything.".0Ah. 0 int 16h .1 mov ah. (remove from the buffer) mov ah.0Ah db " when buffer is overflown.0Ah db "You may hear a beep". press 'esc' to exit: cmp al.Imprimimos una x int 10h mov ah. 0Dh. 0Dh. 1bh jz exit jmp wait_for_key . 0Dh. "$" pos db 1 end Ejercicio 8: Escribir un programa que ordene un vector de mayor a menor.". 0Dh.09h inc pos .line feed. mov cx.".carriage return. 0eh int 10h . print the key: mov ah. name "arreglo-mayor" org 100h . 0Dh. get keystroke from keyboard: . 1 int 16h jz wait_for_key .0Ah db "Press Esc to exit. inicializar variable cont en 1 bucle: mov ah.v[bx-1] jnge seguir . 9 bucle2: mov si.Copiar dh en v[8] seguir: loop bucle2 mov cx. cx mov cx. dl .Copiar v[8] en dl mov v[bx-1].Copiar dl en v[7] mov v[si-1]. Programa que calcula el MCD y MCM de dos numeros decimales (soporta numeros de 8 bits o 1 byte) mov cont.mov cx.32. cx mov ah. v[bx-1] . cx mov bx. 8 bucle1: mov c.cont mov bl.64.0 mov al.32.Copiar v[7] en dh mov dl. dh . v[si-1] .98. v[si-1] cmp ah.12.21. c loop bucle1 ret v db 2.5.Si v[8] < v[7] no hacer nada.1 .91 c dw 0 Ejercicio 9: Escribir un programa que halle el MCM Y MCD . sino: mov dh.nro1 div bl . si el nro1 y el nro2 son multiplos del contador mov al. dividir por el MCM de nro1 y nro2 y tenemos el MCD mov bl.incrementar el contador jmp bucle .0 .si el resto de la division del contador con el nro1 es igual 0 je parte1 bc: inc cont .una vez que tengamos el MCM primero multiplicar nro1 * nro 2 mov al.compara si el resto de la division del contador con el nro2 es 0 je parte2 jmp bc .cont mov bl.0 .cont mov MCM.numero1 decimal .guarda el MCM jmp parte3 .en esta variable se guarda el MCM MCD db 0 .ir a final parte3: .fin del programa cont db 0 . al ret .0 mov al. cmp ah.si nro1 es multiplo del contador mov ah.si el nro2 no es multiplo del contador regresa a bucle1 parte2: .con ese resultado.nro2 div bl cmp ah. nro2 mul bl mov bl.cont = contador MCM db 0 .al .en esta variable se guarda el MCD nro1 db 48 . MCM div bl mov MCD. nro1 .bucle hasta que encuentre el MCM parte1: . 13h mov ah. add color. color . 2 .CX = column fin: ret color db 1 Ejercicio 11: Escribir un programa que lea un archivo y cuente cuantas palabras terminan con la letra a.modo de acceso para abrir arhivo. 3dh .Change color for a single pixel int 10h .numero2 decimal Ejercicio 10: Escribir un programa que dibuje una diagonal en la pantalla. offset archivo .llegar hasta 100 x 100 (va en diagonal) jz fin inc cx . mov cx.nro2 db 60 .llamada a la interrupcion DOS jc error .set pixel cmp cx. bucle1: mov dx.se intenta abrir el archivo int 21h .offset lugar de memoria donde esta la variable mov ah. modo lectura/escritura mov dx. 0 int 10h .para cambiar colores jmp bucle1 . 0ch . cx mov al.AL = pixel color mov ah. set graphics video mode. 101 . si se prendio la bandera c ir a error .1 mov al. name "archivo3" org 100h mov al. 0 .DX = row. " " .si no paso mover a lo que le dio el SO jmp leer error: . handle mov cx. 3fh int 21h cmp ax. 0 . leido[0] cmp dl.comparar si es espacio jz mostrar .ax queda en 0 cuando llega a EOF jz FIN ..si es 0 entonces va a fin para cerrar archivo ..si es espacio entonces ir a mostrar jmp abajo . "a" .compara si el anterior es a jnz abajo inc cont . offset leido mov ah.si no es espacio entonces ir a abajo mostrar: cmp aux.leer archivo leer: mov bx.guardar en aux lo que hay en dl para comparar en la proxima vuelta . .mov handle. 1 mov dx.si es a entonces incrementar contador abajo: mov aux. .Detectar palabras que terminan con a mov dl. ax .. dl . txt". 3eh int 21h ret archivo db "C:\prueba. 0 . jmp leer FIN: .cerramos archivo mov bx.identificador del arhivo aux db "$" cont db 0 .ascii del nombre del archivo leido db "$" handle dw ? . handle mov ah.
Report "Primer programa para entender como utilizar los registros.docx"