Что делает директива SEG в 8086?

SEG A :

Assigns the content held in segment register corresponding to the segment in which A resides to the operand.

Я предполагаю, что это означает, что если A лежит в сегменте данных, SEG A совпадает с DS.

Поскольку DS содержит базовый адрес сегмента данных,

MOV AX, LEA A
MOV DX, SEG A
MOV AX, [AX + DX]

скопировать физический адрес A в AX?


person batman    schedule 25.01.2013    source источник
comment
Отметьте, какой ассемблер вы используете (MASM, NASM, TASM...).   -  person m0skit0    schedule 25.01.2013


Ответы (3)


Я предполагаю, что это означает, что если A лежит в сегменте данных, SEG A совпадает с DS.

Правильно, если DS указывает на сегмент данных.

Копирует ли
MOV AX, LEA A
MOV DX, SEG A
MOV AX, [AX + DX]
физический адрес A в AX?

Последняя инструкция недействительна, ее нет ни в одном из процессоров x86. Таким образом, этот код вообще ничего не делает. Во всяком случае, он просто находится в файле .asm, ожидая исправления и сборки.

person Alexey Frunze    schedule 26.01.2013
comment
Что, если бы я использовал инструкции MUL и ADD, чтобы умножить DX на 16 и прибавить к AX? - person batman; 26.01.2013
comment
Если все сделано правильно, конечно. Помните, что для физического адреса потребуется более 16 бит. Умножение 16-битного значения на 16 (или, что то же самое, сдвиг его на 4 позиции влево) делает его 20-битным. - person Alexey Frunze; 26.01.2013

Он копирует содержимое адреса AX + DX (то есть A) в AX.

MOV AX, LEA A ; Copy A offset to AX
MOV DX, SEG A ; Copy A segment to DX
MOV AX, [AX + DX] ; Copy A to AX
person m0skit0    schedule 25.01.2013
comment
О, да. Я пропустил разыменование. Спасибо. Итак, вторая строка копирует содержимое регистра DS в DX? - person batman; 25.01.2013
comment
Да, я так понял из вашего вопроса. Никогда не использовал TASM и никогда не видел эту директиву SEG. Вы можете отладить, чтобы убедиться. - person m0skit0; 25.01.2013
comment
mov ax, [ax + dx] просто вызовет рвоту у вашего ассемблера - такой инструкции нет! Адрес (в 16-битном режиме) представляет собой значение в segreg * 16 + смещение. - person Frank Kotler; 26.01.2013
comment
@FrankKotler, ах, да, мой плохой. Я не тестировал этот код. Итак, если я захочу это сделать, мне ПРИДЕТСЯ использовать инструкции MUL и ADD? - person batman; 26.01.2013

SEG предоставляет сегмент операнда. Если на переменный сегмент не ссылается ни один сегментный регистр, вы можете использовать SEG. Но в противном случае вы должны использовать LEA, LDS. пример:

 .data

вар дб ? .код х дб?

Начало: ...

для var SEG — это DS, а для x SEG — это CS, их адреса сегментов.

person user2991856    schedule 30.06.2014