MICROPROCESADORES Y CONTROL DE PERIFRICOS INSTRUCCIONES ARITMTICAS Prof

  • Slides: 62
Download presentation
MICROPROCESADORES Y CONTROL DE PERIFÉRICOS INSTRUCCIONES ARITMÉTICAS Prof. Juan Álvarez

MICROPROCESADORES Y CONTROL DE PERIFÉRICOS INSTRUCCIONES ARITMÉTICAS Prof. Juan Álvarez

REPERTORIO DE INSTRUCCIONES • • • Instrucciones Aritméticas Instrucciones Lógicas Desplazamientos y rotaciones Instrucciones

REPERTORIO DE INSTRUCCIONES • • • Instrucciones Aritméticas Instrucciones Lógicas Desplazamientos y rotaciones Instrucciones de cadena Programas en ensamblador

INSTRUCCIONES ARITMÉTICAS Salvo excepciones, las instrucciones aritméticas y lógicas afectan los flags. Muchas de

INSTRUCCIONES ARITMÉTICAS Salvo excepciones, las instrucciones aritméticas y lógicas afectan los flags. Muchas de ellas tienen los mismos modos de direccionamiento que MOV. ADD destino, fuente Suma destino con fuente y el resultado se guarda en el destino. ADC destino, fuente Suma destino, fuente y Carry, el resultado se guarda en el destino.

INSTRUCCIONES ARITMÉTICAS Simbólica ADD reg, reg Byte 1 0000000 w Byte 2 kkmmmrrr Byte

INSTRUCCIONES ARITMÉTICAS Simbólica ADD reg, reg Byte 1 0000000 w Byte 2 kkmmmrrr Byte 3 ADD reg, inm 1000000 w 11000 mmm Dato ADD reg, mem 000000 dw kkrrrmmm Dato ADD AX, inm 0000000 w Dato ADC AX, reg 0001000 w 11 mmmrrr ADC reg, reg 0001000 w 11 mmmrrr ADC AX, inm 0001010 w Dato ADC reg, inm 1000000 w 11010 rrr

INSTRUCCIONES ARITMÉTICAS INC destino el destino se incrementa en una unidad. DEC destino el

INSTRUCCIONES ARITMÉTICAS INC destino el destino se incrementa en una unidad. DEC destino el destino se decrementa en una unidad. Simbólica INC reg Byte 1 01000 rrr DEC reg 01001 rrr

INSTRUCCIONES ARITMÉTICAS SUB destino, fuente resta el destino menos la fuente y el resultado

INSTRUCCIONES ARITMÉTICAS SUB destino, fuente resta el destino menos la fuente y el resultado se guarda en el destino. SBB destino, fuente resta el destino menos la fuente menos el carry y el resultado se guarda en el destino. CMP destino, fuente resta destino menos fuente, sólo se afectan los flags.

INSTRUCCIONES ARITMÉTICAS Simbólica SUB reg, reg Byte 1 0001010 w Byte 2 kkmmmrrr Byte

INSTRUCCIONES ARITMÉTICAS Simbólica SUB reg, reg Byte 1 0001010 w Byte 2 kkmmmrrr Byte 3 SUB reg, inm 1000000 w kk 101 mmm Dato SUB reg, mem 000000 dw kkrrrmmm Dato SBB AX, inm 0001110 w Dato SBB AX, reg 0001100 w 11 mmmrrr SBB reg, reg 000110 dw 11 mmmrrr

INSTRUCCIONES ARITMÉTICAS MUL operando multiplica el acumulador por el operando y el resultado se

INSTRUCCIONES ARITMÉTICAS MUL operando multiplica el acumulador por el operando y el resultado se escribe en el acumulador. Se trata de una multiplicación signo. Ejemplos: • MUL CL multiplica AL x CL el producto se guarda en AX.

INSTRUCCIONES ARITMÉTICAS • MUL CX multiplica AX x CX, el producto se guarda en

INSTRUCCIONES ARITMÉTICAS • MUL CX multiplica AX x CX, el producto se guarda en DX-AX IMUL operando hace lo mismo que MUL, se trata en este caso de una multiplicación con signo. Ejemplos: • IMUL DH multiplica AL x DH, el producto se guarda en AX.

INSTRUCCIONES ARITMÉTICAS • IMUL DI multiplica AX x DI, el producto se guarda en

INSTRUCCIONES ARITMÉTICAS • IMUL DI multiplica AX x DI, el producto se guarda en DX-AX. DIV operando Divide sin signo el acumulador entre el operando, el resultado se guarda en el acumulador. El dividendo es siempre del doble de bits que el divisor. O sea, una división de 8 bits divide un número de 16 bits entre uno de 8 bits.

INSTRUCCIONES ARITMÉTICAS No existe modo de direccionamiento inmediato. Ejemplos: • DIV CL divide AX

INSTRUCCIONES ARITMÉTICAS No existe modo de direccionamiento inmediato. Ejemplos: • DIV CL divide AX entre CL, el cociente está en AL y el residuo en AH. • DIV CX divide DX-AX entre CX, el cociente está en AX y el residuo en DX.

INSTRUCCIONES ARITMÉTICAS Una división puede dar como resultado dos tipos diferentes de error: uno

INSTRUCCIONES ARITMÉTICAS Una división puede dar como resultado dos tipos diferentes de error: uno es el de dividir entre cero; el otro es el de dividir un número grande entre uno pequeño, con lo que ocurre un desborde. Por ejemplo dividir AX=3000 entre 2. Como el cociente de la división debe aparecer en AL que es de 8 bits, el resultado que es de 1500 produce un desborde.

INSTRUCCIONES ARITMÉTICAS IDIV operando Es una división con signo con características similares a las

INSTRUCCIONES ARITMÉTICAS IDIV operando Es una división con signo con características similares a las de DIV. Ejemplos: • IDIV BL divide AX entre BL, el cociente va a AL y el residuo a AH • IDIV SI divide DX-AX entre SI, el cociente va a AX y el residuo a DX.

INSTRUCCIONES ARITMÉTICA BCD Las operaciones aritméticas que realiza el procesador se dan para números

INSTRUCCIONES ARITMÉTICA BCD Las operaciones aritméticas que realiza el procesador se dan para números binarios sin signo en general y para números binarios con signo en algunos casos. En otros casos, las operaciones aritméticas se requieren ajustar para obtener resultados en BCD.

INSTRUCCIONES ARITMÉTICAS • La instrucción DAA ajusta el resultado de una suma a BCD.

INSTRUCCIONES ARITMÉTICAS • La instrucción DAA ajusta el resultado de una suma a BCD. • La instrucción DAS ajusta el resultado de una resta a BCD. Ambas instrucciones trabajan con el registro AL.

INSTRUCCIONES ARITMÉTICA ASCII Se cuentan con cuatro instrucciones para operaciones aritméticas en ASCII. •

INSTRUCCIONES ARITMÉTICA ASCII Se cuentan con cuatro instrucciones para operaciones aritméticas en ASCII. • AAA La suma de dos números de un dígito codificados en ASCII no dará como resultado un dato ASCII. La instrucción AAA se utiliza después de esta suma, al resultado que figura en AX hay que agregarle 3030 h para obtener el ASCII.

INSTRUCCIONES ARITMÉTICAS Ejemplo: mov AL, 31 h ; cargar 1 en ASCII add AL,

INSTRUCCIONES ARITMÉTICAS Ejemplo: mov AL, 31 h ; cargar 1 en ASCII add AL, 39 h ; suma 9 en ASCII AAA ; ajusta el resultado add AX, 3030 h ; en ASCII • AAD esta instrucción aparece antes de una división y requiere que el registro AX contenga un número BCD desempaquetado de dos dígitos.

INSTRUCCIONES ARITMÉTICAS Después de ajustar el registro AX con AAD, este es dividido entre

INSTRUCCIONES ARITMÉTICAS Después de ajustar el registro AX con AAD, este es dividido entre un número BCD descompactado para generar un resultado de un solo dígito en AL, así como cualquier residuo en AH. Ejemplo: mov BL, 9 mov AX, 0702 h AAD DIV BL ; divide 72=48 h entre 9

INSTRUCCIONES ARITMÉTICAS • AAM sigue a la instrucción de multiplicación después de multiplicar dor

INSTRUCCIONES ARITMÉTICAS • AAM sigue a la instrucción de multiplicación después de multiplicar dor números BCD descompactados de un dígito. Ejemplo: mov AL, 9 mov CL, 7 mul CL ; AX=003 Fh=63 AAM ; AX=0603 h

INSTRUCCIONES ARITMÉTICAS • AAS ajusta el registro Ax después de una resta ASCII Ejemplo:

INSTRUCCIONES ARITMÉTICAS • AAS ajusta el registro Ax después de una resta ASCII Ejemplo: mov AH, 08 h mov BL, 09 h sub AL, BL ; AL=FFh, Aux. Carry=1 AAS ; AX=0009 h

INSTRUCCIONES LÓGICAS Las instrucciones lógicas permiten un control binario de bits en un programa;

INSTRUCCIONES LÓGICAS Las instrucciones lógicas permiten un control binario de bits en un programa; permiten la activación, restitución y complementación de bits. Todas las instrucciones lógicas afectan los bits de bandera. • AND destino, fuente hace un AND bit a bit entre el destino y la fuente y el resultado se consigna en el destino.

INSTRUCCIONES LÓGICAS • OR destino, fuente hace un OR bit a bit entre el

INSTRUCCIONES LÓGICAS • OR destino, fuente hace un OR bit a bit entre el destino y la fuente, el resultado va al destino. • XOR destino, fuente hace un XOR bit a bit entre el destino y la fuente y el resultado va al destino. • TEST destino, fuente realiza la instrucción AND pero el resultado no se graba, solo afecta los flags.

INSTRUCCIONES LÓGICAS • NOT destino saca el complemento uno del destino. • NEG destino

INSTRUCCIONES LÓGICAS • NOT destino saca el complemento uno del destino. • NEG destino saca el complemento dos del destino.

DESPLAZAMIENTOS Y ROTACIONES Los desplazamientos colocan o mueven bits hacia la izquierda o hacia

DESPLAZAMIENTOS Y ROTACIONES Los desplazamientos colocan o mueven bits hacia la izquierda o hacia la derecha dentro de un registro o localidad de memoria. • SHL destino, n SAL destino, n desplaza los bits del destino n posiciones hacia la izquierda. Los bits que salen van al Carry y los espacios vacíos se cubren con ceros.

DESPLAZAMIENTOS Y ROTACIONES • SHR destino, n desplaza los bits de destino n posiciones

DESPLAZAMIENTOS Y ROTACIONES • SHR destino, n desplaza los bits de destino n posiciones hacia la derecha. Los bits que salen se van al Carry y los espacios vacíos se cubren con ceros. • SAR destino, n parecido al SHR. Los espacios vacíos se cubren con bits idénticos a los que habían anteriormente.

DESPLAZAMIENTOS Y ROTACIONES

DESPLAZAMIENTOS Y ROTACIONES

DESPLAZAMIENTOS Y ROTACIONES Las rotaciones desplazan datos haciendo circular la información en un registro

DESPLAZAMIENTOS Y ROTACIONES Las rotaciones desplazan datos haciendo circular la información en un registro o en una localidad de memoria ya sea de un extremo al otro o a través del carry. • RCL destino, n rotación a la izquierda de n bits a través del carry. • RCR destino, n rotación a la derecha de n bits a través del carry.

DESPLAZAMIENTOS Y ROTACIONES • ROL destino, n rotación a la izquierda de n bits,

DESPLAZAMIENTOS Y ROTACIONES • ROL destino, n rotación a la izquierda de n bits, los bits que salen se van al carry y una copia de ellos ocupan los espacios vacíos. • ROR destino, n rotación a la derecha de n bits, los bits que salen se van al carry y una copia de ellos ocupan los espacios vacíos.

DESPLAZAMIENTOS Y ROTACIONES

DESPLAZAMIENTOS Y ROTACIONES

INSTRUCCIONES DE CADENAS Una cadena es un conjunto de bytes o words de hasta

INSTRUCCIONES DE CADENAS Una cadena es un conjunto de bytes o words de hasta 64 KB de longitud. Para apuntar a los bytes de las cadenas se utilizan normalmente los registros SI y DI, los que se actualizan automáticamente después de cada operación. El incremento puede ser positivo o negativo de pendiendo de la bandera de dirección D. Si D=0, el incremento es positivo.

INSTRUCCIONES DE CADENAS • MOVS transfiere un byte o un word de una cadena

INSTRUCCIONES DE CADENAS • MOVS transfiere un byte o un word de una cadena a otra desde DS: [SI] hacia ES: [DI]. • MOVSB mover cadena de bytes • MOVSW mover cadena de words

INSTRUCCIONES DE CADENAS • LODS carga en AL o en AX el dato de

INSTRUCCIONES DE CADENAS • LODS carga en AL o en AX el dato de cadena direccionado DS: [SI]. • LODSB carga en AL el dato de cadena. • LODSW carga en AX el dato de cadena.

INSTRUCCIONES DE CADENAS • STOS almacena en la localidad de memoria direccionada ES: [DI]

INSTRUCCIONES DE CADENAS • STOS almacena en la localidad de memoria direccionada ES: [DI] el dato que está en AL o en AX. • STOSB almacena AL en la localidad de memoria direccionada. • STOSW almacena AX en la localidad de memoria direccionada.

INSTRUCCIONES DE CADENAS • INS transfiere un byte o un word desde un dispositivo

INSTRUCCIONES DE CADENAS • INS transfiere un byte o un word desde un dispositivo de E/S a una localidad de memoria ES: [DI]. • INSB transfiere un byte desde E/S a la memoria. • INSW transfiere un word desde E/S a la memoria.

INSTRUCCIONES DE CADENAS • OUTS transfiere un byte o un word desde la memoria

INSTRUCCIONES DE CADENAS • OUTS transfiere un byte o un word desde la memoria DS: [SI] hacia un dispositivo de E/S. • OUTSB transfiere un byte desde la memoria hacia la E/S. • OUTSW transfiere un word desde la memoria hacia la E/S.

INSTRUCCIONES DE CADENAS • CMPS compara dos secciones de datos de memoria de bytes

INSTRUCCIONES DE CADENAS • CMPS compara dos secciones de datos de memoria de bytes (CMPSB) o de words (CMPSW): CMP DS: [SI], ES: [DI]. • SCAS compara al registro AL con un bloque de bytes en memoria (SCASB), o al registro AX con un bloque de words en memoria (SCASW).

NUMERACIÓN HEXADECIMAL El siguiente grupo de programas está destinado a escribir en el monitor

NUMERACIÓN HEXADECIMAL El siguiente grupo de programas está destinado a escribir en el monitor números en hexadecimal: • La subrutina unhexa escribe un número entre 0 y 15 en hexadecimal • La subrutina doshexa escribe un número entre 0 y 255 en hexadecimal • La subrutina cuatrohexa escribe un número entre 0 y 65535 en hexadecimal

ESCRIBIR UNA CIFRA HEXADECIMAL. model small. stack 100 h. code main proc mov dl,

ESCRIBIR UNA CIFRA HEXADECIMAL. model small. stack 100 h. code main proc mov dl, 0 Ch cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h mov ah, 4 Ch int 21 h main endp end main

ESCRIBIR UNA CIFRA HEXADECIMAL El programa genera el código ASCII de una cifra hexadecimal

ESCRIBIR UNA CIFRA HEXADECIMAL El programa genera el código ASCII de una cifra hexadecimal (4 bits) que se encuentra inicialmente en el registro DL, este código ASCII es enviado al monitor. Para obtener el código ASCII de un número de 16 bits que se encuentra en DL, basta con agregarle 30 h si el número es menor o igual a 9 y agregarle 37 si el número es mayor a 9.

CÓDIGOS ASCII X 0 X 1 X 2 X 3 X 4 X 5

CÓDIGOS ASCII X 0 X 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 XA XB XC XD XE XF 0 X nul soh stx eot ent ack bel bs ht lf vt ff cr so Si 1 X dle dc 1 dc 2 dc 3 dc 4 nak syn etb can ems sub esc fs gs rs Us 2 X sp ! “ # $ % & ‘ ( ) * + , - . / 3 X 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 X @ A B C D E F G H I J K L M N O 5 X P Q R S T U V W X Y Z [ ] ^ _ 6 X ‘ a b c d e f g h i j k l m n O 7 X p q r s t u v w x y z { | } ~ …

ESCRIBIR UNA CIFRA HEXADECIMAL De hecho ‘ 0’=30 h, ‘ 1’=31 h, ‘ 2’=32

ESCRIBIR UNA CIFRA HEXADECIMAL De hecho ‘ 0’=30 h, ‘ 1’=31 h, ‘ 2’=32 h, …, ‘ 9’=39 h, ‘A’=41 h, ‘B’=42 h, …, ‘F’=46 h. En el programa, primero se compara DL con 9. Si DL< 9, entonces el flag Carry=1 y Zero=0. Si DL=9, entonces Carry=0 y Zero=1. Si DL> 9, entonces Carry=0 y Zero=0. Luego si DL <= 9 se agrega a DL la cantidad 30 h y si DL > 9 se adiciona 7 al resultado para obtener el código ASCII a partir de 41 h. La instrucción jle L 1, realiza el salto sólo si DL<=9.

ESCRIBIR UNA CIFRA HEXADECIMAL Una vez obtenido en DL el código ASCII del valor

ESCRIBIR UNA CIFRA HEXADECIMAL Una vez obtenido en DL el código ASCII del valor que se tenía originalmente, este se envía al monitor. En el siguiente programa, se ha creado la subrutina unhexa que hace lo mismo que el presente programa. La ventaja de tenerlo como subrutina es que puede ser llamado varias veces.

SUBRUTINA UNHEXA. model small. stack 100 h. code main proc mov dl, 07 h

SUBRUTINA UNHEXA. model small. stack 100 h. code main proc mov dl, 07 h call unhexa mov ah, 4 Ch int 21 h main endp unhexa proc push dx push ax cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h pop ax pop dx ret unhexa endp end main

SUBRUTINA UNHEXA Notar que la subrutina empieza con “unhexa proc” y termina con “unhexa

SUBRUTINA UNHEXA Notar que la subrutina empieza con “unhexa proc” y termina con “unhexa endp”. Dentro de la subrutina, la última instrucción es “ret” que indica retorno al programa principal. La subrutina se apela en el programa principal con la instrucción “CALL unhexa”.

ESCRIBIR UN BYTE HEXADECIMAL. model small. stack 100 h. code main proc mov dl,

ESCRIBIR UN BYTE HEXADECIMAL. model small. stack 100 h. code main proc mov dl, 0 F 8 h push dx shr dl, 1 call unhexa pop dx and dl, 0 fh call unhexa mov ah, 4 Ch int 21 h main endp unhexa proc push dx push ax cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h pop ax pop dx ret unhexa endp end main

ESCRIBIR UN BYTE HEXADECIMAL En este programa se utiliza la subrutina un_hexa para imprimir

ESCRIBIR UN BYTE HEXADECIMAL En este programa se utiliza la subrutina un_hexa para imprimir en el monitor un número de un byte (dos cifras hexadecimales). El dato se encuentra en DL. La cifra más significativa debe ser instalada sola en DL para ser enviada a la subrutina un_hexa. Para ello se aplica la instrucción SHR DL, 4; luego la cifra menos significativa del DL inicial se carga en DL sola y se llama a unhexa.

ESCRIBIR UN BYTE HEXADECIMAL Para capturar en DL los primeros cuatro bits se utiliza

ESCRIBIR UN BYTE HEXADECIMAL Para capturar en DL los primeros cuatro bits se utiliza la instrucción AND para enmascarar los otros cuatro bits. El siguiente programa contiene la subrutina doshexa que hace lo mismo que el presente programa. Ello permite posteriormente poder apelar a esta subrutina varias veces según se necesite. La subrutina doshexa llama a la subrutina unhexa.

SUBRUTINA DOSHEXA. model small. stack 100 h. code main proc mov dl, 0 F

SUBRUTINA DOSHEXA. model small. stack 100 h. code main proc mov dl, 0 F 8 h call doshexa mov ah, 4 Ch int 21 h main endp doshexa proc push dx shr dl, 1 call unhexa pop dx and dl, 0 fh call unhexa pop dx ret doshexa endp unhexa proc push dx push ax cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h pop ax pop dx ret unhexa endp end main

ESCRIBIR DOS BYTES HEXADECIMALES. model small. stack 100 h. code main proc mov dx,

ESCRIBIR DOS BYTES HEXADECIMALES. model small. stack 100 h. code main proc mov dx, 0 a 35 fh push dx mov dl, dh call doshexa pop dx call doshexa mov ah, 4 Ch int 21 h main endp doshexa proc push dx shr dl, 1 call unhexa pop dx and dl, 0 fh call unhexa pop dx ret doshexa endp unhexa proc push dx push ax cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h pop ax pop dx ret unhexa endp end main

SUBRUTINA CUATROHEXA En el presente programa se imprime en el monitor un dato de

SUBRUTINA CUATROHEXA En el presente programa se imprime en el monitor un dato de dos bytes (cuatro cifras hexadecimales). Para ello se recurre a la subrutina doshexa dos veces. Se captura primero el byte más significativo, se guarda en DL y se envía a doshexa. Luego se captura el byte menos significativo, se guarda en DL y se llama a doshexa. En el siguiente programa se crea la subrutina cuatrohexa.

SUBRUTINA CUATROHEXA. model small. stack 100 h. code main proc mov dx, 0 a

SUBRUTINA CUATROHEXA. model small. stack 100 h. code main proc mov dx, 0 a 35 fh call cuatrohexa mov ah, 4 Ch int 21 h main endp cuatrohexa proc push dx mov dl, dh call doshexa pop dx ret cuatrohexa endp doshexa proc push dx shr dl, 1 call unhexa pop dx and dl, 0 fh call unhexa pop dx ret doshexa endp unhexa proc push dx push ax cmp dl, 9 jle L 1 add dl, 7 L 1: add dl, 30 h mov ah, 2 int 21 h pop ax pop dx ret unhexa endp end main

PROGRAMA CON DATOS EN MEMORIA. model small. stack 100 h. data num 1 db

PROGRAMA CON DATOS EN MEMORIA. model small. stack 100 h. data num 1 db 78 h, 29 h, 0 A 5 h num 2 dw 9753 h, 1357 h num 3 dd 12345678 h num 4 dq 1122334455667788 h num 5 dt 99887766554433221100 h num 6 dt 1234567890 ABCDEF 1234 h num 7 dt 0 . code main proc mov ax, @data mov ds, ax ; visualizar memoria mov ah, 4 ch int 21 h main endp end main

PROGRAMA CON DATOS EN MEMORIA Este programa tiene varios tipos de datos especificados por

PROGRAMA CON DATOS EN MEMORIA Este programa tiene varios tipos de datos especificados por directivas de definición: db: define número de 1 byte, en este caso se trata de una cadena de tres datos donde cada dato es de 1 byte dw: define número de 2 bytes, en este caso se trata de una cadena de dos números de 2 bytes cada uno dd: define número de 4 bytes dq: define número de 8 bytes dt: define número de 10 bytes Para visualizar cómo se escriben los datos en la memoria, el programa se abre en el debug.

PROGRAMA CON DATOS EN MEMORIA C: Tasm>debug p 1. exe -u 15 D 3:

PROGRAMA CON DATOS EN MEMORIA C: Tasm>debug p 1. exe -u 15 D 3: 0000 B 8 D 315 MOV AX, 15 D 3: 0003 8 ED 8 MOV DS, AX 15 D 3: 0005 B 44 C MOV AH, 4 C 15 D 3: 0007 CD 21 INT 21 -d 15 d 3: 0000 15 D 3: 0000 B 8 D 3 15 8 E D 8 B 4 4 C CD-21 00 78 29 A 5 53 97 57 15 D 3: 0010 13 78 56 34 12 88 77 66 -55 44 33 22 11 00 11 22 15 D 3: 0020 33 44 55 66 77 88 99 34 -12 ef cd ab 90 78 56 34 15 D 3: 0030 12 00 00 - 00 00 00

PROGRAMA CON DATOS EN MEMORIA Obsérvese que en el segmento de datos, DS: 0000,

PROGRAMA CON DATOS EN MEMORIA Obsérvese que en el segmento de datos, DS: 0000, los datos no empiezan al inicio del segmento sino más adelante en un posición difícil de anticipar. En el caso específico del programa, el primer dato se escribe a partir de DS: 000 A, luego los bytes que siguen se escriben de forma correlativa byte por byte, uno tras otro. La primera cadena de bytes aparece en tres posiciones sucesivas: 78 29 A 5 , luego siguen los bytes de num 2: 53 97 57 13 78 56 34 12. Notar que en este caso el primer número de la cadena es 9753 pero en la memoria se escribe como 53 97 como bytes separados, el bytes menos significativo primero y el más significativo después, lo mismo debe decirse del número 1234. Ahora obsérvese como se escribe num 3: 78 56 34 12 , pero se trata del número 12345678 de cuatro bytes, nuevamente la regla de Intel es escribir en primer lugar el byte menos significativo y avanzar en ese orden hasta el byte más significativo.

PROGRAMA CON DATOS EN MEMORIA En este sentido sigue num 4: 88 77 66

PROGRAMA CON DATOS EN MEMORIA En este sentido sigue num 4: 88 77 66 55 44 33 22 11 , que es el número 1122334455667788 de 8 bytes. Siguen tres números de diez bytes cada uno, num 5, num 6 y num 7. El último número es una sucesión de 10 bytes con valores 0 cada uno. Para leer un dato de memoria de cualquier tamaño suele emplearse los punteros del segmento de datos BX y SI o DI. El registro base BX se emplea para apuntar al inicio del grupo de datos y los registros indicadores para desplazarse sobre cada uno de los bytes de la memoria a partir de la posición a la que apunta el puntero BX. En el siguiente avance de programa se leerán algunos bytes y se imprimirán utilizando las subrutinas de los hexas. Sólo se presentará aquí el programa principal.

PROGRAMA CON DATOS EN MEMORIA main proc mov ax, @data mov ds, ax ;

PROGRAMA CON DATOS EN MEMORIA main proc mov ax, @data mov ds, ax ; visualizar memoria lea bx, num 1 mov dl, [bx] call doshexa mov dl, [bx+1] call doshexa mov dl, [bx+2] call doshexa mov ah, 4 ch int 21 h main endp

PROGRAMA CON DATOS EN MEMORIA Cuando se corre el programa se obtiene: C: Tasm>p

PROGRAMA CON DATOS EN MEMORIA Cuando se corre el programa se obtiene: C: Tasm>p 1 7829 A 5 Ha ocurrido lo siguiente: el apuntador [BX] está apuntando al byte 78 que es el inicio de num 1, se lee el primer byte y se imprime. A continuación se apunta al segundo byte con [BX + 1], se lee y se imprime, luego se apunta al tercer byte con [BX + 2], se lee y se imprime. En el siguiente programa se leerán byte por byte los números num 5 y num 6, se sumarán con acarreo y el resultado se grabará en num 7. Luego se leerá byte por byte en el sentido inverso el número num 7 y se imprimirá. Este programa es un ejemplo de cómo realizar operaciones aritméticas con números largos que sólo puede ser guardados en memoria.

PROGRAMA CON DATOS EN MEMORIA main proc mov [bx+si], al inc si loop pun

PROGRAMA CON DATOS EN MEMORIA main proc mov [bx+si], al inc si loop pun 1 ; imprimir mov ax, @data mov ds, ax ; sumar datos largos resultado mov cx, 10 clc mov si, 0 pun 1: mov si, 9 lea bx, num 7 mov cx, 10 pun 2: lea bx, num 5 mov al, [bx+si] lea bx, num 6 mov dl, [bx+si] adc al, dl lea bx, num 7 mov dl, [bx+si] call doshexa dec si loop pun 2 mov ah, 4 ch int 21 h main endp

PROGRAMA CON DATOS EN MEMORIA Obsérvese que la idea de utilizar punteros para apuntar

PROGRAMA CON DATOS EN MEMORIA Obsérvese que la idea de utilizar punteros para apuntar a cada uno de los bytes de cada dato se aplica muy bien a los números largos. Se han leído los dos números num 5 y num 6 byte por byte, empezando por el byte menos significativo: Num 5: 99 88 77 66 55 44 33 22 11 00 Num 6: 12 34 56 78 90 ab cd ef 12 34 Num 7: ab bc cd de e 5 f 0 01 11 23 34 Para imprimir el resultado se ha leído byte por byte num 7 empezando por el más significativo y se ha ido imprimiendo conforme se leía.

PROBLEMAS PROPUESTOS 1. Escribir un programa en lenguaje Assembler que calcule el producto y

PROBLEMAS PROPUESTOS 1. Escribir un programa en lenguaje Assembler que calcule el producto y la división de dos números hexa-decimales. Los datos se almacenaran en memoria antes de ejecutar el programa y la salida será la siguiente: PRODUCTO: NNNN x NNNN = NNNN DIVISIÓN: NNNN / NNNN = NNNN En la que cada N representa un numero hexadecimal.

PROBLEMAS PROPUESTOS 2. Restar dos números largos de 10 bytes cada uno que están

PROBLEMAS PROPUESTOS 2. Restar dos números largos de 10 bytes cada uno que están alojados en la memoria. Imprimir alineados en columnas el primer operando, el segundo operando y luego en una tercera columna el tercer operando. 3. Desarrollar un programa que multiplique dos números largos alojados en la memoria y que imprima el resultado en el monitor después de grabarlo en la memoria. Esbozar el algoritmo de multiplicación que trabaje los operandos byte por byte y minimizar los recursos de memoria. (Sugerencia: emular los algoritmos de multiplicación vistos en el curso de Arquitectura de computadoras).