Сборка: Использование регистра сегмента данных (DS) - PullRequest
9 голосов
/ 05 февраля 2011

В настоящее время я занимаюсь сборкой x86 для удовольствия, я люблю программирование микроконтроллеров, поэтому я знаком со сборкой.

В настоящее время я искал ответ на этот вопрос все выше и ниже, но не могу найти его ... регистр DS, я знаю, что он должен указывать на глобальные данные в моей программе, но я не знаю, как это работает точно. Я использую NASM, и в большинстве простых программ я вижу следующее:

[org 0x7C00]
[bits 16]  

main:
<b>mov ax, 0x0000
mov ds, ax</b>
mov al, [msg]  
mov ah, 0x0E  
mov bx, 0x0007  
int 0x10    
jmp $  

msg db 'X'

times 510-($-$$) db 0  
dw 0xAA55

и это прекрасно работает (даже если я опущу жирный код), но как? Загружает ли процессор автоматически глобальные переменные, начиная с 0x0000? или здесь есть что-то присущее мне, что мне не хватает?

1 Ответ

13 голосов
/ 05 февраля 2011

Когда компьютер находится в реальном режиме (режиме, в котором ЦП работает, когда BIOS выполняет загрузчик), метод, который ЦП использует для вычисления адреса, очень прост: умножить значение регистра сегмента на 16 (сдвинуть биты 4 в позиции, чтобы влево), затем добавьте смещение.

Например, в такой инструкции, как «mov ax, [0x1234]», ЦП будет использовать «DS * 0x10 + 0x1234» в качестве эффективного адреса (первый член в вашем случае обнуляется.) Когда у вас есть один «» mov ax, [BP + 0x32] ", тогда процессор будет использовать" SS ​​* 0x10 + BP + 0x32 ". Обратите внимание, что теперь ЦП использовал другой регистр сегмента (сегмент стека), и это потому, что когда используется регистр BP, ЦП предполагает, что вы не хотите получать доступ к стеку по умолчанию (но вы можете переопределить это с помощью [DS : BP + 0x32]).

Больше или меньше того, что я объяснил, и больше можно найти в http://wiki.osdev.org/Real_Mode и http://www.internals.com/articles/protmode/realmode.htm и во многих других местах.

Кстати, "msg" должно быть расположено более или менее по адресу 0x7C11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...