【问题标题】:6502 assembly shift bits6502 组装移位位
【发布时间】:2014-10-06 20:33:49
【问题描述】:

我有一个号码1f 存储在地址00,我还有另一个号码1e 存储在地址01。现在我想把1f变成1f001e变成001e,然后把它们加起来得到1f1e。我该怎么做呢?我知道asllsr 的说明可以解决这个问题,但我是 6502 初学者,所以我真的很感激有人能告诉我它是如何有效地完成的(循环次数最少)。

【问题讨论】:

  • 由于 6502 是 8 位机器,您不能直接使用 16 位数字。您可以单独操作两半,无需轮班。
  • @Jester 你的意思是如果我想在1f1e 中存储一些东西我需要使用sta ($00),y
  • 是的,但请记住 6502 是小端序,因此要获得 1f1e,您需要交换两个字节。你当然也可以使用sta ($00, x) 假设x 为零。
  • @Jester 如果我是你,我会把它提升为答案;它清楚地回答了这个问题,并且对于将来发现这个问题的人来说会更加突出。失败了,我猜其他人可以将其发布为社区 wiki。

标签: assembly 6502


【解决方案1】:

如果您使用 16 位数量,则需要确保您的变量是 16 位或 2 字节宽。

您可能希望使用 6502 little-endian 顺序,尤其是当您的变量可用作地址时。这意味着低字节,高字节顺序。

我有一个数字 1f 存储在地址 00,我还有另一个数字 1e 存储在地址 01。

您确实希望将 $001F 存储在地址 $00-$01($00 将等于 #$1F 并且 $01 将等于 #$00),并将 $001E 存储在地址 $02-$03($02 将等于 #$1E 并且 $03 将等于#$00)。然后你可能想要另一个变量来保存结果,比如说 $04-$05。


但是,如果您确实有两个 8 位变量,并且您想将它们“转换”为 16 位变量...

假设(为了清楚起见使用标签):

$00 - 你的第一个 8 位变量(标签 VAR_A_8

$01 - 你的第二个 8 位变量(标签 VAR_B_8

$02-$03 - 您要放置第一个转换后的 8 位变量的位置(标签 VAR_A_16

$04-$05 - 您要放置第二个转换后的 8 位变量的位置(标签 VAR_B_16

他们是未签名吗?如果是,就LDA #$00, STA VAR_A_16, STA VAR_B_16, LDA $00, >STA VAR_A_16, LDA $01, STA >VAR_B_16

> 是一种常见的汇编语法,表示“低字节”(它可能实际上是< - 我一直对此感到困惑)

它们是否有符号如果 8 位值是负数(设置了第 7 位),您希望将 $FF 存储在新字节中,否则您希望存储 $00。

一种方式:

               LDX #$00
               LDA VAR_A_8       ;Loading .A will set N flag in .P if bit 7 is set
               BPL VAR_A_NOT_NEG
               DEX               ;.X will now be $FF
VAR_A_NOT_NEG: STX <VAR_A_16     ;store .X in high byte
               STA >VAR_A_16     ;copy low byte
               LDX #$00
               LDA VAR_B_8
               BPL VAR_B_NOT_NEG
               DEX
VAR_B_NOT_NEG: STX <VAR_B_16
               STA >VAR_B_16

【讨论】:

    【解决方案2】:

    6502是8位机;它通过从低地址读取最低有效字节(即它是小端序)来构造 16 位量。

    因此,您只需将1e 放入1f 之前的地址中——通过将它们与您当前的布局进行切换,将1f 移动到地址02 或通过其他方式。不需要移位或 ORing;确实,6502 内部没有 16 位寄存器可以通过按位逻辑进行移位或操作。

    如果这两个字节保留在0001 但相反,那么你可以例如将x清零并使用($00, x)寻址模式访问1f1e

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2010-11-19
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多