【问题标题】:how does indirect addressing work in assembly language motorola 68k间接寻址如何在汇编语言摩托罗拉 68k 中工作
【发布时间】:2014-10-30 14:17:10
【问题描述】:

我有这个代码:

loop2
        move.b  (a4)+,d3      * moving the morse code array input to d3
        muls    #5,d3
        add.b   $d3(a6),d3    * moving the character in morse code array to d4
        move.b  d3,d4
        cmp.b   #dot,d4

在这里,我正在访问一个从a4 开始的数组。我正在获取数组的一个元素并将其乘以 5 以移动到我拥有所需元素的内存位置。

a6表示包含某个字符的数组的起点。

声明$d3(a6),d3 wokrs 但代码出错 我知道代码 d3(a6),d3 应该是正确的,但它显示了一个错误。我该怎么做?

【问题讨论】:

    标签: assembly 68000 easy68k


    【解决方案1】:

    发生的事情是因为$ 用于指定十六进制常量,而d3 在技术上是一个有效的十六进制常量,它使用a6 + 0xd3 作为内存地址。您要完成的操作使用不同的语法,即 两个 寄存器都在括号中:(a6,d3)

    所以正确的说法是:

    add.b   (a6,d3),d3
    

    【讨论】:

    • 抱歉,我刚刚编辑了这个问题,因为它传达了其他内容。
    • a6 的地址是 10CC,d3 是 32(十进制值 2)所以 muls #5,d5 应该是 FA,10CC + FA 应该是 11C6,我需要 d4 中 11C6 的内容,但那不是我在 d4 中得到了什么
    • add.b是添加地址内容注册d3,是你想要的吗?如果没有,您应该改用move.b
    • 假设 a6 是 1000,d3 是 10,然后我想移动到第 1010 个位置,就像访问数组的第 10 个位置(如数组 [10])。然后我需要将该位置的内容复制到d4。所以在某种程度上我试图访问数组的随机元素并将它们存储在 d4 中。
    【解决方案2】:

    add.b (a6,d3),d3 中,您可能应该声明用于地址生成的 d3 大小:(a6,d3.w)(a6,d3.l),具体取决于您的需要。在一般情况下,在乘法之后你有完整的 32 位结果,应该使用d3.l。只有当您确定乘法的结果适合 16 位时,您才能使用d3.w
    如果您专门为 68020+ (020,030,040,060) 编写代码,还可以考虑使用像 (a6,d3.w*n) 这样的缩放寻址模式,其中 n 是 1、2、4、8 之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多