|
用!宏!這部分內(nèi)容可能需要新版的編譯器,內(nèi)容可有可無(wú),也偏簡(jiǎn)單
眾所周知,匯編是一個(gè)底層語(yǔ)言,但有時(shí)候會(huì)遇到很多很牛馬的情況,所以有了宏,宏簡(jiǎn)單來(lái)說(shuō)就是在代碼交給編譯器前進(jìn)行一系列操作,比如關(guān)鍵字替換,復(fù)制粘貼之類(lèi)的
首當(dāng)其沖就是常量
比如這里有一個(gè)硬件,在每次開(kāi)頭都要傳入一個(gè)特殊代碼,比如說(shuō)是15吧,你不可能每次都手打
哦,你手打了,那邊剛傳來(lái)消息,那個(gè)芯片不用了,所以啟動(dòng)代碼改成1了……
所以我們需要一個(gè)標(biāo)記,本質(zhì)來(lái)說(shuō),就是用EQU后面的替換點(diǎn)EQU前面的(實(shí)際比這個(gè)情況復(fù)雜,只能暫且這么理解)
好了,我們每次發(fā)送的時(shí)候只需要這樣就行了
- MOV R7,#CMD_START
- CALL SENT
復(fù)制代碼 很簡(jiǎn)單,對(duì)吧,我們?cè)搼?yīng)付下一個(gè)牛馬活計(jì)了
比如有一個(gè)東西,需要進(jìn)行固定的序列來(lái)運(yùn)行,假如是發(fā)送命令函數(shù)沒(méi)法用,手寫(xiě)又犯惡心,所以我們干脆定義一段宏
- <div>宏名字 MARCO 變量</div><div>宏內(nèi)容</div><div>ENDM</div>
復(fù)制代碼 在這個(gè)例子里面,我們就這樣寫(xiě)- SENT_CMD MARCO K
- MOV R7,#K
- CALL SENT
- ENDM
復(fù)制代碼 如果需要發(fā)送一個(gè)命令,我們只需要
需要注意的是,變量是會(huì)原原本本替換的,也就是說(shuō),如果你在變量(SENT_CMD)后面填abcd,那么#K編譯時(shí)會(huì)被替換為#abcd
至于其他的內(nèi)容比如內(nèi)部標(biāo)簽之類(lèi)的,我覺(jué)得這個(gè)和函數(shù)有點(diǎn)沖突了,如果你執(zhí)意要看,可以翻手冊(cè)
最后再講一些簡(jiǎn)單的宏
有一個(gè)程序中間要插入100個(gè)NOP
REPT 次數(shù)
內(nèi)容
ENDM
就像這樣
編譯器就把這活干了,這個(gè)地方會(huì)編譯100個(gè)nop
老板又提出了新的要求,要你把R1,R3,R5入棧,我們嘗試用IRP解決
IRP 枚舉名,<枚舉內(nèi)容>
內(nèi)容
ENDM
就像這樣
- IRP name,<1,3,5>
- PUSH R&name
- ENDM
復(fù)制代碼 它編譯出來(lái)是這樣的
對(duì)于字符,專(zhuān)門(mén)有一個(gè)方法,IRPC,我直接粘貼手冊(cè)給的程序
IRPC sendchar, TEST
MOV R0, #'sendchar'
CALL outchar
ENDM
編譯成
MOV R0, #'T'
CALL outchar
MOV R0, #'E'
CALL outchar
MOV R0, #'S'
CALL outchar
MOV R0, #'T'
CALL outchar
注: 188610329對(duì)上一次的內(nèi)容進(jìn)行勘誤,回看手冊(cè)發(fā)現(xiàn)確實(shí)不太一樣,具體按照大佬所給的表為準(zhǔn),或者看手冊(cè)User's Guides for Keil C51 Development Tools
另外,我對(duì)大佬所說(shuō)不使用EQU定義引腳的說(shuō)法不敢茍同,在這一章的內(nèi)容可以明確知道EQU使用的是宏,是對(duì)代碼的前處理,而對(duì)于引腳寄存器的DATA定義早在STARTUP.A51就已經(jīng)完成,甚至public了,在一般情況下已經(jīng)具有所謂的“獨(dú)占性”,最重要的是,EQU最簡(jiǎn)單的一點(diǎn)就是用就完了,你不需要考慮別的,在使用定義標(biāo)記與宏最終效果一樣的情況下,肯定是選擇最簡(jiǎn)單最靈活的那個(gè)
data的好處是可以public一個(gè)變量,但我在有一堆寄存器和形參,以及可以寫(xiě)C的情況下似乎找不出使用這個(gè)的理由……本身就是寫(xiě)底層的代碼,在有編譯器高效優(yōu)化的前提下硬手寫(xiě)匯編運(yùn)算和編譯器比水平實(shí)在不是什么好行為……另外,匯編的內(nèi)容基本就這些了
|
評(píng)分
-
查看全部評(píng)分
|