⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6502基础知识.txt

📁 在网上搜集的一些关于6502的资料,在win2000下调试通过了,有vb也有vc的程序,还有一些6502基础命令学习,对想学6502汇编的有一定的帮助,如何使用,详细看里面有说明文件:)
💻 TXT
📖 第 1 页 / 共 5 页
字号:
3.若a=$c,执行时$0a=b,从当前页$c000+cd*2和$c001+cd*2处取数据xx,yy,运行$yyxx 
4.若ab=$ff,则播放$06页$b800开始的系统音乐的第cd首 
以下是一些nc2k的常用的系统函数,更具体的函数表将会在以后章节(如文件操作)中和附录中说明: 
int$c00a:按键停顿,按下的键在寄存器a中 
int$c72a:清除屏幕 
int$c719:刷新字符缓存,显示字符缓存中的文字 
int$cb03:通用菜单程序,参数:寄存器x,y方参数表地址 
参数表: 
00:09/02 ;横向/纵向菜单 
01,02:xx yy ;$yyxx为选择第一项要执行的代码地址 
03,04:xx yy ;第一项的帮助 
05,06:第2项代码 
07,08:第2项帮助 
.... 
第一项文字内容 
ff 
第二项文字内容 
...... 
int$cb07:输入法 
可输入字符 
参数:x,y参数表地址 
参数表: 
00:xx ;光标位置 
01:yy ;最大输入字符长度 
02:zz ;输入过滤,可只允许输入数字或只允许输入汉字等,正常为20 
03,04:xx yy ;$yyxx帮助信息地址 
小试牛刀-给应用程序加密码 
这节是初级篇的最后一节了,大家努力吧! 
这节我们用学到的汇编知识来给BIN文件加密码 
首先,我们须要一个工具,WQXDEBUG,UE,PACMANGER这些能编辑文件的工具都可以 
这里,我使用wqxdebug 接着,我们选择一个须要加密的BIN程序,比如LAVA.bin 
使用wqxdebug的"载入文件"功能,打开LAVA.bin 
然后v 400080,再按下w 这样,这个文件的内容就以hex形式显示出来了 
接着我们要确定文件入口 
通过上一节的教程,我们知道bin文件的执行入口是在文件偏移0008处,我们看到LAVA.bin的是10 40,即是$4010 
我们看到文件大小是小于16K的,我们来到16K的结尾,这里是空的,很好,我们就在$8000靠前的部分,就在$7FD0吧,写入加密代码 
E 7FD0 
输入数据: 
00 04 06 90 03 4C 10 40 00 10 03 
这段机器码的汇编代码为: 
INT$0604 ;要求输入密码 
BCC$L1 ;如果密码不正确就跳L1 
JMP$4010 ;如果正确就跳向入口 
L1:INT$0310; 不正确,返回网络 
然后把$4008的入口更改一下,改为D0 7F,即$7FD0 
最后"保存文件",保存为应用程序目录下的LAVA.bin,这就大功告成了!! 
注意LAVA.bin小于16k,所以保存时输入文件块数(x16kb)=1. 












6502 微处理器

    下面的大多数信息都在 "Commodore 64 Programmers Reference Manual" 中简单的谈到过,因为它在电
    工结构上是可用的,并且这片文档和6502文档没有什么差别,毕竟他们都是6500家族的. 我在合适的地方
    做了信息的修改和添加.

    理论上你可以用任何你可以找到的代码来模拟6510 (C64处理器).


+------------------------+
| 6502微处理器中的寄存器 |
+------------------------+

    绝大多数的计算都在微处理器中进行. 寄存器是处理器中特别的储存块,它别用来取出和保存处理的信息.
    6502有以下的寄存器:


+----------------------+
| 累加器 (Accumulator) |
+----------------------+

    这是微处理器里最重要的寄存器. 很多种机器语言指令都允许你拷贝内存中某个位置的内容到累加器中,允
    许你拷贝累加器中的内容到内存某个位置中,直接修改累加器或其他寄存器的内容而不影响到任何内存. 累
    加器是唯一有执行数学计算指令的寄存器.


+---------------------------------+
| X 索引寄存器 (X Index Register) |
+---------------------------------+

    它是非常重要的寄存器. 那里有几乎所有你能够改变累加器的指令. 但是有一些只有 X 寄存器能够执行的指
    令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 X 寄存器,拷贝 X 寄存器中的内容到内存
    的某个位置中,直接修改 X 或者其他寄存器的内容.


+---------------------------------+
| Y 索引寄存器 (Y Index Register) |
+---------------------------------+

    它是非常重要的寄存器. 那里有几乎所有你能够改变累加器和 X 寄存器的指令. 但是有一些只有 X 寄存器能
    够执行的指令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 Y 寄存器,拷贝 Y 寄存器中的内
    容到内存的某个位置中,直接修改 Y 或者其他寄存器的内容.


+------------------------------+
| 状态寄存器 (Status Register) |
+------------------------------+

    这个寄存器包括8个 "标记" (标记 = 显示某些事情发生或者没有发生的东西). 这个寄存器中的位的值得修改
    依赖于算术和逻辑运算的结果. 位被描述如下:

      Bit No.   7  6  5  4  3  2  1  0
                S  V     B  D  I  Z  C

    Bit 0 - C - 进位标记 (Carry flag): 这个标记保存了任何算术操作的大多数重要的位的进位. 然而在减法操
    作中,这个标记被清空 - 需要借位责备设置为0,不需要借位则被设置为1. 进位标记也在逻辑操作转移
    (shift)和交替 (rorate) 中被使用.

    Bit 1 - Z - 零标记 (Zero flag): 当任何的算术或逻辑操作产生零结果的时候被设置为1,产生非零结果时被
    设置为0.

    Bit 2 - I: 这是一个允许/禁止中断标记. 如果被设置,则禁止中断. 如果被清空,则允许中断.

    Bit 3 - D: 这是十进制模式状态标记. 当这个标记被设置,并且需要进位的加或者需要进位的减被执行,原始
    值就被转换成为有效的 BCD 码 (Binary Codec Decimal: 二--十进制码,例如: 0x00 - 0x99 = 0 - 99). 生成
    的结果仍旧是 BCD 码.

    Bit 4 - B: 当一个软件中断 (BRK 指令)被执行的时候,这个标记被设置.

    Bit 5: 未被使用. 任何时候都假定是逻辑1.

    Bit 6 - V - 溢出标记 (Overflow flag): 当一个算术操作产生出一个过大的结果 (比一字节能描述的大), V 标
    记被设置.

    Bit 7 - S - 信号标记 (Sign flag): 当一个操作的结果被否定时,这个标记被设置; 当结果被肯定是,标记被清
    空.


+------------------------------+
| 指令计数器 (Program Counter) |
+------------------------------+

    这个寄存器保存着当前被执行的机器语言指令的地址. 由于 Commodore VIC-20 的操作系统一直在运行着 (或者,
    任何操作系统),指令计数器总是改变着. 它只有在通过某种方法中断微处理器的时候停止.


+------------------------+
| 栈指针 (Stack Pointer) |
+------------------------+

    这个寄存器保存了栈中第一个空区域的位置. 栈是被机器语言程序和计算机使用来临时储存的.


+-----------------------------+
| 地址模式 (Addressing Modes) |
+-----------------------------+

    指令需要操作数来操作. 有多种方法来标记处理器从哪里得到操作数. 被用来这样做的不同的方法叫做地址模式.
    6502提供11种模式,下面有描述.

    1) 快速模式 (Immediate)
    在这种模式中,操作数的值在指令中被给出. 在汇编语言中,这种模式以操作数前加 "#" 来标记.
    例如: LDA #$0A - 意思是 "load the accumulator with the hex value 0A"
    在机器代码中,不同的模式以不同的代码标记. 所以 LDA 将依赖于不同的地址模式被翻译成不同的代码. 在这种
    模式中,代码是: $A9 $0A

    2) & 3) 完全和完全零页面模式 (Absolute and Zero-page Absolute)
    在这种模式中,操作数地址被给出.
    例如: LDA $31F6 - (汇编语言)
          $AD $31F6 - (机器代码)
    如果地址不是在零页面 - 也就是,任何高字节不是00的地址 - 只有一个字节需要给出. 处理器自动将高字节填为00.
    例如: LDA $F4
          $A5 $F4
    注意不同的模式中不同的指令代码.
    同时注意对于两字节地址,低字节先被储存,例如: LDA $31F6 在内存中被存为三个字节: $AD $F6 $31.
    绝对零页面通常被叫做零页面.

    4) 隐含模式 (Implied)
    这种模式不需要任何操作数地址. 它们隐含在指令中.
    例如: TAX - (将累加器中的值传给 X 寄存器)
          $AA

    5) 累加器 (Accumulator)
    这种模式中,指令操作累加器中的数据,所以不需要操作数.
    例如: LSR - 逻辑位右移 (logical bit shift right)
          $4A

    6) & 7) 索引和零页面索引 (Indexed and Zero-page Indexed)
    在这种模式中,被给出的地址的值将被与 X 或 Y 索引寄存器中的值相加以成为真正的操作数地址.
    例如: LDA $31F6, Y
          $D9 $31F6
          LDA $31F6, X
          $DD $31f6
    注意不同的操作代码将由被使用的索引寄存器确定. 在零页面中,你需要注意,X 与 Y 寄存器的值都是不可互换的.
    大多数能够以零页面索引方式工作的都仅用于 X 索引.
    例如: LDA $20, X
          $B5 $20

    8) 间接 (Indirect)
    这种模式仅适用于 JMP 指令 - 转到新位置 (JuMP to new location). 它的标志是操作数上的圆括号. 操作数是保
    存有新位置的字节的地址.
    例如: JMP ($215F)
    假定: -           byte       value
                      $215F      $76
                      $2160      $30
    这个指令将获取 $215F, $2160 两个字节中的值,然后把它当作转到的地址 - 也就是,$3076 (记得地址中的低字节
    先被存储).

    9) 预索引间接 (Pre-indexed indirect)
    这种模式是将一个零页面地址加上 X 寄存器中的内容,然后给出保存操作数地址的字节的地址. 间接模式在汇编语言
    中是由圆括号标记.
    例如: LDA ($3E, X)
          $A1 $3E
    假定: -           byte       value
                      X.reg      $05
                      $0043      $15
                      $0044      $24
                      $2415      $6E

    这条指令将被如下执行:
    (i)    $3E + $05 = $0043
    (ii)   获取 $0043, $0044 两字节中保存的地址 = $2415
    (iii)  读取 $2415 中的内容 - 也就是,$6E - 进入累加器

    10) 传递索引间接 (Post-indexed indirect)
    在这种模式中,一个零页面地址的内容 (包括其后面的字节) 给出一个间接地址,该地址中的内容将与 Y 寄存器中的
    值相加生成出操作数的真实地址. 同样,在汇编语言中,这个指令由圆括号标记.
    例如: LDA ($4C), Y
    注意,圆括号只括起来了指令中的第二个字节,因为它是做间接操作的一部分.
    假定: -           byte        value
                      $004C       $00
                      $004D       $21
                      Y.reg       $05
                      $2105       $6D
    这条指令将被如下执行:
    (i)    读取字节 $4C, $4D 中的内容 = $2100
    (ii)   与 Y 寄存器中的内容相加 = $2105
    (iii)  读取字节 $2105 中的内容 - 也就是,$6D 到累加器.
    注意,这种模式中,仅使用了 Y 寄存器.

    11) 关系 (Relative)
    这种模式使用分支状况指令 (Branch-on-Condition instructions). 这可能是你使用最多的一种模式. 一个单字节值
    将被加到指令计数器中,然后程序就从那个地址继续执行. 这个单字节数将被认为是一个有符号数 - 也就是说,如果
    7号位是1,则0-6号位给出的信息将被否定; 如果7号位是0,则此数被肯定. 当升至127字节时,这种模式起用了一种至
    任何方向的分支转移 (Branch displacement).
    例如: 位号:   7 6 5 4 3 2 1 0     有符号值       无符号值
          值      1 0 1 0 0 1 1 1     -39            $A7
          值      0 0 1 0 0 1 1 1     +39            $27
    指令范例:
      BEQ $A7
      $F0 $A7
    这个指令将检查零状态位. 如果被设置,十进制39将从指令计数器中减去,然后程序从那个地址开始执行 (应该是减去
    39后的指令计数器中的地址 -- 译注). 如果零状态位没有被设置,程序从接下来的地址执行.
    注意: a) 在分支指令后,分支转移之前,指令计数器指向指令的开始处.
          b) 分支状况指令通过检查状态寄存器中的相关状态位来工作.
          c) 如果你发现你需要的分支超过127个字节,可使用相反的分支状态和一个 JMP.


  +------------------------------------------------------------------------
  |
  |      MCS6502 MICROPROCESSOR INSTRUCTION SET - ALPHABETIC SEQUENCE
  |
  +------------------------------------------------------------------------
  |
  |     ADC   Add Memory to Accumulator with Carry
  |     AND   "AND" Memory with Accumulator
  |     ASL   Shift Left One Bit (Memory or Accumulator)
  |
  |     BCC   Branch on Carry Clear

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -