MSP430 CMP运算符

KKK*_*KKK 9 assembly msp430

假设我有下面的MSP430装配部分:

R15:

439c
Run Code Online (Sandbox Code Playgroud)

记忆地图:

4390:   6045 0200 9c43 6400 8844 5044 363a 0000
Run Code Online (Sandbox Code Playgroud)

码:

448a:  cmp  #0x363a, 0x0(r15)
4490:  jnz  $+0x1c
4492:  Code continues
.
.
.
44ac: Jump to location
Run Code Online (Sandbox Code Playgroud)

目标是让Z标志高.要使用cmp执行此操作,src和dst必须相等.如果我在r15的内存位置有363a,为什么生成的cmp不会触发Z标志?

通过实验,我发现将3a36放在r15的内存位置实际上触发了Z标志,但我不明白为什么.

如果有人能说明这一点,我将非常感激.

如果需要更多信息,我很乐意提供.

Cur*_*urd 12

原因是MSP430是一个小端机器.
即较低地址的字节0x439C被解释为最低有效字节.
较高地址处的字节0x439D被解释为最高有效字节.
所以内存中的16位值实际上被解释为0x36 + (0x3A << 8) = 0x3A36.

这也解释了为什么在交换两个字节时都会设置Z标志的原因.

注意:
在内存转储中,从低到高的地址从左到右列出字节.
仅适用于大端机器(例如MC680x0),您可以解释内存转储中列出的多字节值; 对于小端机器(例如x86,MSP430),您必须反转多字节值的字节顺序才能正确插入它们.