在汇编中编写while循环

jnh*_*hyf 9 assembly hex loops 6502 while-loop

我正在尝试用6502处理器在汇编中编写while循环,我无法弄清楚如何编写十六进制代码.我已经看过使用简写编写的示例,其中有一个标签,表示循环应该从哪里开始和结束但是我没有看到任何实际的十六进制代码.

我认为有用的两个代码是:

  1. 比较内存中的字节与X reg(速记:CPX,十六进制:EC).如果相等,则将Z标志设置为零
  2. 如果Z标志= 0,则分支X字节(简写:BNE,十六进制:D0)

Pet*_*son 6

这里是您开始的地方:http://www.obelisk.demon.co.uk/6502/.该页面具有可在PC上运行的交叉汇编程序.这可能是一个很好的开发平台.

在做任何事情之前,你必须了解6502的操作理论.然后你必须了解软件开发过程,包括:

- 准备一个"源文件",所谓的符号指令,你称之为"速记"
- 使用汇编程序,将该源文件
翻译成6502理解的机器指令- 将翻译加载到6502中
- 告诉6502执行翻译的机器指令

您的示例程序尝试将LEN内存字节从中复制SRCDST.

你这样格式化:

      LDX #0    ; Start with the first byte 
_LOOP LDA SRC,X ; load a byte from SRC into the A register 
      STA DST,X ; store that byte into DST
      INX       ; bump the index register to point to the next SRC and DST locations 
      CPX #LEN  ; have we moved LEN characters?  
      BNE _LOOP ; if not, go move the next one
Run Code Online (Sandbox Code Playgroud)

添加更多语句行后(END例如); 并且,在你定义SRC之后DST,和LEN,你将整个东西保存在一个名为的文件中,比方说吧cploop.txt.

然后你告诉汇编程序翻译它.汇编程序提供了一个二进制6502机器代码文件,可以表示为您正在讨论的十六进制字节.

您将该机器代码文件提供给模拟6502.然后您以某种方式告诉6502执行机器代码所体现的操作.

  • 顺便说一下,递减循环效率更高-省略了对比较指令的需要,并且保存这两个字节的时间也比每次迭代快2-6个时钟(取决于比较和寻址模式):LDX #LEN; 从最后一个字节_LOOP LDA SRC,X开始;从SRC加载一个字节到A寄存器STA DST,X; 将该字节存储到DST DEX; 修改索引寄存器指向下一个SRC和DST位置BNE _LOOP; 如果不为零,则移动下一个 (2认同)
  • @jnhyf-您似乎要坚持的一件事是汇编代码中是否存在“ _LOOP”标签。这只是一个汇编程序指令,代表指令开始位置的地址。它在定义的点不会输出到机器代码中的任何内容中。当将其用作操作数(即汇编指令的参数)的一部分时,它将被定义时指令所在的地址替换。在6502上,它的最低有效字节优先被写出-地址$ 0300在机器代码中写为“ 00 03”。 (2认同)