Mostrando las entradas con la etiqueta Lenguajes de Interfaz. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Lenguajes de Interfaz. Mostrar todas las entradas

martes, 22 de mayo de 2018

Exposiciones - Lenguajes de interfaz

Equipo # 1 - Programación del puerto paralelo

Un puerto paralelo es una interfaz entre un computador y un periférico, cuya principal característica es que los bits de datos viajan juntos, enviando un paquete de byte a la vez. Es decir, se implementa un cable o una vía física para cada bit de datos formando un bus. Mediante el puerto paralelo podemos controlar también periféricos como focos, motores entre otros dispositivos.

El cable paralelo es el conector físico entre el puerto paralelo y el dispositivo periférico. En un puerto paralelo habrá una serie de bits de control en vías aparte que irán en ambos sentidos por caminos distintos. 

El puerto paralelo de las computadoras, de acuerdo a la norma Centronics, está compuesto por un bus de comunicación bidireccional de 8 bits de datos, además de un conjunto de líneas de protocolo. Las líneas de comunicación cuentan con un retenedor que mantiene el último valor que les fue escrito hasta que se escribe un nuevo dato, las características eléctricas son:

  • Tensión de nivel alto: 3,3 o 5 V
  • Tensión de nivel bajo: 0 V
  • Intensidad de salida máxima: 2,6 mA
  • Intensidad de entrada máxima: 24 mA

Los sistemas operativos basados en DOS y compatibles gestionan las interfaces de puerto paralelo con los nombres LPT1, LPT2 y así sucesivamente (LPT significa Line Print Terminal), mientras que los de tipo Unix los nombran como /dev/lp0, /dev/lp1, y demás. Las direcciones base de los dos primeros puertos son:

  • LPT1 = 0x378
  • LPT2 = 0x278

Para puertos de más de 1 han recomendado a la dirección:




La estructura consta de tres registros: de control, de estado y de datos.

  • El registro de control es un bidireccional de 4 bits, con un bit de configuración que no tiene conexión al exterior, su dirección en el LPT1 es 0x37A.
  • El registro de estado, se trata de un registro de entrada de información de 5 bits, su dirección en el LPT1 es 0x379.
  • El registro de datos, se compone de 8 bits, es bidireccional. Su dirección en el LPT1 es 0x378.

Los pines del puerto paralelo con conector DB25 son:



Las líneas invertidas toman valor verdadero cuando el nivel lógico es bajo. Si no están invertidas, entonces el nivel lógico alto es el valor verdadero.

El pin 25 en el conector DB25 podría no estar conectado a la tierra en computadoras modernas.

Equipo # 2 - Programación del puerto USB

Puerto USB

Un puerto es una localización en la computadora en donde conectamos los periféricos. Estos pueden enviar información a la computadora, recibir información de la misma o hacer ambas cosas. La primer versión del puerto USB apareció en el año de 1997, junto con el lanzamiento del microprocesador Intel Pentium II.



La palabra USB viene de la frase en Ingles “Universal Serial Bus” que se utiliza para describir un tipo de puerto de PC en donde se conectan distintos periféricos tales como impresoras, cámaras fotográficas, teclados de computadoras e infinidad de productos de uso generalizado.




El puerto USB cuenta con la tecnología "Plug&Play" la cual permite conectar, desconectar y reconocer dispositivos sin necesidad de reiniciar o apagar la computadora, a diferencia de sus antecesores. En él se definen los conectores y los cables, una topología especial tipo estrella para conectar hasta 127 dispositivos y protocolos que permiten la detección y configuración automática de los dispositivos conectados

Antes de la creación del puerto USB los periféricos se conectaban mapeados directamente en direcciones de entrada y salida, a cada uno se le asignaba una dirección específica y en algunos casos un canal de acceso directo a memoria. Esto causaba que existiera conflicto en la asignación de los recursos. Además de que cada dispositivo tenía su propio puerto de conexión y utilizaba sus cables específicos, lo que daba lugar a un incremento en los costos. Todo esto en conjunto motivaron a la creación del puerto USB.


Programación del puerto USB

En lenguaje ensamblador, se puede acudir a la interrupción 14H de la ROM-BIOS para configurar, leer, escribir o simplemente para conocer el estado del puerto; cada una de estas cuatro opciones es un servicio de la interrupción, y se seleccionan a través del registro AH. Para configurar o inicializar el puerto serie, bastará con utilizar el servicio 00 de la interrupción, colocando en el registro AL los valores equivalentes a los parámetros.


Configurar el puerto serial para 1200 baudios, sin bit de paridad, sin bit de parada y 8 bits

       
mov ah,0 ;servicio 00 de INT 14h: inicializar puerto 
mov a1,83 ;configuración: 1200 baudios, no paridad 
;un bit de parada, 8 bits de datos 
mov dx,00 ;Seleccionar puerto COM1 
int 14 ;interrupción del BIOS 
mov ah,4c ;servicio 4ch de INT 21h: terminar 
int 21 ;interrupción servicio del DOS
       


Buffer de vídeo en modo texto

Una controladora de vídeo con modo de texto suele usar dos zonas de memoria distintas:

  • Memoria de caracteres: conteniendo la estructura de píxeles de cada carácter de la fuentes en uso.
  • Matriz de pantalla o Buffer de pantalla: conteniendo la matriz de los caracteres mostrados en la pantalla, almacenados como índices a la memoria de caracteres.

La memoria de caracteres suele residir en ROM por defecto. Sin embargo, muchos sistemas también permiten el uso de RAM para este propósito, haciendo posible redefinir el juego de caracteres para fines específicos de cada aplicación. El uso de caracteres residentes en RAM también facilitan algunas técnicas especiales, como la implementación de un buffer de vídeo para gráficos pixelados.


Acceso a discos en lenguaje ensamblador

A continuación algunos servicios de la INT 13h

       
 LEER ESTADO DEL DISCO
AH = 01h (servicio o número de función)
DL = No. de unidad (80h-FFh para discos duros, 128-255 decimal; 0-7Fh para u. de floppy).
 LEER SECTOR(ES)
AH = 02h (servicio o número de función)
AL = número de sectores a leer (Base 1: 1..255)
CH = bits 0-7, No. de cilindro o pista (LSB del No. de cilindro, 10-bits, 0-1023)
CL = bits 6-7, No. de cilindro o pista.
CL = bits 0-5, No. de sector inicial (Base 1: 1-63)
DH = No. de cabezal o lado (Base 0: 0-15, con traducción puede ser 0-255)
DL = No. de unidad (80h-FFh para discos duros, 128-255 decimal; 0-7Fh para u. de floppy)
ES:BX = dirección del buffer E/S.

· ESCRIBIR SECTOR(ES)
AH = 03h (número de la función de escritura)
· OBTENER LOS PARÁMETROS DEL DISCO AH = 08h (número de la función para obener los parámetros de la unidad).
DL = número de unidad (igual que para leer/esribir sectores)
· LECTURA EXTENDIDA DE SECTOR(ES) 
AH = 42h
DL = número de unidad (igual que para leer/esribir sectores)
DS:SI = puntero a la estructura del paquete pedido al disco
       


Vídeo:



miércoles, 18 de abril de 2018

Uso de Macro del programa de los colores en Emu8086

bucle1 macro tama,x,y
mov CX, tama 
BUCLE:
MOV DX, SI
ADD DX, x
MOV DH, y
coloca ;este es el macro para colocar en la posicion la letra
;se guarda letra por letra
MOV AL, [SI+OFFSET TITULO]
;guarda color por color
MOV BL, [SI+OFFSET COLORES]
color ;este es el macro que selecciona un color
INC SI
LOOPNZ BUCLE
endm 

color macro ;macro que selecciona el color
MOV AH, 9
INT BIOS
endm 

coloca macro;macro que selecciona una posicion
MOV AH, 2
INT BIOS
endm

.STACK 64
.MODEL SMALL

CR EQU 13
LF EQU 10
BIOS EQU 10H
DOS EQU 21H
TEXTO EQU 3
FIN EQU 4C00H

.DATA
;ponemos el texto que querramos mostrar
TITULO DB 'Agnax & Alizz Y pedrito',
;aqui va la lista de los colores
;del texto
colores DB 50H
DB 5fH
DB 50H
DB 5fH
DB 50H
DB 00H
DB 0f0H
DB 00h
DB 20H
DB 20H
DB 20H
DB 20H
DB 20H 
DB 00H
DB 0fH 
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH

.CODE
;esta zona es para poner el texto
COLO PROC FAR
MOV AX, @DATA
MOV DS, AX 
;Aquí se pone el macro del bucle
bucle1 25,30,12

MOV AH, 8
INT DOS 

coloca ;este es el macro para colocar en la posicion la letra
MOV AX, FIN

INT DOS 
COLO ENDP
RET


Macro - Programa que muestra un mensaje utilizando una macro

ensamblador macro msg ; Declaracion de nuestra macro ensamblador
mov ah, 09h ; Imprime la cadena en pantalla
mov dx, offset msg ; Se ingresan los valores en nuestro registro DX
int 21h ; Interrupcion del DOS
ENDM


.DATA
msg DB 'Programa utilizando una macro. $'  ; Mensaje
.CODE

inicio:
mov ax, @Data       ; Asignacion de datos en el registro AX
mov ds, ax          ; Asignacion de datos al registro de segmento de datos

ensamblador msg     ; Aqui se llama a la macro con el nombre ENSAMBLADOR con el parametro MSG

mov ah, 08h
int 21h             ; Interrupcion del DOS

mov ax, 4c00h       ; Complemento de la interrupcion 21h para finalizar el programa
int 21h             ; Interrupcion del DOS
end inicio

miércoles, 11 de abril de 2018

Macros - Ensamblador

; Programa que posiciona un caracter en cierta parte de la pantalla

gotoxy macro fila,col    
    mov ah,02h    ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila   ; Valor de la fila en la parte alta                                                   
    mov dl,col    ; Valor de la columna parte baja
    mov bh,0h
    int 10h       ; Interrupcion para ejecutar los cambios en modo video  
endm  ; Finalizacion del macro
      ; Todo el bloque anterior de codigo funciona para posicionar el cursor en una fila y una columna
      
      ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     
        
pantalla macro letra
    mov ah,02h      ; Posicionamos el caracter
    mov dl,letra
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           
           
.model small
.data
.code
startup:
    mov ax,@data
    mov ds,ax
    mov ax,0003h
    int 10h
    gotoxy 10,10    ; Aqui se le asigna a nuestra macro el valor de la fila y columna donde se posicionara el cursor
    pantalla 41h    
    mov ah,01h
    int 21h         ; Cierre del programa
    mov ax,4c00h    ; Cierre del programa
    int 21h         ; Cierre del programa
end startup


; Programa que coloca un caracter en la posicion dada de acuerdo a parámetros ingresados por teclado 

gotoxy macro fila,col ; Delaracion de nuestro primer macro GOTOXY
    mov ah,02h ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila  ; Valor de la fila en la parte alta            
    mov dl,col   ; Valor de la columna parte baja
    mov bh,0h
    int 10h        ; Interrupcion para ejecutar los cambios en modo video  
endm              ; Finalizacion de la macro

                 ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     

pantalla macro que  ; Declaracion de nuestro segundo macro PANTALLA
    mov ah,02h      ; Posicionamos el caracter
    mov dl,que
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                ; Finalizacion de la macro

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion  que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           

imprime macro eztryng      ; Declaracion de nuestro tercer macro IMPRIME
    mov dx,offset eztryng  ; Se ingresan los valores en nuestro registro DX
    mov ah,9                     ; Imprime la cadena
    int 21h                         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                              ; Finalizacion del macro

.data                               ; Variables
    mensaje DB "Ingrese un caracter: $"             ; Primer mensaje que nos pedira el caracter que se mostrara en pantalla    
    mensaje2 DB "Ingrese X del 0 al 9: $"           ; Segundo mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje X donde se desplegara nuestro caracter
    mensaje3 DB ,13,10,"Ingrese Y del 0 al 9: $"    ; Tercer mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje Y donde se desplegara nuestro caracter
    caracter DB 40
    varx DB ?
    vary DB ?

vtext db 100 dup('$')

.code

startup:
    mov ax,@data    ; Asignacion de datos en el registro AX
    mov ds,ax       ; Asignacion de datos al registro de segmento de datos
    
    imprime mensaje ; Aqui se llama a la macro con el nombre IMPRIME con el parametro MENSAJE
    mov si,00h      ; Limpia el apuntador del registro indice fuente


 leer:              ; Comienzo de la declaracion del metodo leer
    mov ax,0000     ; Aqui se realiza limpieza al registro AX
    mov ah,01h      ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h         ; Interrupcion del DOS

    mov caracter[si],al ; Guarda el dato capturado en la parte baja del registro AX en el registro indice fuente
    inc si                      ; Incrementa el registro indice fuente
    cmp al,0dh             ; Hace una comparacion para saber si la tecla introducida fue ENTER
    ja XY                     ; En caso de que se haya presionado ENTER, saldra el siguiente mensaje que pedira las coordenadas en X
    jb leer                    ; En caso de que no se haya presionado ENTER se volvera a ejecutar el metodo LEER

    XY:                     ; Declaracion del metodo XY
    mov dx,offset caracte; Coloca en el registro el caracter ingresado previamente
    mov ah,0ah              ; Complemento de la interrupcion 21h para leer caracteres del teclado y almacenarlos en un buffer
    int 21h                 ; Interrupcion DOS

    imprime caracter        ; Llama a nuestra macro con el nombre IMPRIME con el parametro CARACTER
    imprime mensaje2        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE2

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registro AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX

    mov varx,al             ; Se le asigna a nuestra variable de la coordenada X el valor almacenado en la parte baja del registro AX

    imprime mensaje3        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE3

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registo AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX
    mov vary,al             ; Se le asigna a nuestra variable de la coordenada Y el valor almacenado en la parte baja del registro AX
    
    mov ax,0003h            ; Complemento de la interrupcion 10h
    int 10h                        ; Interrupcion para ejecutar los cambios en modo video  
    gotoxy vary,varx        ; Llama a la macro GOTOXY con los parametros VARX y VARY  como fila y columna
    pantalla caracter[0]    ; Llama a la macro PANTALLA con el caracter capturado previamente como parametro

    mov ah,01h               ; Complemento de la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                       ; Interrupcion del DOS
    mov ax,4c00h           ; Complemento de la interrupcion 21h para finalizar el programa
    int 21h                       ; Interrupcion del DOS
                
end startup                  ; Fin del programa

viernes, 2 de febrero de 2018

Lenguajes de interfaz - Ejercicios de la unidad

Registro de banderas de EMU8086
Estados de las Banderas

Carry Flag (CF) - Este indicador se establece en 1 cuando se produce un desbordamiento de acarreo. Por ejemplo cuando se ejecuta el siguiente codigo:
mov al, 255
mov bl, 1
add al, bl
Recordemos que al y bl son registros de 8bits y que por lo tanto, el maximo valor decimal que pueden almacenar es 255

Zero Flag (ZF) - toma el valor 1 cuando el resultado es cero. Cuando el resultado es diferente de 0, entonces el valor de la bandera es 0. Ejemplo:
mov al, 1
mov bl, 1
sub al, bl

Sign Flag (SF) - toma el valor 1 cuando el resultado es negativo. Cuando el resultado es positivo se establece en 0. Ejemplo:
mov al, 1
mov bl, 3
sub al, bl

Overflow Flag (OF) - establece en 1 cuando hay un desbordamiento de signo. Por ejemplo, cuando se agrega hace la operacion 100 + 50 (resultado no está en el rango -128 ... 127)

Funcionamiento de las banderas y la instrucción CMP
La instrucción CMP compara los dos registros, siendo su sintaxis

cmp primero, segundo

Siendo su algoritmo:

primero - segundo.

Las banderas se modifican así:

Si resultado = 0 (primero == segundo):
ZF = 1; CF = 0

Si resultado > 0 (primero > segundo):
ZF = 0; CF = 0
SF = OF

Si resultado < 0 (primero < segundo):
ZF = 0; CF = 1
SF != OF

Ejemplos:








Programas

Programa que realiza una suma:

ORG 100h 

CALL Inicializar
CALL SumarAXBX
HLT                               ;Termina el proceso

Inicializar:
     MOV ax,8h
     MOV bx,9h
ret

SumarAXBX:
     ADD ax,bx
ret

Programa que realiza una resta:

ORG 100h 

CALL Inicializar
CALL Restar
HLT                             ;Termina el proceso

Inicializar:
     MOV ax,10
     MOV bx,12
ret

Restar:
     SUB ax,bx
ret

Programa que realiza una mutiplicación

ORG 100h

CALL Inicializar
CALL Multixbx
HLT                               ; Termina el proceso

Inicializar:
     MOV ax,8
     MOV bx,9
ret

Multixbx:
     MUL bx
ret

Programa que realiza una división

ORG 100h

CALL Inicializar
CALL Divixbx
HTL                                  ; Termina el proceso

Inicializar:
     MOV ax,9
     MOV bx,9
ret

Divixbx:
     DIV bx
ret

Programa que realiza una multiplicacion de 2 digitos por 2 digitos 

.model small
.stack


.data                  ; Aquí se declaran las variables donde se almacenara la información 
.code
   chr1  db ?        ; Primer digito de la multiplicacion
   chr2  db ?        ; Segundo digito de la multiplicacion
   chr3  db ?        ; Multiplo
   chr4  db ?
   r1    db ?          ; Primer resultado 
   r2    db ?          ; Segundo resultado
   r3    db ?
   r4    db ?
   ac    db 0           ; Acarreo
   ac1   db 0
.inicio
   ;cls
   MOV ah,00h      ; Complemento que se utiliza para poner el modo de video
   MOV al,03         ; Modo 80x25 8x8 16
   INT 10h             ; Interrupcion de video

   MOV ah,01h     ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
   INT 21h             ; Interrupcion del DOS
   SUB al,30h        ; Se convierten los valores a decimal
   MOV chr1,al      ; [chr1].chr2 * chr3 = ac.r1.r2

   MOV ah,01h      ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
   INT 21h             ; Interrupcion del DOS
   SUB al,30h       ; Se convierten los valores a decimal
   MOV chr2,al      ; chr1.[chr2] * chr3 = ac.r1.r2

   MOV ah,02h     ; Se encarga de posicionar el cursor en pantalla
   MOV dl,'*'          ; Caracter a mostrar
   INT 21h             ; Interrupcion del DOS

   MOV ah,01h     ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
   INT 21h             ; Interrupcion del DOS
   SUB al,30h       ; Se convierten los valores a decimal
   MOV chr3,al     ; chr1.chr2 * [chr3] = ac.r1.r2
 
   MOV ah,01h      ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
   INT 21h              ; Interrupcion del DOS
   SUB al,30h        ; Se convierten los valores a decimal
   MOV chr4,al       ; chr1.chr2 * [chr3] = ac.r1.r2

   MOV ah,02h       ; Se encarga de posicionar el cursor en pantalla
   MOV dl,'='           ; Caracter a mostrar
   INT 21h               ; Interrupcion del DOS

   ; A partir de aquí se realiza la operacion
 
   MOV al,chr4      ; Unidad del segundo numero
   MOV bl,chr2      ; Unidad del primer numero
   MUL bl               ; Multiplicacion
   MOV ah,0          ; Limpiamos la parte alta del registro AX
   AAM                  ; Separamos de hexadecimal a decimal
   MOV ac1,ah      ; Decenas de la primer multiplicacion
   MOV r4,al          ; Unidades de la primer multiplicacion
           
   MOV al,chr4      ; Unidades del segundo numero
   MOV bl,chr1      ; Decentas del primer numero
   MUL bl               ; Multiplicacion
   MOV r3,al          ; Movemos el resultado de la multiplicacion a nuestra variable r3
   MOV bl,ac1        ; Movemos el acarreo a la parte baja de nuestro registro BX 
   ADD r3,bl           ; Sumamos resultado r3 mas el acarreo almacenado previamente en bl
   MOV ah,00h       ; Limpiamos la parte alta del registro AX
   MOV al,r3           ; Movemos el resultado de la suma a la parte baja del registro AX
   AAM                   ; Separamos de hexadecimal a decimal
   MOV r3,al           ; Guardamos unidades en nuestra variable r3
   MOV ac1,ah       ; Guardamos las decenas en nuestra variable ac1
 
   MOV al,chr3          ; al = chr3
   MOV bl,chr2          ; bl = chr2
   MUL bl                  ; AL = chr3*chr2 (BL*AL)
   MOV Ah,0h         
   AAM                     ; Separamos de hexadecimal a decimal
   MOV ac,AH          ; ac = AH (Acarreo)
   MOV r2,AL           ; r2 = AL       (Unidad del resultado)

   MOV al,chr3         ; AL = chr3
   MOV bl,chr1         ; BL = chr1
   MUL bl                  ; AL = chr1*chr3 (BL*AL)
   MOV r1,al             ; r1 = AL       (Decena del resultado)
   MOV bl,ac             ; BL = Acarreo anterior
   ADD r1,bl             ; r1 = r1+ac (r1 + Acarreo)
   MOV ah,00h     ; Limpiamos la parte alta del registro AX
   MOV al,r1         ; AL = r1 (Asignaci?n para el ajust)
   AAM                 ; ASCII Adjustment
   MOV r1,al         ; r1 = AL
   MOV ac,ah      ; ac = AH (Acarreo para la Centena del resultado)
 
   ; Suma final
   ; R4 resulta ser las unidades de multiplicacion y no se toma en cuenta ya que se pasa entero

   MOV ax,0000h   ; Limpiamos el registro AX
 
   MOV al,r3           ; Movemos el segundo resultado de la primera multiplicacion a la parte baja de neustro registro AX
   MOV bl,r2           ; Movemos primer resultado de la segunda multiplicacion a la parte baja de nuestro registro BX
   ADD al,bl            ; Sumamos el registro AL y BL
   MOV ah,00h       ; Limpiamos el registro AX
   AAM                   ; Separamos de hexadecimal a decimal
   MOV r3,al           ; r3 guarda las decenas del resultado final
   MOV r2,ah          ; r2 se utiliza como nuevo acarreo
 
   MOV ax,0000h    ; Limpiamos el registro AX
 
   MOV al,ac1      ; Movemos el acarreo de la primera mult a al
   MOV bl,r1        ; Movemos segundo resultado de la segunda mult a bl
   ADD al,r2         ; Sumamos el nuevo  acarreo de la suma anterior  a al
   ADD al,bl          ; Sumamos al a bl
   MOV ah,00h     ; Limpiamos el registro ah
   AAM                 ; Separamos de hexadecimal a decimal
   MOV r1,al        ;r1 guarda las centenas
   MOV r2,ah       ; Ah se sigue utilizando como acarreo
 
   mov al,r2      ;movemos el acarreo a al
   mov bl,ac      ;movemos ac a bl
   add al,bl      ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;mov al a ac como nuestro acarreo final
 
   ; Mostramos resultado
   mov ah,02h
   mov dl,ac
   add dl,30h
   int 21h        
  
  ;Mostramos ac (millar)

   mov ah,02H
   mov dl,r1
   add dl,30h
   int 21h       

 ;Mostramos r1 (centena)

mov ah,02H
   mov dl,r3
   add dl,30h
   int 21h        

;Mostramos r3 (decena)
 
   mov ah,02H
   mov dl,r4
   add dl,30h
   int 21h       

 ;unidad
 
.exit
end




Exposiciones - Lenguajes de interfaz

Equipo # 1 - Programación del puerto paralelo Un puerto paralelo es una interfaz entre un computador y un periférico, cuya principal carac...