繁体   English   中英

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

[英]Assembler code MC68k . somehow a register is getting filled with a number even though I dont want to

所以我需要用汇编代码写这个。 我应该在 D3,D4 中的 J 和 D5 中的 K。 运行代码时,一切正常,但 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

您遇到的问题是您将数据作为指令执行。

您有以下注释:

*这里什么都不应该发生,只是想让程序停止

表示您不希望执行继续超过该点。 但是,处理器不会这样做。 如评论中所述,您希望将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 寄存器进行或。 在字节大小的操作中,不使用第三个字节。 第四个字节是立即字节。

你有end: label 你需要“陷阱”CPU,否则它将继续并作为指令执行你的数据。 CPU 无法区分。 这是最简单的方法,但如果不重置,您将无法从中恢复:

end:
jmp end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM