08/11/2011 1 Instrucciones de 16-bits OPCODE OPERANDO BYTES DESCRIPCION LD HL,(16-bits) 3 Copia el contenido de la locación de memoria especificada por el operando de 16-bits LD (16-bits), HL 3 Copia el contenido del par de registros HL en la locación de memoria especificada por HL LD SP, HL 1 Copia el contenido de HL al apuntador al stack SP JP (HL) 1 Carga el contenido de HL en el contador del programa. Esta instrucción es equivalente a LD PC,HL 5A UNIDAD 5 – PARTE PROGRAMANDO EN EL ENSAMBLADOR DEL Z80 Otoño 2011 Microprocesadores Ejemplo Suma y Resta con Carry Memoria Condiciones Iníciales LD HL,(2050H) EX DE,HL LD (2050H),HL D 85 6F E 2050 3F H 00 00 L 2051 42 D 85 6F E 2050 3F H 42 3F L 2051 42 D 42 3F E 2050 3F H 85 6F L 2051 42 D 42 3F E 2050 6F H 85 6F L 2051 85 Suma y Resta con Carry Esta instrucción sirve para sumar una lista de números tomando en cuenta el carry generado en cada suma También puede ser usada para sumar números de 16-bits Ejemplo: Suma el 2793H y el 3182H y guarda el resultado en la locación de memoria 2050H y 2051H. Suponga que los números se encuentran en BC y DE respectivamente OPCODE OPERANDO ADC ADC ADC ADC SBC SBC SBC SBC DESCRIPCION A,r A, 8-bits A, (HL) A, (IX+d) A,r A, 8-bits A, (HL) A, (IX+d) Suma el operando, carry y el acumulador. El resultado es almacenado en el acumulador. A = OPERANDO + CY + A Resta el contenido del operando y el borrow del contenido del acumulador y el resultado es puesto en el acumulador A = A – OPERANDO – CY Suma y Resta con Carry Memoria Condiciones Iníciales B 27 93 C 2050 XX D 31 82 E 2051 XX 93H (A) LD A,C ADD A,E A 93 XX F A 15 CY =1 F LD L,A LD A,D ADC A,B H 15 L 1H CY CY =1 F 31H (A) LD LD H 59 15 L 2050 15 H A 59 CY =0 F 2051 59 H A 31 + 82H (E) 115H + 27H (B) 59H H,A (2050H),HL A 1 08/11/2011 Suma de 16-bits OPCODE Suma de 16-bits OPERANDO DESCRIPCION ADD HL,BC ADD HL,DE ADD HL,HL ADD HL,SP Suma el contenido del operando (par de registros o apuntador al stack) al contenido del registro HL, y el resultado es puesto en el registro HL. La bandera del carry es alterada para reflejar el resultado de la suma de 16-bits. Ninguna otra bandera es alterada Esta instrucción usa HL como el acumulador de 16-bits Ejemplo LD ADD LD LD ADC LD LD A,C A,E L,A A,D A,B H,A (2050H),HL SLA SLA SLA SLA SLA SLA SLA SLA H H H H L L L L EX HL,BC ADD HL,DE LD (2050H),HL ;Shift a la izquierda 4 posiciones ADD HL,HL 1231 + 1231 = 2462 HL ADD HL,HL 2462 + 2462 = 48C4 HL ADD HL,HL 48C4 + 48C4 = 9188 HL ADD HL,HL 9188 + 9188 = 2310 HL Subrutina ADBYTE Dos números de 32-bits están almacenados en el BUFF1 y BUFF2 respectivamente. La subrutina ADBYTE suma los números y el resultado es almacenado en el BUFF1 Los parámetros de entrada son ADBYTE: ; Esta subrutina suma dos números de múltiples bytes y almacena el ; resultado en memoria, reemplazando el primer numero ; Entrada: Dirección de los números a ser sumados en HL y DE, El tamaño de ; los números en bytes en el registro B ; Salida: Suma almacenada en memoria ; Registros Modificados: B, DE, HL y el acumulador START: XOR A ; Limpia la bandera del carry NEXT: LD A,(DE) ; Carga el byte del BUFF2 ADC A,(HL) ; Suma el byte del BUFF1 LD (HL),A ; Guarda el resultado parcial INC HL ; Actualiza los apuntadores a memoria INC DE DEC B ; Actualiza el contador para la siguiente suma JR NZ, NEXT ; Si el contador es diferente de cero continua Operando 1 apuntado por HL Operando 2 apuntado por DE El tamaño del operando en bytes en B RET Programa Principal Multiplicacion Binaria MAIN: NEXT: LD SP, STACK LD HL, BUFF1 LD DE, BUFF2 LD B,04H ; Inicializa el contador especificando el ; numero de bytes a ser sumado CALL ADBYTE ; Realiza la suma HALT ; Inicializa apuntadores La multiplicación binaria de M × N puede ser realizada por medio de sumar M, N veces. Una forma mas eficaz de multiplicación binaria es el siguiente procedimiento 111 × 101 Paso 1: (111 × 1) 111 Paso 2: Shift izquierdo y suma (111 × 0) + 000 Paso 3: Shift izquierdo y suma (111 × 1) + 111 100011 2 08/11/2011 Subrutina MLTPLY MLTPLY: NEXT: ; Esta subrutina multiplica dos números sin signo ; Entrada: Operando 1 en E y Operando 2 en D ; Salida: Resultado en HL ; Registros Modificados: B, DE, HL y el acumulador LD A, D ; Copia el operando 2 en A LD D,0 ; Limpia D para guardar resultados parciales LD HL,0 ; Limpia HL LD B,08H ; Inicializa el contador a 8 RRA ; Checa si el bit del operando 2 es 1 JR NC, NOADD ; Si no evita sumar el operando 1 ADD HL,DE ; Si el bit es 1, entonces suma el operando 1 DE,HL ; Shift a la izquierda un bit NOADD: EX ADD HL, HL EX DE,HL DEC B ; Decrementa el contador JR NZ, NEXT ; Regresa para obtener el siguiente bit, sino RET Programa Principal MAIN: NEXT: LD SP, STACK LD HL, (BUF1) ; Obten los operandos EX DE, HL ; Copialos en DE CALL MLTPLY ; Multiplica los numeros LD (OUTBUF),HL ; Almacena el resultado en OUTBUF HALT ; termina 3