Vous êtes sur la page 1sur 2

;* ;* "div8u" - 8/8 Bit Unsigned Division ;* ;* This subroutine divides the two register variables "DD8U" (dividend) and

;* "DV8U" (divisor). The result is placed in "DRES8U" and the remainder in ;* "DREM8U". ;* ;* Number of words: 14 ;* Number of cycles: 97 ;* Low registers used: 1 (DREM8U) ;* High registers used : 3 (DRES8U/DD8U,DV8U,DCNT8U) ;* ;************************************************************************* ** Al principio solo son comentarios por el asterisco te dice q el programa es una division de 8/8 bist el dividendo es la variable DD8U , el divisor es DV8U y el resultado se almacenara enDREM8U. .NOLIST .INCLUDE m164pdef.inc .LIST Luego ya inicia el programa con las cabezeras corespondientes ese include te dice q puedes usar todas las intrucciones q trabajen con el atmega164 y el list es para q te detalle el programa en.. no recuerdo jujiiiji ;***** Subroutine Register Variables .DEF DREM8U = R15 ; REMAINDER .DEF DRES8U = R16 ; RESULT .DEF DD8U = R16 ; DIVIDEND .DEF DV8U = R17 ; DIVISOR .DEF DCNT8U = R18 ; LOOP COUNTER Luego defines las etiquetas es decir q lo q le designes por ejemplo a REMAINDER se guardara en el registro 15 de tu memoria de datos ;***** Code ORG 0x00 Este ORG viene siempre q utilices lo q son tablas y se va a empezar a guardar desde la localidad 0x00 LDI DD8U,76 Este ldi carga un valor a un registro en este caso 76 le da a dd8u direccionamiento directo LD DV8U,24 Este ld carga lo que tenga el registro 24 a dv8u direccionamiento indirecto En lo de micros esta una hoja escrita a mano y a color que te esplica resumido la sintexis de las instrucciones utilizadas. DIV8U: emnpieza la subrutina div8u SUB DREMU,DREM8U ; clear remainder and carry Realize una resta dremu=dremu-.drem8u es decir el resultado se guardara en dremu LDI DCNT8U,9 ; init loop counter es un contador dcnt8u=9 D8U_1: empieza subrutina d8u_1

ROLE DD8U ; shift left dividend no existe ninguna instruccin role, lo q si hay es rol q realiza una division para 2 , es decir lo q estaba en tu b7 se va a la bandera del carry, lo del b6 se va al b7, lo del b5 se va al b6 y asi sucesivamente hasta q lo q contena anteriormente el carry se va al b0 DEC DCNT8U ; decrement counter decrement en uno el contador BRN D8U_2 ; if done de igual aqui no existe una instruccion brn pero si hay brne que compara q la bandera del llevo (z) sea 0 y si es sero salta k numero Ejm: Brne 3 en este caso veria q el contador q la precede sea cero es decir q dcnt8u=0 para saltar a la lnea o como es este programa a la instruccin d8u_2 si dcnt8u no es cero entonces continua con la siguiente linea RJMP FIN ; return D8U_2: empieza la subrutina d8u_2 ROL DREM8U ; shift dividend into remainder hace 1 division para dos SUB DREM8U,DV8U ; remainder = remainder divisor realize la resta BRCC D8U_3 ; if result negative si el carry es cerro debe ir a la subrutina d8u_3 o sino realizar la siguiente instruccion ADD DREM8U,DV8U ; restore remainder realize una suma drem8u=drem8u+dv8u CLC ; clear carry to be shifted into result limpia el carry es decir c=0 RJMP D8U_1 ; else con rjmp siempre realize un salto, es este caso siempre q llegue a esta linea saltara a la instruccion d8u_1 D8U_3: inicia la instruccion d8u_3 SEC ; set carry to be shifted into result le da al carry uno C=1 RJMP D8U_1 SALTARA A d8u_1 FIN: RJMP FIN se quedara en un lazo infinito porq siempre estar saltando a la subrutina fin q esta en la misma lnea, pero para q sea una subrutina le falta los dos puntos

Vous aimerez peut-être aussi