6502 通用汇编器 宏汇编用法
<>:必选,[]:可选
目录
.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 指令定义了一块宏定义代码。放在 .macro 前面的标签为宏定义名, 并且也被放在宏字典中.
.MACRO 后面放置宏参数或省略号(...)。参数名可以用在宏定义块中。定义的参数会在后来源代码使用时被请求。要传递任意个数的参数(包括没有), 你可以使用省略号。没有指令宏参数的宏仅可以通过宏名调用(不能指定参数)。
要在宏中引用宏参数, 你可以:
- 使用参数名
- '%' 打头的连续的数字(从 1 开始)
%0 有特别的用途:它指示了宏被调用时实参的个数。用方括号括起来的表达式也表示一个数, 比如 %[.cnt+1]。
宏被调用时, 参数写在宏名字的后面。参数之间由逗号分隔。所有这些表达式都是汇编时(Assembly Time)表达式。宏得到的是被重解释/计算 过的结果值。所有以 '.' 开始的标签只在宏定义块内有效, 无效于外部.
所有其它标签都是全局的。宏定义代码可以使用局部标签(从它被调用的地方) \ 全局标签 \ 它自己的局部标签.
宏定义参数也可以 "??" 后缀引用。如果参数是字符串,可以通过 '$' 后缀来访问。不带 '$' 将得到的是该字符串的长度.参数 0$ 有特别的意义:宏名.
语法
<标签>[:] .macro [参数1 [, 参数2 [, ...]]] .endm .exitm
示例
PushX .macro ;无参宏
Print .macro ;接受任意个参数的宏
Put .macro chr ;明确接受一个参数的宏
.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 指令对生成最高有效位被异或的字符串是很有帮助的。子函数可以以此来检测字符串是否结束。
语法
[<标签>[:]] .ascis <表达式> "文本表达式" [, <表达式>, "文本表达式"]
示例
alpha: .ascis "ABC" ;生成了字节:$41,$42,$C3
beta: .ascis "Stop",$D ;生成了字节:'S','t','o','p',$8D
.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