assembly 汇编代码MC68k,不知何故,一个寄存器被一个数字填充,即使我不想

sulc1iza  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(143)

所以我需要用汇编代码写这个。我应该在D3,J在D4,K在D5。当运行代码时,一切都工作,但D2充满了D4中的信息。为什么?

ORG    $0
    DC.L   $8000
    DC.L   START
    ORG    $1000
    
START:  
               
    MOVE.W I,D3
    MOVE.W J,D4
    CMP.W  D4,D3
    BLT  LT
    BRA  ELSE

LT:

    MOVE #1,D5
    BRA  end
    
ELSE:

    MOVE #0,D5

end:

   *nothing should happen here, just want program to stop

* these are my variables and constants
 
I   DC   2

J   DC   14

    SIMHALT
    END    START        ; last line of source
mxg2im7a

mxg2im7a1#

您遇到的问题是将数据作为指令执行。
您有以下备注:

  • 此处不应发生任何事情,只是希望程序停止

表示您不希望执行超过该点。然而,处理器不会这样做。正如注解中所指出的,您希望将SIMHALT放在代码的末尾(在end标签之后),数据之前。如果不这样做,处理器(模拟器)将继续递增程序计数器,并尝试将数据作为代码执行。
这些线条

I   DC   2
J   DC   14

将字节00 02 00 0E(big-endian,显示为十六进制)插入程序中。将其反汇编得到以下程序集:

ORI.B   #14,D2

这会在常数值14与D2的目前值之间执行比特大小的OR,并将该值储存到D2中。如果D2开始时的值为0,这会将14载入该寄存器。D2的初始值也可以设定1110中的任何比特(显示最低有效的4比特)。
这并不是说D4的值被加载到D2,而是你用来加载D4的常量碰巧最终是ORI.B的立即数。
如果常量不同,就会得到不同的生成指令,可能是跳转到了其他地方,什么也没做,或者只是执行了一条无效指令而出错,只要第一个字节保持00,指令将始终是ORI。第二个字节确定大小和有效地址。将该值更改为03将立即数与D3寄存器进行OR运算。在字节大小的运算中,不使用第三个字节。第四个字节是字节立即数。

1qczuiv0

1qczuiv02#

当你有end:标签时,你需要“诱捕”CPU,否则它会继续运行,并按照指令执行你的数据。CPU无法区分这两者。下面是最简单的方法,但你不能在不重置的情况下恢复:

end:
jmp end

相关问题