|

楼主 |
发表于 2005-9-23 06:55:33
|
显示全部楼层
INDIR == 0x00
RSR == 0x04
COUNT == 0x10
REG == 0x20
BANK1 == 0x40
BANK2 == 0x80
BANK3 == 0xC0
MOV A,@32
MOV COUNT,A
MOV A,@REG|BANK1
MOV RSR,A
NEXT:
CLR INDIR
INC RSR
DJZ COUNT
JMP NEXT
計算一個BYTE中有多少個"1"
這個小程式可以檢查出在某個BYTE中共有幾個1,在某些演算法的過程可能會用得到,計算的結果放在ACC。
RRCA DATA
AND A,@0x55
SUB DATA,A
MOV A,DATA
AND A,@0x33
ADD DATA,A
RRC DATA
ADD DATA,A
RRC DATA
SWAPA DATA
ADD A,DATA
AND A,@0x0F
節省NOP指令的方法
您還在為程式擠不下傷腦筋嗎?NOP指令有時候在延遲指令時間很有用,假如你有連續兩個NOP指令可以用JMP到下一個指令的方式代替,因為這樣可以減少一個指令BYTE,又可以達到相同的效果。
例如:
NOP
NOP
可以寫成:
JMP NEXT_INST
NEXT_INST:
;....
因為一個NOP花費一個指令Cycle,但是一個JMP指令就需要2個指令Cycle,雖然有時候會抱怨JMP指令會多花一點時間,但是想不到它也有如此妙用吧。
LABEL太多?
寫組合語言最令人傷腦筋的問題之一就是程式中到處是label,這有兩個壞處,第一就是不小心就會造成label重複的問題,第二就是想不出適當的label名稱。如果您已經為label的命名問題腸枯思竭,給您提供一個小方法,程式中如果用「$」可以表示目前PC的位址,依此推論「$+2」表示PC+2,「$-4」表示PC-4,看看底下的例子您立刻就明白:
MOV R,R
JBS PSW,FZ
JMP $+2
JMP $-4
; ....
不過也要給您一個建議,label有個重要的意義就是具有註解的功能,特別是針對一些懶的寫註解的人格外重要。所以這個方法僅適合使用在重複性很高的程式片斷。
SWITCH...CASE敘述
在程式設計的過程中,免不了常常會碰到多重選項的問題,利用EM78XXX的查表指令試試看,所以TBL除了當作一般查表指令以外,還可以當作多重條件判斷之用。
MOV A,CASE
TBL
JMP EVENT1 ; CASE=0
JMP EVENT2 ; CASE=1
JMP EVENT3 ; CASE=2
JMP EVENT4 ; CASE=3
多位元組的遞增及遞減運算\r
因為EM78XXX是8位元的單晶片,如果要執行8位元以上的計算,必須將多個位元組看成是一個變數,以下我們舉例說明如何將一組24位元的變數,做到遞增及遞減運算。\r
遞增(Increment)
MOV A,@1
ADD INT24,A
JBC STATUS,FC
ADD INT24+1,A
JBC STATUS,FC
ADD INT24+2,A
遞減(Decrement)
MOV A,@1
SUB INT24,A
JBS STATUS,FC
SUB INT24+1,A
JBS STATUS,FC
SUB INT24+2,A
判斷多位元組變數是否為零
使用簡單的邏輯運算指令,將多位元組OR在一起,然後依據Z旗標就可以判斷此多位元組變數是否為零了。
MOV A,INT24
OR A,INT24+1
OR A,INT24+2
JBS PSW,FZ
;...
複製某些位元
有時候我們需要將一些特定的幾個位元由某個暫存器複製給另一組暫存器,由於並非完全複製暫存器的內容,所以會多了一些抽取位元的步驟,現在我們找到一個方法,只要四個步驟就可以將指定的位元複製到另一組暫存器裡面,舉例說明,假設位元複製前(SOURCE)=44H,(TARGET)=5AH,如果我們希望將SOURCE的BIT0~BIT2複製到TARGET,則執行程式後(SOURCE)=44H,(TARGET)=5CH。
MOV A,SOURCE
XOR A,TARGET
AND A,@00000111B
XOR TARGET,A
無論您希望複製哪幾個BIT,只要將第三行程式MASK所需的位元即可。
|
|