Разница между String и Array в языке ассемблера - PullRequest
3 голосов
/ 19 мая 2019

В настоящее время я занимаюсь программированием ассемблера (16-бит) в DOSBox с использованием MASM.

Что я знаю:

Вот как вы объявляете строку:

var db 'abcde'

Вот как вы объявляете массив:

var db 'a','b','c'

Я точно не знаю, верны ли они, и я запутался между эти два, массив и строка

mov ah,9
int 21h

Показывает ли приведенный выше код выходную строку, а не выходной массив?

Ответы [ 2 ]

5 голосов
/ 19 мая 2019

Каждая строка может рассматриваться как массив байтов .

aString     db "abcdef", 13, 10, "$"
byteArray   db "a", "b", "c", "d", "e", "f", 13, 10, "$"

. Вы можете выводить оба одинаково:

mov     dx, offset aString
mov     ah, 09h    ; DOS.PrintString
int     21h

mov     dx, offset byteArray
mov     ah, 09h    ; DOS.PrintString
int     21h

Это работает, потому что элементы в массиве следуют друг за другом близко в памяти, и поэтому нет реальной разницы в хранилище для aString и хранилище для byteArray .

Что помогает дифференцировать, так это то, что когда люди говорят о массиве, их больше всего интересует числовое значение, которое хранится в элементе массива, а не когда они говорят о строке, их не волнует фактический код ASCII длясимволы, составляющие строку.

В aString db "abcdef", 13, 10, "$" мы видим символы a , b , ...
В byteArray db "a", "b", "c", "d", "e", "f", 13, 10, "$" мы скорее видимчисла 97 , 98 , ... (Обычно мы бы также написали это цифрами для начала!)


Но не каждый массив является строкой, потому что вы можете иметь массивы с элементами размером в слово или размером с словоэлементы.

byteArray  db 1, 2, 3     <== 3 bytes storage
wordArray  dw 1, 2, 3     <== 6 bytes storage
dwordArray dd 1, 2, 3     <== 12 bytes storage
3 голосов
/ 19 мая 2019

Там буквально нет разницы; они оба собирают одни и те же байты данных в выходной файл. (Или если бы вы включили 'd' и 'e' в версию «массива».)

Я думаю, что оператор MASM SIZEOF будет так или иначе включать всю строку объявлений.

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


Обратите внимание, что иногда слово "строка" подразумевает строку неявной длины с байтом 0 или '$' в качестве ограничителя. Таким образом, вы можете передать просто указатель на начало вместо указателя + длины для строки с явной длиной.

...