2011-02-04 4 views
7

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

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

 
[org 0x7C00] 
[bits 16] 

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

msg db 'X' 

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

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

+0

Возможный дубликат: http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly, http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -explanation/33581044 # 33581044 –

ответ

12

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

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

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

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

+0

Спасибо! Это прекрасно отвечало на мой вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^