假设我有下面的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的内存位置中有363 a,为什么产生的cmp不触发Z标志?
通过实验,我发现将3a36放在r15的内存位置实际上触发了Z标志,但我不明白为什么。
如果有人能把这件事曝光,我会非常感激的。
如果需要更多的信息,我很乐意提供。
发布于 2014-08-20 22:04:47
原因是MSP430是一台小终端机器。
也就是说,低地址处的字节0x439C被解释为最小有效字节。
较高地址0x439D上的字节被解释为最重要的字节。
因此,内存中的16位值实际上被解释为0x36 + (0x3A << 8) = 0x3A36。
这也解释了为什么在交换两个字节时设置Z标志。
注意:
在内存转储中,字节从左到右,从低地址到高地址。
只有对于大终端计算机(例如MC680x0),才能解释内存转储中列出的多字节值;对于小endian机器(如x86、MSP430),您必须反转多字节值的字节顺序,才能正确地替换它们。
https://stackoverflow.com/questions/25411169
复制相似问题