摩托罗拉68000汇编中如何比较两个字符?栈帧比较报错求助
摩托罗拉68000汇编CMP指令无效寻址问题的解决方案
问题根源
摩托罗拉68000的CMP指令有严格的寻址模式限制:
- 不支持两个内存操作数(比如你尝试的
CMP.B -1(A6),-2(A6)) - 当目标为内存时,源操作数只能是数据寄存器,不能是立即数(所以
CMP.B -1(A6),#'B'报错)
不修改数据寄存器的解决方案
使用**CMPI指令**(立即数比较指令),它专门用于立即数与内存操作数的比较,完全不需要动用数据寄存器:
CMPI.B #'B', -1(A6)
这条指令会将栈帧中-1(A6)位置的字节数据与立即数'B'比较,结果直接更新状态寄存器(CCR)的标志位(如Z、N、C等),后续可以通过BEQ、BNE等条件分支指令判断比较结果。
补充场景方案
如果需要比较两个栈帧中的内存值(而非立即数)且不能修改数据寄存器,可以利用CMPM指令结合地址寄存器实现:
; 临时复制栈帧指针到A0,避免修改原A6 MOVEA.L A6, A0 ; 调整A0指向第二个待比较的栈帧位置 SUBQ.L #2, A0 ; 比较两个内存地址的字节,执行后A6和A0会自动递增1(字节模式) CMPM.B (A6)+, (A0)+
这种方法需要临时使用一个空闲的地址寄存器,使用后可恢复其原值以保证子例程透明性。
内容的提问来源于stack exchange,提问作者Ashmit Mittal
相关产品推荐
相关产品推荐

