Está en la página 1de 5

ARQUITECTURA – 2023

Trabajo Práctico Nº 1 – Segunda Parte

Assembler
Ejercicios Avanzados
1. Escriba un programa que, dado un número IEEE754 de precisión simple,
almacenado en la variable numeroReal, copie el exponente del número
en la variable exponente y luego invierta el signo del número. Utilice la
siguiente declaración de variables:

.data

nroReal DD -0.000065 ; En IEEE es B888509C, pero en

; little endian queda: 9C 50 88 B8

exponente DB ?

2. Escriba un programa que convierta un carácter ASCII a decimal. El


carácter está almacenado en caracter. Si el carácter es un número válido
("0", "1", ... , "9"), debe convertirlo a decimal y almacenarlo en la variable
digito; en caso contrario, debe almacenar FFh en digito.

3. Realice un programa que almacene en la variable inv el contenido


invertido de la variable var, de acuerdo al siguiente formato:

var = b7b6b5b4b3b2b1b0  inv = b0b1b2b3b4b5b6b7

Emu8086 Debugger
4. Dado el programa que aparece a continuación, ejecutar paso a paso en el
Turbo Debugger y contestar:

a. ¿Cuál es la dirección de memoria de la variable numeros?


b. Indicar el estado de la pila (Dirección de Pila - Valor) luego de la
instrucción 0016h – PUSH BP
c. ¿Cuál es el valor de BX luego de la segunda iteración en la
subrutina?
d. ¿Qué dirección de memoria tiene la variable resultado y con qué
valor termina?
e. ¿Qué función cumple la subrutina?

1
.model small
.stack
.data
numeros DW 15, 22, 37, 46, 00h
resultado DW ?
.code
inicio:
mov ax, @data
mov ds, ax
mov ax, offset numeros
push ax
call subrutina
pop ax
mov resultado, cx
mov ax, 4C00h
int 21h
subrutina proc
push bp
mov bp, sp
mov bx, ss:[bp + 4] ; Direccion del
Arreglo
mov cx, 0
recorrer:
mov dx, ds:[bx]
cmp dx, 0
je fin
add cx, dx
add bx, 2
jmp recorrer
fin:
pop bp
ret
subrutina endp
end inicio

2
Subrutinas
5. Escriba la subrutina mayor que, dados dos números enteros de 16 bits
recibidos en los registros BX y CX, devuelva en AX el mayor de los dos.

6. Reescriba la subrutina mayor pero recibiendo como parámetros las direcciones de


los valores en SI y DI.

7. Dadas dos variables enteras de 16 bits, n1 y n2, se quiere almacenar la mayor de


ambas en la variable max. Realice dos programas, uno con cada una de las versiones
de la subrutina mayor de los puntos anteriores.

8. Reescriba el ejercicio 9 usando una subrutina llamada caracterADecimal para


realizar la conversión. La subrutina debe recibir el carácter a convertir en AL y
devolver el valor decimal en AH. Si AL no es un carácter válido, debe devolver AH =
Ffh.

9. Escriba un programa que cuente la cantidad de bits 1 en las variables dato8 (de 8
bits) y dato16 (de 16 bits). Crear dos subrutinas:

a. contarUnosByte que cuente el número de bits 1 en un byte. El byte debe ser pasado
en AL y el conteo devuelto en CX. Por ejemplo, si la subrutina recibe AL =
00101110, debe devolver CX = 4.

b. contarUnosWord que cuente el número de bits 1 en una palabra (2 bytes) invocando


dos veces a la subrutina escrita en el inciso a (una vez para la parte alta y otra vez
para la parte baja). La palabra es pasada en AX y el conteo devuelto en CX.

10.Grafique el estado de la pila y los registros afectados en cada paso del siguiente
fragmento de código Assembler. Suponga que la pila está inicialmente vacía.

mov ax, offset Var1


push ax
mov ax, offset Var2
push ax
call Subrutina
...
Subrutina proc
push bp
mov bp, sp
mov si, ss:[bp + 4]
mov di, ss:[bp + 6]

3
...
pop bp
ret 4
Subrutina endp
11.Escriba la subrutina mayorArreglo que encuentre el mayor de los
números de un arreglo de words. La dirección del arreglo y su longitud se
reciben en la pila. El mayor número debe ser devuelto en AX.

12.Escriba la subrutina longString que recibe la dirección de un string


terminado en 0 en la pila y devuelve su longitud en AX.

13.Realice una subrutina llamada contarPalabras que reciba la dirección de


un string terminado en 0 en la pila y devuelva en AX la cantidad de
palabras que contiene el string.

14.Se tienen dos variables, str1 y str2. Realice un programa que concatene
ambos strings, guardando el resultado en str1. Para ello, escriba la
subrutina concatenar que reciba la dirección de los strings en la pila y
concatene el 2° al 1°. (Asuma que hay suficiente espacio en memoria en
el primer string para almacenar la concatenación).

Ejemplo. Se recibe:

Dir. de retorno
Dir. str2  |P|E|R|E|Z|0|
Dir. str1  |J|U|L|I|A|N| |0|

Al finalizar la subrutina, el str1 debe convertirse en |J|U|L|I|A|N|


|P|E|R|E|Z|0|

4
Bibliografía
1. Ruggiero, M., Addante, P. y Cicerchia, L. (2014) Assembler – Guía de
Estudio. Cátedra Arquitectura - Universidad Nacional del Noroeste de la
Provincia de Bs. As. (UNNOBA).

También podría gustarte