Синтаксис ассемблера x86
Я пытаюсь понять основы операционных систем и нашел курс по нему в OCW (названный 6.828). Я нашел код загрузчика в лабораториях курса, я пытался, но не понимал следующую часть кода:
# Enable A20:
# For backwards compatibility with the earliest PCs, physical
# address line 20 is tied low, so that addresses higher than
# 1MB wrap around to zero by default. This code undoes this.
seta20.1:
inb $0x64,%al # Wait for not busy
testb $0x2,%al
jnz seta20.1
movb $0xd1,%al # 0xd1 -> port 0x64
outb %al,$0x64
seta20.2:
inb $0x64,%al # Wait for not busy
testb $0x2,%al
jnz seta20.2
movb $0xdf,%al # 0xdf -> port 0x60
outb %al,$0x60
Как мы проверяем, занят ли порт 0x64 или нет, и почему этот порт используется для включения бита A20? Далее, чтобы заставить чип работать в 32-битном режиме, конфигурация GDT выполняется следующим образом:
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
# Bootstrap GDT
.p2align 2 # force 4 byte alignment
gdt:
SEG_NULL # null seg
SEG(STA_X|STA_R, 0x0, 0xffffffff) # code seg
SEG(STA_W, 0x0, 0xffffffff) # data seg
gdtdesc:
.word 0x17 # sizeof(gdt) - 1
.long gdt # address gdt
Что делает приведенный выше код? Что означает строки, начинающиеся с "."? Далее, для ассемблерного кода существует два формата.S и.asm. В чем разница между ними?
2 ответа
Как мы проверяем, занят ли порт 0x64 или нет?
Это прямо там. Если bit #1
(значение 2
) порт занят.
почему этот порт используется для включения бита A20
Исторические причины. Было легко подключить эту функциональность к контроллеру клавиатуры. Так же, как линия сброса процессора.
Что делает приведенный выше код?
Устанавливает GDT с тремя дескрипторами: null
, code
а также data
, Я не буду здесь объяснять, что такое GDT и как работает сегментация в защищенном режиме. Я надеюсь, что это описано в руководстве, или обратитесь к osdev.org.
Что означает строки, начинающиеся с "."?
Это директивы для ассемблера, они инструктируют его делать что-то. Такие как .word
поручает ему испустить слово с заданным значением. Обратитесь к руководству по сборке для деталей.
Похоже, есть два формата для ассемблерного кода. S и.asm
Есть 2 (точнее 3, считая .s
а также .S
как отдельные) общие расширения для сборочных файлов. .s
версии, как правило, для инструментария GNU, в то время как .asm
для других. Существует более двух форматов, по одному на ассемблер. Это просто часто используемые расширения для файлов, они на самом деле не определяют содержимое.
PS: Похоже, вы новичок в сборке, и это нормально, но, возможно, вам не следует начинать с низкоуровневой ОС, пока вы не наберете некоторый опыт.
Как мы проверяем, занят ли порт 0x64 или нет, и почему этот порт используется для включения бита A20?
Вы проверяете 3-й бит из этого порта. Более подробно:
inb $0x64,%al ; read byte from port 0x64
testb $0x2,%al ; check 3rd bit
jnz seta20.1 ; if not 0, check again
Почему этот порт, а не другой, это просто вопрос решения. Это может быть любое число. Это на самом деле не актуально. Для более подробной информации вы можете проверить это.
Что делает приведенный выше код?
Готовится к переключению из реального режима в защищенный режим.
Что означает строки, начинающиеся с "."?
Это директивы ассемблера. Они не генерируют код, но могут использоваться для других целей. Например .p2align
используется для выравнивания данных / кода по нескольким байтовым кратностям, .word
объявляет слово (в данном случае со значением 0x0017) и т. д.
Похоже, существует два формата для ассемблерного кода.S и.asm В чем разница между этими двумя?
Они просто расширения (не путайте с форматом файла). Они на самом деле ничего не значат. Файлы кода - это текстовые файлы.