博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6502 通用宏汇编器宏汇编伪指令说明
阅读量:5858 次
发布时间:2019-06-19

本文共 4711 字,大约阅读时间需要 15 分钟。

<>:必选,[]:可选
;____________________________________________________________
目录:
        .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---

你可能感兴趣的文章
手把手教你搭建LyncServer2013之准备篇(一)
查看>>
DCN 网关基本配置
查看>>
Vue.js学习系列(三十一)-- Vue.js样式绑定(二)
查看>>
DevOps转型成功之路1 - 转型的意义
查看>>
RHCA教程:RHS333-4 Kerberos_NIS
查看>>
iOS高性能图片架构与设计
查看>>
mysql占用服务器cpu过高的原因以及解决办法
查看>>
解决OSPF不连续区域的3种方法
查看>>
多形性
查看>>
周珍:那些年,我们一起谈论的SEO培训
查看>>
Oracle 也加入到 Eclipse MicroProfile项目中了
查看>>
mysqldump导入导出mysql数据库
查看>>
linux中软硬链接的区别
查看>>
由于if功力不足引出的Helper
查看>>
ng-zorro-antd 入门
查看>>
CentOS修改文件夹权限
查看>>
Esper学习笔记三:EPL语法(1)
查看>>
dcoker 搭建 elk环境
查看>>
海纳百川下载器(道客巴巴免费下载器)程序已停止工作解决方法
查看>>
Spring源码深度解析:学习笔记
查看>>