90 likes | 289 Views
Macroinstrucciones. Nombre MACRO [ Lista de par ámetros separados con coma ] Bloque de Instrucciones ENDM La invocación del mismo es igualmente sencilla Nombre parámetro0 [, parámetro1, ...] La cantidad de parámetros que se le podrán pasar a un Macro tiene un máximo de 16
E N D
Macroinstrucciones • Nombre MACRO [Lista de parámetros separados con coma ] • Bloque de Instrucciones • ENDM • La invocación del mismo es igualmente sencilla • Nombre parámetro0 [, parámetro1, ...] • La cantidad de parámetros que se le podrán pasar a un Macro tiene un máximo de 16 • ElMacro MACRO par0, par1 • mov A,par0 • mov B,par1 • ENDM
Macros • dseg • var: ds 1 • cseg ;inicio un segmento • sjmp inicio • ORG 0x30 • inicio: • mov R0,#4 ;AJJJJJJJJJ • mov var,#5 • ElMacro var,R0 • ElMacro #12,R0 • end • Se compila como: • mov A,var • mov B,R0 • mov A,#12 • mov B,R0 La respuesta es ¡ 5 y 5 ! ¿5 y 4? Noooo ¿En cuanto quedan A y B ?
MACROS • Etiquetas • MDELAY MACRO p1,p2 • LOCAL lazo0,lazo1 • mov R1,p2 • Lazo1: mov R0,p1 • lazo0: djnz R0,lazo0 • djnz R1,lazo1 • ENDM • Iteraciones • IncWDPTR MACRO • REPT 2 • Inc DPTR • ENDM • ENDM • IncWDPTR MACRO p1 • REPT p1 • Inc DPTR • ENDM • ENDM
Macros • Iteraciones IRP nombrevar, < par1, par2, par3, par4 > ………… inc nombrevar ; bloque de instrucciones ………… ENDM ElMacro MACRO IRP val, <R0,R1,R2> inc val ENDM ENDM ElMacro MACRO par0,par1,par2 IRP val, <par0,par1,par2> inc val ENDM ENDM
Macros • Iteraciones • TransmitaHola MACRO • IRPC letra, <HOLA> • jnb TI,$ • clr TI • mov SBUF, #’letra’ • ENDM • ENDM • Sería traducido por: • 0002 3099FD 24+2 jnb TI,$ • 0005 C299 25+2 clr TI • 0007 759948 26+2 mov SBUF, #'H' • 000A 3099FD 27+2 jnb TI,$ • 000D C299 28+2 clr TI • 000F 75994F 29+2 mov SBUF, #'O' • 0012 3099FD 30+2 jnb TI,$ • 0015 C299 31+2 clr TI • 0017 75994C 32+2 mov SBUF, #'L' • 001A 3099FD 33+2 jnb TI,$ • 001D C299 34+2 clr TI • 001F 759941 35+2 mov SBUF, #'A‘ • 36end ¡Ajjjjjjjjjjjjjj!
Rutinas • Programa principal • ……………………… • ……………………… • invocacion de la rutina • Direcc. retorno ……………………… • ……………………… • invocacion de la rutina • Direcc. retorno ……………………… • ……………………… • Rutina: • Bloque de Instrucciones • ret • end • Invocación: lcall dirección 16 bits (3 bytes 64K) • acall dirección 11 bits (2 bytes 2k ) • Stack Pointer: registro de 8 bits, el Reset lo inicializa en 0x07 • mov SP,# UltimaVariable
Rutinas • Las invocacionespuedenanidarse • Dseg at 0x30 • Ultima: ds 1 • Cseg • Programa: movSP,#Ultima • ………………… • (1000) lcall Rutina1 • (1003) • (2000)Rutina1: ………………… • lcall Rutina2 • (2005) • ret ;(1) • (3000)Rutina2: ………………… • ret ;(2) (SP) = (0x30) (PC) = (0002) (SP) = (0x30) (PC) = (1003) (sp+1) = (0x31) 0x31 -> 03 (sp+1) = (0x32) 0x32 -> 10 (PC) = 0x2000 (sp) = 0x32 (pc) = 10xx (sp-1) = 0x31 (pc) = 1003 (sp-1) = 0x30 (SP) = (0x32) (PC) = (2005) (sp+1) = (0x33) 0x33 -> 05 (sp+1) = (0x34) 0x34 -> 20 (PC) = 0x3000 (sp) = 0x34 (pc) = 20xx (sp-1) = 0x33 (pc) = 2005 (sp-1) = 0x32
Salvar Registros Mono Con Navaja dec SP dec SP push Dpl push Dph ret largoJMP equ 3 Switch: mov A,R1 mov B,#largoJMP mul AB mov R0,SP Loop: jz Fin inc @R0 dec A sjmp Loop Fin: ret • push directo • pop directo • push Acc • push B • push Dpl • push Dph • ;…………. • pop Dph • pop Dpl • pop B • pop Acc • ret SP -> PCl PCH SP+1 Acc SP+1 B SP+1 Dpl SP+1 Dph CSEG at 0x1A00 ;los LJMP deben ;estar dentro de una ;misma página Mov R1,otra Lcall switch Ljmp adonde0 Ljmp adonde1 Ljmp adonde2 Ljmp adonde3 Ljmp adonde4 Ljmp adonde5 using 3 push AR4 ;………….. pop AR3
Pasaje y Retorno de parámetros a las Rutinas • En registros: A, B, DPTR, etc • En Bancos • Banco0 equ 0x00 • Banco1 equ 0x08 • Banco2 equ 0x10 • Banco3 equ 0x18 • mov PSW,#Banco0 • ;………………………. • using 3 • mov AR0, Dpl • mov AR1, Dph • mov AR2, cuanto • lcall DecDptr • mov Dpl,AR6 • mov Dph,AR7 Cero EQU 0 Using 3 DecDptr: clr C mov A,AR0 subb A, Ar2 mov Ar6,A mov A,AR1 subb A,#Cero mov AR7,A ret