Автор: akaGM
Дата сообщения: 29.04.2010 19:36
Abs62
тебя всё на 32+ бита тянет, а чел, небось, на турбо16 сидит...
[more=вот пример геморра с offset в старых версиях масма]
Пример поможет нам пояснить, как легко можно нажить неприят-
ности из-за специфики адресации в MASM. Рассмотрим следующую не-
полную программу MASM, в которой описываются три сегмента данных:
dseg1 SEGMENT para public 'data'
v1 db 0
dseg1 ENDS
dseg2 SEGMENT para public 'data'
v2 db 0
dseg2 ENDS
dseg3 SEGMENT para public 'data'
v3 db 0
dseg3 ENDS
DGROUP GROUP dseg1,dseg2,dseg3
cseg SEGMENT para public 'code'
ASSUME cs:cseg,ds:DGROUP
start:
mov ax,OFFSET v1
mov bx,OFFSET v2
mov cx,OFFSET v3
cseg ENDS
END start
Три сегмента dseg1, dseg2 и dseg3 группируются под одним
именем DGROUP. В результате все переменные отдельных сегментов
хранятся в памяти вместе. В исходном тексте программы в каждом из
отдельных сегментов описывается байтовая переменная (метки v1, v2
и v3).
В коде данной программы MASM в регистры AX, BX и CX загружа-
ются смещения адресов этих переменных. В соответствии с предшест-
вующей директивой ASSUME и из-за того, что сегменты данных сгруп-
пированы вместе, вы можете подумать, что MASM будет вычислять
смещения переменных относительно всей группы, в которой перемен-
ные очевидно хранятся в памяти.
Но произойдет совсем не это! Вопреки вашим намерениям MASM
вычисляет смещения переменных относительно отдельных сегментов
dseg1, dseg2 и dseg3. Он делает это несмотря на то, что все три
сегмента данных сгруппированы в памяти в один сегмент данных, ад-
ресуемый через регистр DS. Бессмысленно определять смещения пере-
менных относительно отдельных сегментов в тексте программы, ког-
да эти сегменты скомбинированы в памяти в один сегмент.
Единственный способ ссылки на такие переменные состоит в ссылке
на их смещения относительно всей группы.
Чтобы избавиться в MASM от этой проблемы, вам потребуется
наряду с ключевым словом OFFSET задавать имя группы:
mov ax,OFFSET DGROUP:v1
mov bx,OFFSET DGROUP:v2
mov cx,OFFSET DGROUP:v3
[/more]