Вопрос о сборке относительно определения слов с помощью NASM - PullRequest
0 голосов
/ 03 июля 2011

Это выдержка из моей программы сборки

First: dw 0xaabbccdd

Теперь я понимаю, что это логически неверно, и я надеялся, что компилятор либо выдаст ошибку (nasm), либо просто создаст два соседних слова.

Почему это не привело к ошибке, и почему это просто обрезало первую половину двойного слова? Другими словами, в порядке байтов это напечатано в памяти и идет к старшим адресам 0xdd 0xcc. Это имело бы смысл, если бы я написал First: dw 0xccdd, но не для того, что я написал. Заранее спасибо: -).

1 Ответ

1 голос
/ 09 января 2012

Ассемблер правильный.Литеральное значение имеет длину 32 бита, но преобразование в dw усекает значение до 16 наименее значимых битов: 0xaabbccdd будет усечено до 0xccdd.

Little-endian формат означает, что значение всегда сначала сохраняется в LSB, независимо от того, равно ли это значение 16 битам или 32 битам.Итак ...

  • 0xccdd будет сохранено в памяти как 0xdd 0xcc
  • 0xaabbccdd будет сохранено в памяти как 0xdd 0xcc 0xbb 0xaa

Следовательно, не имеет значения, было ли значение усечено - первые два байта в памяти одинаковы.

Как указывает Андре Ласло, NASM выдает предупреждение для этого сценария.

...