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