Sie sind auf Seite 1von 8

ste programa sumar 1000 + 2000 y volcar el resultado en AX En DOS, en el smbolo de sistema, escribir Cls y luego Debug.

g. Aparecer un guin (De sta manera se inicia el debug, con el comando Debug). Escribir "A 0100" y presionar la tecla Enter. "A" es una orden del debug que permite ensamblar instrucciones a partir de una direccin (Normalmente se empieza en la direccin 0100h), el Debug generalmente utiliza nmeros hexadecimales. Aparecer lo siguiente ("xxxx" es el segmento en donde est el programa, aparecer un nmero en ste lugar, que ser el valor de CS).

-A 0100 xxxx:0100 Escribir las siguientes instrucciones en assembler

MOV AX, 1000 MOV BX, 2000 ADD AX, BX INT 20 Presionar la tecla Enter Escribir "p 0100" (Con sta orden se ejecuta el programa y se mostrarn los sucesivos cambios de los registros). Luego aparece "el programa ha terminado de forma normal" o "Program terminated normally".

Luego (Al terminar el programa), antes del mensaje que indica el fin del programa, aparece lo siguiente (Bloque de estado): AX=3000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=XXXX ES=XXXX SS=XXXX CS=XXXX IP=0108 NV UP EI PL NZ NA PE NC 0CB3:0108 CD20 INT 20 El Debug muestra el estado de los registros antes de ejecutar la instruccin que muestra en el bloque de estado. El programa hace lo siguiente La instruccin MOV AX, 1000 ordena que AX tome el valor de 1000. La instruccin MOV BX, 2000 ordena que BX tome el valor de 2000. La instruccin ADD AX, BX ordena que AX sea sumado con BX

Por lo tanto es lgico que AX tenga el valor 3000 luego de la instruccin "ADD AX, BX", ya que se le sum a AX el valor de BX. La instruccin INT 20 ordena provocar una interrupcin que es 20h, que le cede el control a DOS, y DOS termina el programa. Una interrupcin es una interrupcin de la ejecucin de un programa para realizar una determinada tarea, a veces el control no vuelve al programa original (Por ejemplo en el caso de INT 20h en el DOS). Las interrupciones pueden ejecutarse por las circunstancias ms variadas, por ejemplo el usuario presiona una tecla y sto provoca una interrupcin y se ejecuta las instrucciones del controlador de teclado y almacena la tecla presionada, luego le devuelve el control al programa original (Con una instruccin sin operandos llamada IRET). Cuando ocurre una interrupcin se empuja a la pila CS e IP, y stos 2 registros se modifican para apuntar a la rutina deseada. Los valores de stos 2 registros estn almacenados en la tabla de vectores de interrupcin (sta est ubicada en el comienzo de la memoria en 0000:0000). Para encontrar stos 2 valores (Llamado vector de interrupcin), se multiplica el nmero de interrupcin por 4 (El offset), y se lee 4 bytes en el offset mencionado y en el segmento 0000. Los primeros 2 bytes (El primer word) del vector de interrupcin es el offset (IP), y los 2 restantes (El segundo word) es el segmento (CS). En el caso de la interrupcin 20h fue provocada por el mismo programa, para evitar interrupciones que no sean provocadas por el programa se utiliza la instruccin CLI y para luego activarlas se utiliza STI, pero no se pueden enmascarar las interrupciones menores de 8 ya que no son enmascarables. Hay que tener en cuenta que en la arquitectura x86, el microprocesador almacena en la memoria, desde los bytes menos significativos hasta los ms significativos (Si no se tiene en cuenta sto puede haber misteriosos fallos del programa que se est programando). Por lo tanto en un vector de interrupcin, el primer word (Palabra) contiene el valor que se le asignar a IP (Offset), el segundo word contiene el valor que se le asignar a CS (Segmento), cuando se provoque la interrupcin del correspondiente vector. Hola mundo ste programa mostrar "Hola mundo" en la pantalla, utilizando servicios de DOS. Se entra al Debug y se escribe lo siguiente (Sin utilizar la orden ensamblar) E 1000 'Hola mundo$' "E" significa escribir, se escribe en el segmento de datos (Indicado por DS). La sintaxis de sta orden del debug es la siguiente: E Offset '[Cadena de carcteres]' El carcter "$" que est a la derecha de la frase "Hola mundo", sirve para que el servicio de DOS que se va a utilizar para mostrar Hola mundo en la pantalla no muestre informacin ms alla del caracter que est a la izquierda del caracter '$', es decir ste caracter limitador es el fin de la cadena, es decir a partir de ste no mostrar ms caracteres. Importante: Si no finaliza la cadena con el carcter '$', al llamar al servicio de DOS para mostrar el caracter, probablemente se bloquear la PC hasta encontrar un carcter '$', inclusive puede ser que nunca lo encuentre.

A continuacin ensamblar las siguientes instrucciones (A partir de 0100h): MOV AH, 09 MOV DX, 1000 INT 21 INT 20 Luego ejecutar el ejemplo con la orden "g" El programa mostrar el mensaje "Hola mundo", luego el debug mostrar un mensaje diciendo que el programa ha terminado normalmente. Al provocar la interrupcin 21h se llama a un servicio de DOS, el nmero de servicio est determinado por la parte alta de AX (AH). El servicio 09h muestra la informacin en forma de carcteres a partir del comienzo apuntado por el registro DX (El offset, en ste caso 1000h), muestra la informacin hasta el carcter anterior al carcter '$' (Anteriormente mencionado). Luego se provoca la interrupcin 20h que finaliza el programa. La orden escribir del debug tambin acepta bytes individuales, por ejemplo: E 3000 0, BF, 5F, C4 Tambin acepta en forma mixta (Bytes individuales y cadenas de carcteres) E 3000 'JRJGOR', 0, 21, 'Ejd', 2F Es decir la orden ensamblar est acompaada del offset de los datos a escribir y de los items. Un item puede ser un byte individual o una cadena de carcteres (Que sta ltima debe estar entre simples comillas).

;este programa es una calculadora con las operaciones basicas ;suma,resta,multi y divicion, utiliza registros de 32bits ;los extendidos y puede hacer operaciones con 8 digitos .model tiny .stack .data numstr db 8 dup ('0'),'$' numstr2 db ' $' numero dd 0 posi dd 10000000,1000000,100000,10000,1000,100,10,1 opc1 opc2 opc3 opc4 opc5 opc6 salt num1 num2 res resi db db db db db db db db db db db "1.- Sumar 2 No",10,13,"$" "2.- Restar 2 No",10,13,"$" "3.- Mul. 2 No",10,13,"$" "4.- Div. 2 No",10,13,"$" "5.- Salir",10,13,"$" "Elige una opc => $" 10,13,"$" "No 1 => $" "No 2 => $" "Resultado => $" " Residuo => $"

.386 .code .startup clear_cad proto c, cad_dir:ptr byte, car:byte, count:byte write proto c, dir_cad:ptr byte writec proto c, car:byte jmp repite suma: ;sumar dos numeros ;mensaje del primer valor invoke write, addr salt invoke write, addr num1 call leer ;lee un numero mov Ebx,numero ;muevo al a bl ;mensaje del segundo valor invoke write, addr salt invoke write, addr num2 call leer ;lee otro numero add Ebx,numero ;sumo bx + numero 2 mov numero,Ebx ;respaldo ;mensaje del resultado invoke write, addr salt invoke write, addr res call mostrar ;muestra el resultado call readc jmp repite ;espero a que pecione tecla

resta:

;restar dos numeros invoke write, addr salt invoke write, addr num1 ;mensaje del primer valor call leer ;lee un numero mov Ebx,numero ;muevo al a bl invoke write, addr salt invoke write, addr num2 ;mensaje del segundo valor call leer ;lee un numero sub Ebx,numero ;sumo bl - al mov numero,Ebx invoke write, addr salt invoke write, addr res ;mensaje del resultado call mostrar ;muestra el resultado call readc jmp repite ;espero a que pecione tecla

multi:

;multiplicar dos numeros invoke write, addr salt invoke write, addr num1 ;mensaje del primer valor call leer ;lee un numero mov Ebx,numero ;muevo al a bl invoke write, addr salt invoke write, addr num2 ;mensaje del segundo valor call leer ;lee un numero mov Eax,numero mul Ebx ;sumo bl * al mov numero,Eax ;respaldo invoke write, addr salt invoke write, addr res ;mensaje del resultado call mostrar ;muestra el resultado call readc jmp repite ;espero a que pecione tecla

divide:

;divide dos numeros invoke write, addr salt invoke write, addr num1 ;mensaje del primer valor call leer ;lee un numero mov Ebx,numero ;muevo al a bl

invoke write, addr salt invoke write, addr num2 ;mensaje del segundo valor call leer ;lee un numero mov Eax,Ebx mov Ebx,numero div Ebx ;sumo bl / al mov numero,Eax ;respaldo mov Ebx,Edx invoke write, addr salt invoke write, addr res ;mensaje del resultado call mostrar ;muestra el resultado invoke write, addr resi ;mensaje de residuo mov numero,Ebx call mostrar ;muestra el residuo call readc jmp repite repite: ;ciclo principal del programa mov ah,00h mov al,03h int 10h invoke invoke invoke invoke invoke invoke write, write, write, write, write, write, ;limpiamos pantalla ;espero a que pecione tecla

addr addr addr addr addr addr

opc1 opc2 opc3 opc4 opc5 opc6

mov ah,01h int 21h cmp al,31h je suma cmp al,32h je resta cmp al,33h je multi cmp al,34h je divide cmp al,35h jne repite

;01h lee un caracter ;compara si es 1 ;salta a sumar

;compara si es 4 ;salta a dividir

;si es 5 se sale

.exit ;escribir una cadena write proc c, dir_cad:ptr byte mov ah,09h mov dx,dir_cad int 21h ret write endp ;escribe un writec proc mov mov int ret writec endp caracter c, car:byte ah,02h dl,car 21h

;leer un caracter readc proc near mov ah,01h int 21h ret readc endp leer proc near ;Macro lee los numeros del teclado mov si,0 limpia: mov numstr2[si],' ' mov numstr[si],'0' inc si cmp si,8 jne limpia mov numero,0 mov si,0 ;leemos los numeros del teclado lee: mov ah,01h ;01h lee un caracter int 21h cmp al,13 je recore ;si el caracter es enter ;salta a recorer los numeros

mov numstr[si],al ;almacenamos el caracter inc si ;incrementamos el indice si cmp si,8 ;si si es 8 jne lee ;si no lee otro caracter je continua ;si si salta a continua recore: mov di,8 recorre: ;recorremos los numeros a la derecha dec si dec di mov al,numstr[si] mov numstr[di],al mov numstr[si],30h cmp si,0

jne recorre continua: mov si,0 ; convierte de cadena a numero mov di,0 convierte: sub EDX,EDX mov EAX,0 mov al,numstr[si] sub EAX,48 mov ecx,posi[di] mul ecx add numero,EAX inc si add di,4 cmp si,8 jne convierte ret leer endp mostrar proc near ;muestra el resultado de la operacion mov si,0 ;convierte de numero a cadena mov di,0 mov EAX,numero convierte2: mov EDX,0 div posi[di] add EAX,48 mov numstr2[si],al mov EAX,EDX inc si add di,4 cmp si,8 jne convierte2 invoke write, addr numstr2 ret mostrar endp end

Das könnte Ihnen auch gefallen