6502通用宏汇编器(6502 Simulator)宏汇编伪指令说明

陪她去流浪 桃子 2012年08月27日 阅读次数:6582

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. 使用参数名
  2. '%' 打头的连续的数字(从 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

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:汇编 · 6502 · nes