6502 通用彙編器 宏彙編用法
<>:必選,[]:可選
;____________________________________________________________
目錄:
.BYTE .DB .ASCII
.MACRO .ENDM .EXITM
.ASCIS
.DBYTE .DD
.DCB
.DW .WORD
.IF .ELSE .ENDIF
.END
.REPEAT .REPT .ENDR
.ERROR
.INCLUDE
.OPT
.ORG
.SET .=
.START
.STR .STRING
;____________________________________________________________
.BYTE, .DB, .ASCII 偽指令 - 用傳遞的參數定義單位元組值
文法:
[<標籤>[:]] .db <運算式>, "文本運算式" [, <運算式>[, "文本運算式"]]
[<標籤>[:]] .byte <運算式>, "文本運算式" [, <運算式>[, "文本運算式"]]
[<標籤>[:]] .ascii <運算式>, "文本運算式" [, <運算式>[, "文本運算式"]]
樣本:
alpha: .db "ABC",0 ;產生位元組:'A','B','C',0
beta: .db %1,%1$ ;宏參數, 字串長度和字串本身
.byte <[aplha-1],>[alpha-1]
.ascii "Text"
描述:
這些指令產生並定義單位元組值. 可以以數字或字串形式輸入資料.
;____________________________________________________________
.MACRO .ENDM .EXITM 偽指令 - 宏定義,結束,退出
文法:
<標籤>[:] .macro [參數1 [, 參數2 [, ...]]]
.endm
.exitm
樣本:
PushX .macro ;無參宏
Print .macro ;接受任意個參數的宏
Put .macro chr ;明確接受一個參數的宏
描述:
.MACRO 指令定義了一塊宏定義代碼. 放在 .macro 前面的
標籤為宏定義名, 並且也被放在宏字典中.
.MACRO 後面放置宏參數或省略符號(...). 參數名可以用在宏
定義塊中. 定義的參數會在後來原始碼使用時被請求. 要傳遞任意個數
的參數(包括沒有), 你可以使用省略符號. 沒有指令宏參數的宏僅可以通
過宏名調用(不能指定參數).
要在宏中引用宏參數, 你可以:
1) 使用參數名
2) '%' 打頭的連續的數字(從 1 開始)
%0 有特別的用途:它指示了宏被調用時實參的個數. 用方括弧括起來的
運算式也表示一個數, 比如 %[.cnt+1].
宏被調用時, 參數寫在宏名字的後面. 參數之間由逗號分隔.
所有這些運算式都是彙編時(Assembly Time)運算式. 宏得到的是被
重解釋/計算 過的結果值.
所有以 '.' 開始的標籤只在宏定義塊內有效, 無效於外部.
所有其它標籤都是全域的. 宏定義代碼可以使用局部標
簽(從它被調用的地方) \ 全域標籤 \ 它自己的局部標籤.
宏定義參數也可以 "??" 尾碼引用. 如果參數是字串,
可以通過 '$' 尾碼來訪問. 不帶 '$' 將得到的是該字串的長度.
參數 0$ 有特別的意義:宏名.
樣本:
Put: .macro chr ;列印單個字元
lda #chr ;取得參數 chr 的值
jsr sys_put_char
.endm
;調用:Put 'A'
Print: .macro ... ;列印輸出
.cnt .= 0 ;參數計數器
.repeat %0 ;迴圈 $0 次, 用於每個參數
.cnt .= .cnt + 1
.if .paramtype(%.cnt) == 2 ;文本參數嗎?
jsr sys_print_text ;字串放在調用過程之後
.byte .strlen(%.cnt),%.cnt
.else ;數字化的參數, 即字串的地址
lda #>%.cnt ;高位元組地址
ldx #<%.cnt ;低位元組地址
jsr sys_print
.endif
.endr
.endm
;____________________________________________________________
.ASCIS 偽指令 - 用字串參數定義單位元組值. 最後一位元組的最高有效位被異或以標識字串結束
文法:
[<標籤>[:]] .ascis <運算式> "文本運算式" [, <運算式>, "文本運算式"]
樣本:
alpha: .ascis "ABC" ;產生了位元組:$41,$42,$C3
beta: .ascis "Stop",$D ;產生了位元組:'S','t','o','p',$8D
描述:
.ascis 指令對產生最高有效位被異或的字串是很有協助的. 子函數
可以以此來檢測字串是否結束.
;____________________________________________________________
.DBYTE .DD 偽指令 - 定義字長值該數按大頭(big-endian)方式轉換. 高位元組在前, 低位元組隨後.
文法:
[<標籤>[:]] .dd 運算式 [, 運算式 [, ...]]
[<標籤>[:]] .dbyte 運算式 [, 運算式 [, ...]]
樣本:
alpha: .dd $1234,0 ;產生序列:$12,$34,$0,$0
beta: .dbyte alpha
.dbyte alpah-1,beta
;____________________________________________________________
.DCB 偽指令 - 用給定的值預留並初始化記憶體
文法:
[<標籤>[:]] .dcb 位元組數 [, 初值]
樣本:
buf: .dcb $20,$FF ;從這裡開始的連續 $20 位元組被初始化為 $FF.
描述:
該指令保留並用值初始化記憶體(如果給定).
;__________________________________________________________
.DW .WORD 偽指令 - 定義16位字長值. 小頭方式儲存:低位在前, 高位在後
文法:
[<標籤>[:]] .dw 運算式 [, 運算式 [, ...]]
[<標籤>[:]] .word 運算式 [, 運算式 [, ...]]
樣本:
alpha: .dw $1234,$0 ;產生序列:$34,$12,$00,$00
beta: .word alpha
.word alpha-1,beta
;________________________________________________________
.IF .ELSE .ENDIF 偽指令 - 條件彙編
文法:
.if 運算式
.else
.endif
樣本:
.if .ref(alpha) ;如果 'alpha' 標籤被引用過
.if a==5 ;如果標籤 a 等於 5
.if b ;如果標籤 b 非零
.if %0>2 ; 如果宏有不止兩個參數
.if b
rts
.else
...
.endif
;________________________________________________________
.END 偽指令 - 指示完成代碼彙編
文法:
[<標籤>[:]] .end
樣本:
finish: .end ;以下的代碼將不再彙編
;________________________________________________________
.REPEAT .REPT .ENDR 偽指令- 迴圈指定次數執行代碼
文法:
[<標籤>[:]] .repeat 運算式
.endr
樣本:
.repeat 10 ;迴圈10次
.repeat $0 ;迴圈宏參數次
.repeat 4
lsr
.endr
;________________________________________________________
.ERROR 偽指令 - 產生使用者彙編錯誤指示
文法:
.error "文本"
樣本:
.error "宏"+%0$+"需要參數
;________________________________________________________
.INCLUDE 偽指令 - 包含彙編原始碼
文法:
.include 檔案名稱
樣本:
.include "c:\asm6502\const_vals.65s"
.include ".\macros\macros"
描述:
該指令包含給定的原始碼, 預定的宏或標籤
;________________________________________________________
.OPT 偽指令 - 設定彙編選項
可用選項:
Proc6502,Proc65c02,Proc6501 -> 處理器
CaseSensitive,CaseInsensitive -> 大小寫敏感
文法:
.opt 選項名, [, 選項名]
樣本:
.opt Proc65c02,CaseInsensitive
;________________________________________________________
.ORG 偽指令 - 設定代碼產生位置
文法:
[<標籤>[:]] .org 運算式
樣本:
* = $1000 ;代碼位置:$1000
buf:.org * + $10;位移 * 10位元組
描述:
該指令用於設定程式開始地址
;________________________________________________________
.SET .= 偽指令 - 重設運算式的值
文法:
[<標籤>[:]] .set 運算式
樣本:
.cnt .set .cnt+1 ; .cnt 自增
;________________________________________________________
.START 偽指令 - 設定模擬入口地址
文法:
.start 運算式
樣本:
.start start
.start $8000
;________________________________________________________
.STR .STRING 偽指令 - 定義位元組值. 第一個值為字串長度. 最大 255
文法:
[<標籤>[:]] .str 運算式 [, 運算式 [, ... ]]
[<標籤>[:]] .string 運算式 [, 運算式 [, ... ]]
樣本:
alpha: .str "ABC",$0D ;產生 $04,'A','B','C',$0D
;________________________________________________________
女孩不哭(QQ:191035066) @ 2012-08-27 01:01:57 @ http://www.cnblogs.com/nbsofer
---EOF---