x86汇编代码的语法

sar*_*hak 2 x86 assembly operating-system

我试图了解操作系统的基础知识,并在OCW中找到了一门课程(名为6.828).我在课程的实验中找到了bootloader的代码,我试过但不理解代码的以下部分:

# 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
Run Code Online (Sandbox Code Playgroud)

我们如何检查端口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
Run Code Online (Sandbox Code Playgroud)

上面的代码是做什么的?以"."开头的行是什么意思?此外,汇编代码似乎有两种格式.S和.asm这两种格式有什么区别?

Jes*_*ter 6

我们如何检查端口0x64是否忙?

它就在那里.如果设置bit #1(值2),则端口忙.

为什么这个端口用于启用A20位

历史原因.将此功能连接到键盘控制器很容易.就像cpu重置行一样.

上面的代码是做什么的?

树立GDT三个描述:null,codedata.我不会在这里解释GDT是什么以及保护模式分割如何工作.我希望它在本教程中介绍,或者咨询osdev.org.

以"."开头的行是什么意思?

这些是汇编程序的指令,它们指示它做事.例如.word指示它发出具有给定值的单词.有关详细信息,请参阅汇编器手册.

汇编代码.S和.asm似乎有两种格式

汇编文件有2个(或者更确切地说是3个,计数.s.S单独的)公共扩展.这些.s版本通常用于gnu工具链,而.asm用于其他版本.有两种以上的格式,每个汇编器几乎就有一种格式.这些只是文件的常用扩展,它们并没有真正定义内容.

PS:看起来你是装配的初学者,这很好,但也许你不应该立即开始使用低级操作系统的东西,直到你积累了一些经验.

  • “SEG_NULL”和“SEG”是之前定义的宏,未在您的问题中显示。GDT 是一个包含描述段的数据的表。该数据是使用宏设置的。`gdtdesc` 反过来描述了 GDT,正如注释所说,大小和位置。`LGDT` 指令需要它。 (3认同)