You are on page 1of 3

S d ng Macro trong l p trong l p trnh ASM cho 8051

Vn ny khng phi l mi l trong lp trnh, n l mt trong nhng tin ch kh hay m trnh dch mang li. i vi mi trnh dch th cch nh ngha macro cng khc nhau, bi vit ny ti ch ni v cch nh ngha s dng macro v mt s macro b ch cho trnh dch ASEM51 thng dng nht hin nay. Li ch ca n l g, mt v d n gin trc khi bt u, l php so snh ln hn trong ASM, vit nh cc c Carry, hay c Z, c OV cho mi lnh i khi gy ra ln ln, vy nu nh ngha thnh cng 1 ln th s dng c cc ln khc vi 1 t gi nh, ch khng phi l cc bit V d v nh ngha v s dng Macro Jump If Great Than, s nhy n 1 nhn nu gi tr ca thanh ghi A ln hn... PHP Code: ;//nh ngha %*DEFINE (JGT (VALUE, LABEL)) ( CJNE A, #%VALUE+1, $+3 JNC %LABEL ) ;//s dng %JGT(55h, GREAT_THAN) ... GREAT_THAN: ... C th, nhng li ch s dng macro nh sau: [+] Chng trnh ngun s dng Macro d c hn, dng m gi nh, c th nhn chng trnh mt cch tng qut [+] Chng trnh nhn ngn gn hn (thc t m sinh ra khng t hn) [+] Gim thiu cc li, chnh sa hng lot [+] Khng bn tm n x l chi tit qu mc nh ngha Macro: PHP Code: %*DEFINE (Biu gi) (ni dung Macro) V d n gin nht, ct thanh ghi DPTR v ngn xp: PHP Code: ;//nh ngha %*DEFINE (PUSH_DPTR) ( PUSH DPH PUSH DPL ) ;//s dng %PUSH_DPTR Tip theo, vic truyn tham s cho Macro gip chng ta ty bin mi Macro cho nhiu tnh hung trong chng trnh: PHP Code: %DEFINE (tn macro (danh snh tham s)) (Ni dung macro) V d v Macro c tham s, Skip If Equa, nu gi tr ca A khc gi tr ca tham s, th b qua lnh tip theo, (ging lnh ca Pic CPFSEQ )

PHP Code: ;//nh ngha %*DEFINE (SIE(VALUE)) ( CJNE A,#%VALUE, $+3 ) ;//S dng %SIE(20h) SJMP BANG KHONG_BANG: ... BANG: ... Tip theo l s dng cc nhn cc b trong Macro PHP Code: ;//Ch l ni dung nm gia cp du [] l ty chn, c th c hoc kh ng %*DEFINE (tn macro[(danh sch tham s)]) [LOCAL danh sch nhn] (ni dung Macro) V d v s dng nhn cc b, nh ngha macro gim gi tr ca thanh ghi DPTR (ch c lnh INC DPTR m khng c, nn ci ny gi l ...t ch ) PHP Code: ;//nh ngha %*DEFINE (DEC_DTPR) LOCAL SKIP (DEC DPL MOV A,DPL CJNE A,#0FFH, %SKIP DEC DPH %SKIP: ) ;//s dng %DEC_DPTR Ngoi ra cn c 1 s macro c nh ngha sn, v cng vic ca chng ta l s dng cho ng mc ch [+] REAPEAT v d, v Macro lp li 100 ln lnh nop PHP Code: %REPEAT(100)(NOP) ;//iu ny chng mang li li lc g ln lao ngoi tr ngoi chuyn ;//bn khng mt cng ngi g 100 ln ci lnh ny ;//c ngha l trnh dch vit gip bn 100 ln y thi ;//cng c ngha l m sinh ra cng c 100 ci lnh ny [+] IF THEN PHP Code: NUM EQU 1 %IF(NUM) THEN ( ;//code y, nu NUM c nh ngha khc 0 ) ELSE ( ;//code ny c s dng nu NUM c nh ngha l 0 )

Ngoi ra cn 1 lu , nu bn nh ngha Macro m sau , ni dung xung dng phi c 1 du * PHP Code: %*DEFINE (EXAM(VALUE,LABLE)) *(CJNE A,#%VALUE,%LABEL) v sau y l mt s Macro thng dng su tp c PHP Code: ;//[*] Nhy n "LABEL" nu A nh hn "VALUE" %DEFINE (JLT (VALUE, LABEL)) *(cjne a,#%VALUE, $+3 jc %LABEL) ;//-------------------------------------------;//[*] Nhy n "LABEL" nu A ln hn "VALUE" %DEFINE (JGT (VALUE, LABEL)) *(cjne a,#%VALUE+1, $+3 jnc %LABEL) ;//-------------------------------------------;//[*] Nhy n "LABEL" nu A nh hn hoc bng "VALUE" %DEFINE (JLE (VALUE, LABEL)) *(cjne a,#%VALUE-1, $+3 jc %LABEL) ;//[*]Nhy n "LABEL" nu A ln hn hoc bng "VALUE" %DEFINE (JGE (VALUE, LABEL)) *(cjne a,#%VALUE, $+3 jnc %LABEL) ;//[*] Nhy n "LABEL" nu A nm ngoi (Out Of Range) di "lower" & "u pper" %DEFINE (JOR (lower,upper, LABEL)) *(cjne a,#%lower, $+3 jc %LABEL cjne a,#%upper+1, $+3 jnc %LABEL ) ;//[*]v mt s v d PS: Tham kho sch ca thy Tng Vn On, H Vi iu Khin 8051 ..v..v

You might also like