El ensamblador PIC no tiene instrucciones de multiplicación y división. La multiplicación y la división se logran mediante suma, resta, movimiento hacia la izquierda y hacia la derecha y bucles. Simplemente no lo entiendo.
Mire esta variable personalizada hipotética DAT, que es un byte de variable alienígena sin signo con un valor binario de 03H, es decir, B' 00000011' Después de ejecutar la instrucción de desplazamiento a la izquierda RLF DAT, DAT se convierte en B'00000110' == 06H, y luego ejecutar la instrucción de desplazamiento a la izquierda RLF DAT, DAT se convierte en B'00001100' == 0CH == 12, y DAT se convierte en B'00001100 ' == 0CH == 12. DAT se convierte en B'00001100' == 0CH == 12. Se puede ver que cada desplazamiento hacia la izquierda de un número binario de longitud de caracteres sin desbordamiento equivale a multiplicar por 2. Si el bucle se desplaza hacia la izquierda dos veces se multiplica por 4, tres veces se multiplica por 8, cuatro veces se multiplica por 16…. Entonces, sin desbordamiento hacia la izquierda o la derecha o la derecha o la derecha o la derecha o la derecha o la derecha o la derecha o la derecha, el número se multiplica por 16. Cuando se desborda, el desplazamiento hacia la izquierda o hacia la derecha se multiplica o divide por N por 2 (N es el número de turnos)
Qué hacer si se desborda, por ejemplo, el valor DAT es B'11001100', después de ejecutar RLF El resultado de DAT debe ser 110011000, pero un byte solo tiene 8 bits (si es un símbolo con solo 7 bits válidos, el bit más alto es positivo o negativo), entonces DAT = B'10011000', y el original El bit 1 más alto se convierte en El indicador de redondeo C se elimina, por lo que puede usar la variable personalizada DAT1 para cambiar C a DAT1. Luego, los dos números DAT1: B'00000001' y DAT: B'10011000' se suman para formar una variable entera sin signo de 16 bits, B' 0000000110011000'== 198H == 408.
El desplazamiento solo puede implementar dos operaciones relacionadas de multiplicación o división. Si desea implementar operaciones de multiplicación y división como 3, 5, 7, etc., debe utilizar sumas y restas cíclicas. Por ejemplo, 21*3 suma 21 a sí mismo tres veces:
MOVLW 03H
MOVWF LOOP envía 3 a la variable de recuento de bucles personalizada LOOP
MOVLW 15H; ; Enviar el número decimal 21 (15H) al registro de trabajo
ADDLW 15H; Agregar W y el número inmediato 15H
DECFSZ LOOP Determinar si se ha agregado tres veces
p>GOTO $-2; si la operación de multiplicación no se completa, vuelva a llamar a la declaración anterior.
NOP; si se completa la operación de multiplicación, estoy acostumbrado a agregar una declaración NOP para mostrar la diferencia.
Entonces, ¿por qué usar el desplazamiento? ¿No es suficiente realizar un bucle directo con la suma? resta? Esto también tiene que ver con la eficiencia de las operaciones matemáticas, el desplazamiento utiliza menos declaraciones y es más rápido (al multiplicar números más grandes). Por ejemplo, cuando se usa 67*67, la fórmula del primer lado es 67*(64 3) = 67*64 67*3. Luego, en este momento, primero puede desplazar 67*64, que es más rápido en el cálculo. y luego agregue 67*3 al resultado. Y debido a que el resultado debe ser un byte más en el rango de 0 ~ 255, se deben usar dos bytes.