Fichero de texto para el ensamblador de la máquina sencilla 1000 4000 20 Tipo Numeración hexadecimal ;se definen llamadas para cada uno de los ;procesos aritméticos CALL SUMAR CALL RESTAR CALL MULTI CALL DIVIDIR ;tras dividir, el programa finaliza saltando ;a la última dirección de memoria JMP [FFFFH] SUMAR: LDA 4000H ;cargamos el primer sumando en el acumulador MOV A,B ;lo movemos al registro B LDA 4001H ;cargamos el segundo sumando en el acumulador ADD B ;lo sumamos con el registro B STA 4006H ;almacenamos el resultado en la dirección de memoria 4006H RET ; volvemos al comienzo para procesar el siguiente CALL RESTAR: LDA 4001H ;cargamos el valor del sustraendo en el acumulador MOV A,B ;lo movemos al registro B LDA 4000H ;cargamos el valor del minuendo SUB B ;le restamos el sustraendo STA 4007H ;almacenamos el resultado en la dirección de memoria 4007H RET ;volvemos al comienzo para procesar el siguiente CALL MULTI: LDA 4000H ;cargamos el multiplicando en el acumulador MOV A,B ;lo movemos al registro B LDA 4001H ;cargamos el multiplicador en el acumulador MOV A,C ;lo movemos al registro C MVI 0,A ;inicializamos el acumulador y el registro D (usado para acarreo) a 0 MVI 0,D ;para evitar que se solapen con otros posible valores existentes en ellos BUCLE: ;creamos un bucle para sumar el multiplicando tantas veces como unidades tenga el multiplicador ADD B JC CARRY ;en caso de existir acarreo en la suma, saltamos a una instrucción que incrementa en 1 el valor del registro D RETCARRY: ;el final del proceso de incremento de D por acarreo vuelve a este punto DER C ;reducimos en una unidad el multiplicador JZ FINMULTI ;si esa operación da 0 finaliza la multiplicación y se procede a escribir en memoria los resultados JMP BUCLE ;en otro caso volvemos a ejecutar el bucle para realizar de nuevo la suma y la reducción en 1 de C FINMULTI: STA 4003H ;almacenamos el resultado (L) en la dirección de memoria 4003h MOV D,A ;cargamos en el acumulador el valor del acarreo STA 4002H ;almacenamos el resultado (H) en la dirección de memoria 4002 RET ;volvemos al comienzo para ejecutar el siguiente CALL CARRY: ;operación que se realiza en caso de existir acarreo en las sumas de la multiplicación INR D ;incremento en 1 unidad el registro D usado para el acarreo en las sumas de la multiplicación y que es el dato H del resultado de la misma JMP RETCARRY ;continuación de la multiplicación tras hacerse cargo del acarreo DIVIDIR: MVI 0,A ;inicializamos a 0 los valores del acumulador (resto) y del registro C (cociente) MVI 0,C LDA 4001H ;cargamos en el acumulador el valor del divisor MOV A,B ;lo movemos al registro B LDA 4000H ;cargamos en el acumulador el valor del dividendo RETCABE: CMP B ;comparamos ambos valores JC NOCABE ;si se activa el flag C quiere decir que la división "no cabe" al ser mayor el divisor que el dividendo, por lo que pasamos a la instrucción de almacenar los resultados JMP CABE ;si no se activa el flag C, quiere decir que la división "cabe", por lo que pasamos al bucle de restas sucesivas CABE: SUB B ;restamos el valor del divisor al dividendo INR C ;incrementamos en una unidad el cociente JMP RETCABE ;volvemos a la comparación con el nuevo dividendo, al que le hemos realizado una resta NOCABE: STA 4005H ;cuando "no quepa" la división se almacenará el acumulador como resto en la dirección 4005H MOV C,A ;moveremos el registro C al acumulador STA 4004H ;y lo almacenaremos como cociente en la dirección 4004H RET ;volveremos al comienzo para ejecutar la siguiente instrucción, que se trata de una lectura de la última dirección de memoria, con lo que el programa finalizará. ---- DaToS ---- 19 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00