針對2500 A.D. x8051組譯器 常用的假指令及語法
註:只提出常用的部份,不是常用的假指令(Pseudo Instruction)及巨集指令(MACRO)部份,請自行參閱相關書籍。
2500 A.D. 8051 Macro Assembler - Version 5.00c
1 ;2500 A.D. X8051組譯器常用的假指令及語法說明
2 ;簡易的假指令範例說明程式 羅永光 2000/04/05
3 ;分號之後的部份是一種程式文件說明,不會被組譯
4 0030 var1 equ 30h ;指定var1的值為30h,組譯的過程中遇到
5 ;var1便會以30h代替。(相當於高階語言的常數)
6 ;所有的數值均可用
7 ;十六進制 如 30h,0f2h
8 0032 var2 equ 50d ;十進制 如 50d,50
9 0032 var3 equ 50
10 0013 var4 equ 23q ;八進制 如 23q
11 000B var5 equ 1011b ;二進制 如 00001011b
12 ;表示之
13 FFCE var6 equ -50 ;其值會以二的補數表示
14 0030 count var 30h ;RAM的變數
15 0080 led: reg p0 ;設定led會以p0埠取代
16 0000 bcd: reg r0 ;設定bcd會以r0暫存器取代
17
18 0000 org 0 ;設定組譯後會從org指定的位
19 ;址存放機械碼
20 0000 A8 30 mov r0,var1 ;將RAM位址30h的資料搬移給r0
21 0002 A8 30 mov r0,count ;同上(建議使用var的方式定義)
22 0004 79 30 mov r1,#var1 ;將立即資料30h的值搬移給r0
23 0006 7A CE mov r2,#var6 ;負數值會以二的補數處理
24 0008 7B 24 mov r3,#>2468h ;">"取用16bit中的高位元組
25 000A 7C 68 mov r4,#<2468h ;"<"取用16bit中的低位元組
26 000C 75 80 0B mov led,#var5 ;動作如同下一列的指令
27 000F 75 80 0B mov p0,#01011b
28
29 0012 01 12 jmp $ ;$代表指令本身的位址
30
31 0050 org 50h
32 0050 4C 6F 2E 20 59 mesg: db 'Lo. Yung-Guang'
0055 75 6E 67 2D 47
005A 75 61 6E 67
33 ;定義位元組的資料
34 ;L的ASCII碼為4C
35 005E 1234 data1: dw 1234h ;定義16Bits的資料
36 0060 1234 5678 data2: long 12345678h ;定義32Bits的資料
37 0064 end ;告訴組譯程式組譯到此程式結束
Lines Assembled : 37 Assembly Errors : 0
假指令
ORG:ORG表示程式的起始位址,程式經過組譯後是由ORG所指令的位址開始存放機器碼。
EQU:指定EQU後面的數值給EQU前面的標記。例:VAR1 EQU 50H 即VAR1=50H
END::程式結束時要加END假指令,表示組譯到此結束。
DB :定義一個位元組(Byte)的資料給某記憶體位址。 DB是Define Byte的縮寫。
DW:定義兩個位元組資料(16Bit)給某記億體位址。 DW是Define Word的縮寫。
LONG:定義四個位元組(32Bit)的資料給某一記憶體位址。
REG:由使用者自己定義暫存器。
VAR:指定VAR後面的數值給VAR前面的變數,但與EQU不同,EQU所指定的數值不能改變,而VAR所指定的數值可以隨時更動。
組譯的語法
數字系統:
二進制(Binary):B 例: 10110011b
八進制(Octal):O或Q(建議以Q來標示,因為O與0常會被人誤認) 例:25q
十進制(Decimal):D或不指定
十六進制(HexDecimal):H 例: 0f2h (注意:當MSD為A..F時需要在MSD的左側補一個0)
char:使用單引號或雙引號區分 例: "L" 或 'L'
ASCII String:使用單引號或雙引號區分 例: "Lo. Yung-Guang" 或 'Lo. Yung-Guang'
組譯運算:
可用+、-、*、div、/、mod等運算
高位元組(High Byte) : 要載入16位元值的高位元組時可使用>符號。例: mov TH0,#>-5000
低位元組(Low Byte) : 要載入16位元值的低位元組時可使用<符號。例: mov TL0,#<-5000
位址:
標記(Labels) : 所有的標記都應使用英文字母開始,最長可用32個字元。建議標記最好擺在列的第一行(即第一個字元),若不是擺在第一行時必須在標記的最後加上一個 ":"。
"." 或 "$" :代表程式計數器的值,也就是指令本身的位址。
其它:
; 程式註解(comment),作為程式解說之用。