首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86程序集代码的语法

x86程序集代码的语法
EN

Stack Overflow用户
提问于 2015-01-30 18:58:41
回答 2查看 1.4K关注 0票数 2

我试图了解操作系统的基本知识,并在开放式课程(命名为6.828)中找到了一门关于操作系统的课程。我在本课程的实验室中找到了引导加载程序的代码,我尝试了,但没有理解代码的以下部分:

代码语言:javascript
复制
# 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的配置如下:

代码语言:javascript
复制
# 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似乎有两种格式,两者之间有什么区别呢?

EN

回答 2

Stack Overflow用户

发布于 2015-01-30 19:19:04

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

就在那儿。如果设置了bit #1 (值2),则端口正处于繁忙状态。

为什么使用此端口启用A20位?

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

上面的代码是做什么的?

用三个描述符设置GDT:nullcodedata。我不会在这里解释什么是GDT和如何保护模式分割工作。我希望在本教程中介绍它,否则请参考osdev.org

从".“开始的行的含义是什么?

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

程序集代码.S和.asm似乎有两种格式

程序集文件有2个(或者更确切地说是3个,将.s.S作为单独的)公共扩展名。.s版本通常用于gnu,而.asm版本则适用于其他版本。有两种以上的格式,几乎每个汇编程序一种。这些只是文件的常用扩展名,它们并不真正定义内容。

PS:看起来你是一个组装的初学者,这是很好的,但也许你不应该开始从低水平的操作系统的东西,立即,直到你收集了一些经验。

票数 8
EN

Stack Overflow用户

发布于 2015-01-30 19:19:50

我们如何检查端口0x64是否繁忙,以及为什么使用该端口启用A20位?

你从那个端口检查第三位。更详细的是:

代码语言:javascript
复制
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似乎有两种格式,两者之间有什么区别?

它们只是扩展名(不要与文件格式混淆)。它们实际上毫无意义。代码文件是文本文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28242830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档