Допустим, у меня есть сегмент сборки 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, но я не понимаю почему.

Если бы кто-нибудь мог раскрыть это, я был бы очень признателен.

Если потребуется дополнительная информация, я с радостью ее предоставлю.

9
KKK 20 Авг 2014 в 21:41

1 ответ

Лучший ответ

Причина в том, что MSP430 является машиной с прямым порядком байтов .
Т.е. байт младшего адреса 0x439C интерпретируется как младший значащий байт.
Байт по старшему адресу 0x439D интерпретируется как Самый значащий байт.
Таким образом, 16-битное значение в памяти фактически интерпретируется как 0x36 + (0x3A << 8) = 0x3A36.

Это также объясняет, почему вы получаете установленный флаг Z, если вы меняете местами оба байта.

Примечание:
В дампе памяти байты перечислены слева направо от младших адресов к старшим.
Только для машин с прямым порядком байтов (например, MC680x0) вы можете интерпретировать многобайтовые значения, как они перечислены в дампе памяти; для машин с прямым порядком байтов (например, x86, MSP430) вам необходимо изменить порядок байтов многобайтовых значений, чтобы правильно их интерпретировать.

13
Curd 21 Авг 2014 в 02:24
Большое спасибо за ответ, это имеет смысл. Моя путаница была с порядком байтов от старшего до младшего. Я предположил, что это были побитовые обращения, а не побайтовые.
 – 
KKK
21 Авг 2014 в 02:14