Sesión 3

Anuncio
Sesión 3
Desplazamiento y rotación de bits
Computadores II
Rodrigo Santamaría
Índice
●
Instrucciones de desplazamiento y rotación de
bits
●
ROL, ROR, LSL/ASL, LSR, ASR
●
Aritmética BCD
●
Multiplicaciones con sumas y desplazamientos
Instrucciones de desplazamiento
●
X puede ser A ó B en estas instrucciones
●
L/R indica si es para izquierda o derecha
●
Rotación: ROLx, RORx.
●
Desplazamiento (shift):
●
Lógico: LSRx, LSLx
●
Aritmético: ASRx, ASLx
●
LSL es equivalente a ASL
●
ASR y ASL varían en la gestión del bit más
significativo
Instrucciones de
desplazamiento y rotación
La sintaxis es ROLx, x puede ser A o B
●L/R dependiendo si es izquierda o derecha
●S viene de Shift
●
Ejemplo
;Mostrar en pantalla el contenido de A en hexadecimal
.area PROG (ABS)
; definimos una constante
fin
.equ 0xFF01
pantalla .equ 0xFF00
.org 0x100
.globl programa
temp:
.word 0 ; una variable temporal
programa:
lda #28 ; pongamos este nUmero como prueba
; imprimamos 0x
ldb #'0
stb pantalla
ldb #'x
stb pantalla
; primero imprimamos la primera cifra hexadecimal
tfr a,b
lsrb
lsrb
lsrb
lsrb
; en B estA la primera cifra, de 0 a 15
std temp
clra
addb #246
; el nº máximo en 8 bits es 255
adca #0
; si B>=10, se desborda y hay acarreo
ldb #'A-'9-1
mul
;salto (o no) de los asccii de nº a los de letras
addb temp+1 ; añadimos 7 si es una letra
addb #'0
; añadimos siempre 48
stb pantalla
A
B
1C
??
1C
48
...
1C
1C
x4
1C
00
00
00
00
01
07
00
01
49
temp temp+1
1C
01
temp temp+1
1C
01
Ejemplo
; ahora imprimimos la segunda cifra hexadecimal
ldb temp
lslb
lslb
lslb
lslb
lsrb
lsrb
lsrb
lsrb ; en B estA la segunda cifra, de 0 a 15
std temp
clra
addb #246
adca #0 ; en A hay un 1 si la cifra es >= 10
ldb #'A-'9-1
mul
addb temp+1
addb #'0
stb pantalla
; imprimamos un salto de lInea al final
ldb #'\n
stb pantalla
...
A
B
00
1C
00
C0
x4
00
0C
x4
00
0C
1 00
01
02
01
07
00
07
00
13
00
43
00
00
0C
temp temp+1
Pregunta
●
Por qué no es posible cambiar:
clra
addb #246
adca #0 ; en A hay un 1 si la cifra es >= 10
●
Por:
addb #246
clra
adca #0 ; en A hay un 1 si la cifra es >= 10
Aritmética BCD
●
●
Aritmética para codificar un decimal en
binario (Binary Coded Decimal)
En vez de pasar a binario el decimal completo,
cada dígito se codifica por separado como 4
bits
●
●
27 → 0010 0111
Como lo hemos almacenado en 4 bits en vez
de 3, se ve claro el valor “decimal” en
hexadecimal
●
27 → 0010 0111 → 0x27
Aritmética BCD
●
●
Problema: sumas y restas en BCD nos dan el
resultado en hexadecimal, no en BCD
DAA: Decimal Adjustment for A.
●
Corrige la operación anterior de suma o resta en A
●
Permite hacer sumas y restas en BCD:
lda #0x06; Vamos a hacer 6+7 en BCD
adda #0x07; En A hay ahora 0xD (13)
daa; tras el ajuste, en A hay 0x13
Ejemplo
●
Suma de dos números de 16 bits: 6+7
0x100
0
0x101
6
0x102
0
0x103
7
0x100
0
0x101
6
0x102
0
0x103
7
lda 0x101
A
6
0x106
0
0x107
3
C ?
adda 0x103
lda 0x100
A
A
3
C 1
0
C 1
adca 0x102
A
C 0
1
sta 0x107
0x106
1
0x107
3
sta 0x106
Multiplicaciones por 2
●
MUL es una operación cara, y a veces
queremos multiplicar algo mayor a 8 bits
●
Usar LSL: equivale a multiplicar por 2
lslb ; B*2
lslb ; B*2*2 = B*4
lslb ; B*2*2*2 = B*8
●
B*5=B*(4+1)
stb temp
lslb
lslb
addb temp
;
;
;
;
guardamos B
B*2
B*4
B*4+B = 5*B
Ejercicio 2
●
Añadid código a los ejercicios de suma y resta
de la sesión anterior para que se imprima el
resultado de la operación por la pantalla en
hexadecimal, de modo que no sea necesario
invocar el depurador para conocer el resultado
Ejercicio 5
●
Haced un programa en ensamblador del 6809
de modo que:
1.El usuario teclee dos cifras
2.El programa imprima un espacio
3.El usuario teclee otras dos cifras
4.La salida del programa sea como la que se muestra
para el siguiente ejemplo:
–
–
–
●
37 17
37+17=54
37-17=20
Usad para ello aritmética BCD. No se debe hacer
ningún control acerca de los valores introducidos.
Ejercicio 6
●
Repetid el ejercicio anterior pero realizando una
multiplicación aprovechando la instrucción
MUL. Ahora no debéis usar aritmética BCD
pues la instrucción DAA no funciona con MUL.
Tampoco saquéis el resultado por la pantalla,
pues aún no sabemos cómo hacerlo, sino
miradlo con el depurador.
Ejercicio 8
●
Haced un programa en que el usuario
introduzca cuatro cifras decimales y, a la salida
del programa, quede en el registro X el número
introducido en formato BCD y en el registro D el
número introducido tal cual
Descargar