Ответ NASM: MASM совершенно другой
Один из ответов на связанный вопрос содержит цитату из примеров руководства NASM, которая действительно отвечает на ваш вопрос. По запросу я расширю его для всех трех случаев (и исправлю ошибку кодирования ASCII в нижнем и верхнем регистре!):
db 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 (5 bytes)
dw 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 (6 bytes, 3 words)
dd 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 2 doublewords)
dq 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 1 quadword)
Таким образом, разница в том, что он дополняется нулями до кратного размера элемента, когда вы используете dd
или dw
вместо db
.
Согласно комментарий Хосе, некоторые ассемблеры могут использовать другой порядок байтов для строковых констант dd
или dw
. В синтаксисе NASM строка всегда сохраняется в памяти в том же порядке, в котором она отображается в указанной константе.
Вы можете собрать это с помощью NASM (например, в плоский двоичный вывод по умолчанию) и использовать hexdump -C
или что-то еще, чтобы подтвердить порядок байтов и количество отступов.
Обратите внимание, что это дополнение к размеру элемента применяется к каждому элементу, разделенному запятыми. Итак, внешне невинный dd '%lf', 10, 0
на самом деле собирается так:
;dd '%lf', 10, 0
db '%lf',0, 10,0,0,0, 0,0,0,0 ;; equivalent with db
Обратите внимание на 0
перед новой строкой; если вы передадите указатель на это printf
, строка C будет просто "%lf"
, оканчивающаяся первым 0
байтом.
(write
системный вызов или fwrite
функция с явной длиной будет печатать все это, включая 0
байтов, потому что эти функции работают с двоичными данными, а не с строками неявной длины C.)
Также обратите внимание, что в NASM вы можете делать такие вещи, как mov dword [rdi], "abc"
, для сохранения abc \ 0 в памяти. т.е. многосимвольные литералы работают как числовые литералы в любом контексте в NASM.
MASM очень отличается
См. При использовании мнемоники MOV для загрузки / копирования строки в регистр памяти в MASM символы сохраняются в обратном порядке? подробнее. Даже в dd "abcd"
MASM разбивает ваши строки, меняя порядок байтов внутри фрагментов на обратный по сравнению с исходным порядком.
person
Peter Cordes
schedule
09.08.2016
my_array DW 1,2,3,4
, эта переменная содержит 4 значения, каждое значение имеет длину 2 байта, поэтому переменная имеет размер 8 байтов. - person Jose Manuel Abarca Rodríguez   schedule 09.08.2016Digits: db '0'
, а затем на новой строке делаетdb '1', '2', '3', ...'F'
. (значит, метка Digits имеет адрес байта, содержащего «0»). Синтаксис'string'
- это ярлык для определения значений нескольких байтов. - person Ped7g   schedule 10.08.2016