Допустим, у меня есть сегмент сборки 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 должны быть равны. Если у меня 363a в ячейке памяти r15, почему полученный cmp не запускает флаг Z?
Путем экспериментов я обнаружил, что размещение 3a36 в ячейке памяти r15 на самом деле запускает флаг Z, но я не понимаю почему.
Если бы кто-нибудь мог раскрыть это, я был бы очень признателен.
Если потребуется дополнительная информация, я с радостью ее предоставлю.
1 ответ
Причина в том, что MSP430 является машиной с прямым порядком байтов .
Т.е. байт младшего адреса 0x439C
интерпретируется как младший значащий байт.
Байт по старшему адресу 0x439D
интерпретируется как Самый значащий байт.
Таким образом, 16-битное значение в памяти фактически интерпретируется как 0x36 + (0x3A << 8) = 0x3A36
.
Это также объясняет, почему вы получаете установленный флаг Z, если вы меняете местами оба байта.
Примечание:
В дампе памяти байты перечислены слева направо от младших адресов к старшим.
Только для машин с прямым порядком байтов (например, MC680x0) вы можете интерпретировать многобайтовые значения, как они перечислены в дампе памяти; для машин с прямым порядком байтов (например, x86, MSP430) вам необходимо изменить порядок байтов многобайтовых значений, чтобы правильно их интерпретировать.
Похожие вопросы
Новые вопросы
assembly
Вопросы по языку ассемблера. Отметьте процессор и/или набор инструкций, которые вы используете, а также ассемблер, допустимый набор должен быть таким: ([assembly] [x86] [gnu-assembler] или [att]). Вместо этого используйте тег [.net-assembly] для сборок .NET, [cil] для языка ассемблера .NET и вместо байт-кода Java используйте тег java-bytecode-asm.