让我们说下面有MSP430组装部分:
R15:
439c
记忆图:
4390: 6045 0200 9c43 6400 8844 5044 363a 0000
代码:
448a: cmp #0x363a, 0x0(r15)
4490: jnz $+0x1c
4492: Code continues
.
.
.
44ac: Jump to location
目标是让Z标志高。要使用cmp执行此操作,src和dst必须相等。 如果我在r15的内存位置有363a,为什么生成的cmp不会触发Z标志?
通过实验,我发现将3a36放在r15的记忆位置实际上触发了Z标志,但我不明白为什么。
如果有人能说清楚,我会非常感激。
如果需要更多信息,我很乐意提供。
答案 0 :(得分:11)
原因是MSP430是 little endian 机器
即较低地址0x439C
处的字节被解释为最少重要字节。
较高地址0x439D
的字节被解释为最多重要字节
因此,内存中的16位值实际上被解释为0x36 + (0x3A << 8) = 0x3A36
。
这也解释了为什么在交换两个字节时设置Z标志的原因。
注意:
在内存转储中,从低到高的地址从左到右列出字节
仅适用于大端机器(例如MC680x0),您可以解释内存转储中列出的多字节值;
对于小端机器(例如x86,MSP430),你必须颠倒多字节值的字节顺序才能正确地插入它们。