單片機累加器A與ACC區(qū)別
累加器寫成A或ACC在51匯編語言指令中是有區(qū)別的。
本文引用地址:http://m.butianyuan.cn/article/201611/322125.htmACC在匯編后的機器碼必有一個字節(jié)的操作數(shù),即累加器的字節(jié)地址E0H,A在匯編后則隱含在指令操作碼中。所以在指令中A不能用ACC來替代,而對A的特殊功能寄存器直接尋址和累加器某一位的尋址要用ACC,而不能寫成A。
例如,指令I(lǐng)NC
A和ACC都表示累加器,但A是累加器的代號,在指令中默認(rèn)是無地址的,而ACC是累加器在指令中的直接地址(E0H),可出現(xiàn)在用直接尋址的任何地方,例如:
PUSH
POP
類似:工作寄存器R0~R7在指令中也有兩種不同的寫法,生成的機器碼也不同,如:
MOV
MOV
假設(shè)當(dāng)前工作寄存器為0組,前者屬于寄存器尋址,后者屬于存儲器直接尋址。但R0和00H的級別不同,00H只是RAM區(qū)的一個普通單元,其讀寫速度要比慢得多。微型計算機內(nèi)部通常設(shè)置工作寄存器組,運算的結(jié)果可以放在寄存器中而不必每次都放到存儲器里,可以提高機器的工作速度。其實寄存器也是一種存儲器,只不過它是CPU中的部件,速度最快而已。
寄存器和一般的存儲器是混疊的,同一單元用不同的指令,它就會執(zhí)行不同的功能。
一般的說法:A表示了累加器中的內(nèi)容【寄存器尋址】;ACC表示了累加器的地址【直接尋址】。
A和ACC的實質(zhì)是一樣的,對應(yīng)地址都是0E0H,只是匯編在使用時,在格式上取了兩個名字。使用有一定的規(guī)律:
當(dāng)其要進行位表示時,必須用ACC,比如要寫成ACC.7,而不能寫成A.7;
但當(dāng)其作為8位二進制數(shù)時,ACC和A都能用,但還是有區(qū)別:比如INC
在Keil
所謂“A”是相關(guān)指令對累加器A的缺省指定(不占操作數(shù)指令),例如:
MOV
這是一個2字節(jié)指令,第1個字節(jié)是操作碼,第2個字節(jié)是立即數(shù)。由于是默認(rèn)與ACC相關(guān),所以用A即可,且不占指令字節(jié)數(shù)。
而PUSH和POP沒有缺省指定累加器,要訪問累加器就必須采用其所允許的直接尋址方式,“ACC”就是累加器A的地址。PUSH是直接尋址,后面一定跟的是直接地址。你可以看到reg51.h中ACC的直接地址是0xe0;也可以PUSH
為什么push
在mov指令中可通用,用"a"時為2字節(jié)1周期;用"acc"時為3字節(jié)2周期。
盡管物理地址相同,但push是對寄存器操作,而movx是對累加器操作。
匯編結(jié)果:"inc
通俗的解釋為:acc是地址為E0H的寄存器,A是標(biāo)準(zhǔn)的無地址的累加器,自然后者便捷,但兩者在值上互為鏡像。
評論