Las macros de definen así:
.MACRO nombre_de_la_macro
..... instrucciones a ejecutar
.ENMACRO
Un ejemplo de su uso puede ser las instrucciones del inicio de pila.
Cuando se quiera iniciar la pila solamente hay que colocar INICIA_PILA.
Ya que no se cuenta con una instrucción para Adherir un Inmediato a un Registro (Rn +k), pero sí la instrucción que resta (Rn-k), podemos crear una macro que realice esta operación.
Esta macro de nombre "ADDI" resta al registro que es identificado por "@0" el negativo del inmediato "@1", esto es @0 - (-(@1)) = @0 + @1 . Si queremos sumarle al Registro R19=127 el inmediato 46.
Luego de esto R19=127+46 = 173
Ahora para hacer más manejable el código podemos crear un archivo que incluya todas nuestras macros. Nuestras subrutinas también las pondremos en otro archivo.
Nuestro proyecto final queda.
No logro entender como se usa o que se refiere @0,1... podrias ampliar la explicacion gracias.
ResponderEliminarLa macro es como una "función" a la cual le pasas algunos parámetros, en éste caso esos parámetros están representados por @0,@1,@2...hasta @n (dependiendo de la cantidad de parámetros que le pases), esos parámetros son los que debes usar dentro de la macro.
ResponderEliminarPor ejemplo:
;**************************************
;**SINTAXIS: MULT_16X8 REG1,REG2,REG3
;** (REG1:REG2)x(REG3)=(R4:R3:R2)
;**************************************
.MACRO MULT_16X8
MUL @1,@2
MOVW R3:R2,R1:R0
MUL @0,@2
MOV R4,R1
ADD R3,R0
BRCC PC+2
INC R4
.ENDMACRO
;********************************************
Esta macro multiplica (8bits)x(16bits)
Llamas a la macro así: MULT_16X8 REG1,REG2,REG3
y el compilador toma @0=REG1, @1=REG2, @2=REG3 y en base a eso se realizan las operaciones que se encuentran dentro de la macro.
Espero esta explicación te ayude...
Excelente explicacion! aprecio mucho tu ayuda y tus post son extraordinarios ya que toda esta info solo la encuentras en C. Sigue con el buen trabajo ;)
ResponderEliminarPD: Como cambias el color de tus macros? podrias hacer un post de esto si no es mucho pedir?
atte. Jahir
Para darle color tienes que ir a: "C:\Archivos de programa\Atmel\AVR Tools\AvrStudio4\edit" allí encontraras un archivo llamado "AvrStudio_asm.ini" (realiza una copia antes de modificarlo) ábrelo con algún editor de texto. Dentro de ese archivo hay una parte que dice "[ColorGroups]", debajo de esto esta la cantidad de grupos y luego cada uno de ellos; para agregar un grupo (en este caso las macro) sumale 1 a "NumGroups" y despues del ultimo grupo coloca el tuyo. Esto queda algo asi...
ResponderEliminar[ColorGroups]
NumGroups =9
Group1 =Text
Group2 =Text Selection
Group3 =Number
Group4 =Operator
Group5 =Comment
Group6 =Keyword
Group7 =String
Group8 =Disasm
Group9 =Macros_m
Luego mas abajo y antes de "[Keywords]" debes agregar esto:
[Macros_m]
Foreground =128,0,128
Background =255,255,255
BackColorAutomatic =1
ForeColorAutomatic =0
DisplayName=Macros_m
Configurable=1
y para terminar después de todas las "[Keywords]" agrega 1 a 1 tus macros, por ejemplo:
INICIA_PILA =Macros_m
ADDI =Macros_m
delay_ms =Macros_m
delay_us =Macros_m
delay_s =Macros_m
.
.
.
.
eso es todo...!!!
Muchas gracías Ojala no dejes de subir prograamas en ensamblador para los que apenas estamos empezando, una pregunta me llama la atencion el poder hacer las luces del auto fantastico
ResponderEliminarSi tiene razón como se podrian hacer las luces del auto fantastico en ensamblador usando operaciones AND, OR, NOT con desplazamientos
ResponderEliminarYo creo que podría ser algo así.
Eliminar.include "m128def.inc"
.CSEG
.ORG 0x0000 RJMP INICIO
//**************************************
INICIO:
ldi r16,byte1(RAMEND)
out spl,R16
ldi r16,byte2(RAMEND)
out sph,R16
ldi R16,0b_1111_1111
out DDRD,R16
LOOP:
ldi r18,0b_11_00_00_00
out PORTD,r18
nop
LOOP_1:
delay_ms
in r16,PIND
lsr r16
out PORTD,r16
brcc LOOP_1
ldi r18,0b_00_00_00_11
out PORTD,r18
nop
LOOP_2:
delay_ms
in r16,PIND
lsl r16
out PORTD,r16
brcc LOOP_2
rjmp LOOP