Синтаксис ассемблера 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 В чем разница между этими двумя?

Они просто расширения (не путайте с форматом файла). Они на самом деле ничего не значат. Файлы кода - это текстовые файлы.

Другие вопросы по тегам