zoukankan      html  css  js  c++  java
  • 6502 通用宏汇编器宏汇编伪指令说明

    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---

  • 相关阅读:
    php友好格式化时间
    GraphicsMagick为图片添加水印
    Kali Linux下破解WIFI密码挂载usb无线网卡的方法
    用nginx做反向代理来访问防外链图片
    Nginx反向代理的目录访问问题
    Cookie存储中文报错:java.lang.IllegalArgumentException: Control character in cookie value or attribute.(转)
    4.0之后的hibernate获取sessionFactory
    Servlet的延迟加载和预加载
    hibernate注解(转)
    web项目路径问题
  • 原文地址:https://www.cnblogs.com/memset/p/2657908.html
Copyright © 2011-2022 走看看