assembly - 如何存储来自 Assembly 68K CCR 的进位位?

标签 assembly 68000 ccr

我确实在手册中找到了一条来自 CCR 指令的 MOVE... http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf

但我不断收到“无效寻址模式”错误。我尝试了不同形式的语法,无论如何我只想存储进位位,而不是整个 CCR。这些都是我试过但没有运气的语法。它非常明确地说大小必须是单词。

MOVE.W CCR,D6
MOVE.W CCR,CARRY
MOVE   CCR,D6
MOVE   CCR,CARRY
MOVE.B CCR,D6
MOVE.B CCR,CARRY

纳达。我究竟做错了什么?有没有更好的方法来专门存储进位位 (C)?

最佳答案

您不应该直接访问 SR/CCR 来获取单个标志的状态。

68K 系列有非常方便的 S(cc) 指令(根据条件设置),它采用 (cc) 的条件谓词,并产生一个反射(reflect)条件的字节。示例:

SEQ D0

如果零标志被清除,D0.b 变为 0x00,否则为 0xFF。所有条件谓词都对此指令有效,包括基于进位的测试(SCS、SCC)。

CCR 的问题首先是它在 MC68000 上不允许(它根本不存在,它是 MC68010 引入的扩展)。我不确定从 CCR 执行 MOVE 是否会触发 IllegalInstruction,或者它是否从 SR 静默转换为 MOVE(它们具有几乎相同的编码,只有 MOVE SR 是字大小,MOVE CCR 是字节大小)。

您也不应该改用 SR 的 MOVE,这会在 x > 0 的所有 MC680x0 上爆炸,因为该指令在这些处理器上仅是主管(特权)。

访问 SR 需要非常小心,因为家庭内部存在这些差异。

关于assembly - 如何存储来自 Assembly 68K CCR 的进位位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880257/

相关文章:

.net - 微软的CCR与任务并行库

arrays - 为什么汇编代码在加总和之前将值从 %edx 复制到 %rcx?

c++ - 使用大数组索引增加访问时间

assembly - LEA 和 MOVE.L 之间的区别?

assembly - 将我的解决方案从十进制转换为十六进制

c# - 线程间通信时间

assembly - 当变量超过 32 个时寄存器会发生什么情况?

c++ - 将未对齐的 double 加载到 _m128d 寄存器

assembly - 如何实现逻辑或||在 easy68k 的 if() 条件下?

c# - 使用 CCR 有序处理事件的有效方法是什么?