; your code
start:
mov ax, @data
mov ds, ax
;your code
Я думаю, что решит вашу проблему. Dos, при загрузке .com-файла, устанавливает cs
= ds
= es
. Не так при загрузке .exe формат cs
указывается на ваш код, конечно, но ds
(и es
?) Указаны на вашем PSP (префикс сегмента программы), который обычно не там, где живут ваши данные ... Вы должны настройте ds
(и es
, если вы собираетесь использовать его) самостоятельно.
«Зачем изучать 16-битную сборку?» это хороший вопрос. «Зачем учиться собранию вообще?» это еще один хороший вопрос. Скорее всего, вы никогда не напишете ничего «серьезного» с ним. Но это позволяет вам узнать, что происходит «под капотом» таким образом, что HLL не будет, а 16-разрядный позволяет понять сегментированную модель памяти. 32-разрядный код также сегментирован, но в то время как сегменты «разные», они обычно указывают на одну и ту же память, и вы можете вообще игнорировать их - ОС заботится обо всем, что для вас.
Кроме того, некоторые из нас достаточно сумасшедшие, чтобы думать, что это весело!
DS: DX = указатель на строку, заканчивающуюся на «$» –
, можете ли вы объяснить немного дальше? – user22323
Я не могу удержаться от запроса: зачем вам пытаться изучить сборку в 16 бит в 2013 году? –