x86汇编代码的语法

2024-04-05

我试图了解操作系统的基础知识,并在 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,两者之间有什么区别?


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

它就在那里。如果bit #1 (value 2) 设置端口忙。

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

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

上面的代码做了什么?

使用三个描述符设置 GDT:null, code and data。我不会在这里解释什么是 GDT 以及保护模式分段是如何工作的。我希望它包含在教程中,否则请参阅osdev.org http://wiki.osdev.org/Protected_Mode.

以“.”开头的行的含义是什么?

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

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

有 2 个(或者更确切地说 3 个,数.s and .S作为单独的)程序集文件的通用扩展名。这.s版本通常适用于 gnu 工具链,而.asm是为了别人。有两种以上的格式,几乎每个汇编器都有一种格式。这些只是文件的常用扩展名,它们并没有真正定义内容。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86汇编代码的语法 的相关文章

  • DASM 汇编器中的 ASCII 到 C64 屏幕代码

    我正在通过 C64 模拟器学习 6502 micro 的汇编 目前正在尝试将字符串输出到屏幕 这是我的代码 processor 6502 org 1000 ldx 00 using x register as column counter
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 遍历内存编辑每个字节

    我正在编写汇编代码 提示用户输入一串小写字符 然后输出包含所有大写字符的相同字符串 我的想法是迭代从特定地址开始的字节 并从每个字节中减去 20H 将小写变为大写 直到到达具有特定值的字节 我对 Assembly 相当缺乏经验 所以我不确定
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • 全局键盘挂钩的合法用途是什么?

    除了仅应由操作系统提供的应用程序启动快捷方式之外 Windows 键盘挂钩等东西的合法用途是什么 在我看来 我们只在键盘记录器之类的事情上遇到问题 因为操作系统提供了钩子来执行除操作系统内核本身之外的任何情况下任何人都不允许执行的操作 编辑
  • 将两个 32 位整数向量相乘,生成 32 位结果元素向量

    将每个 32 位条目乘以 2 的最佳方法是什么 mm256i互相注册 mm256 mul epu32不是我正在寻找的 因为它产生 64 位输出 我想要每个 32 位输入元素都有一个 32 位结果 而且 我确信两个 32 位值的乘法不会溢出
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r

随机推荐

  • 从 VSS 获取给定日期的所有文件?

    有没有办法让 Visual source safe 获取项目给定日期的所有文件 我们不使用标签 所以我无法回滚到特定标签 并且希望我可以以某种方式调用某个日期范围来获取特定日期存在的文件 不可能的 据我所知你必须使用get http msd
  • 使用cv2.imread:“ returned NULL without set an error”,好像无法打开图片或获取数据

    这是我的代码中出现问题的部分 它应该计算图片中绿色像素的数量 img Image open path tif BLACK MIN np array 0 20 20 np uint8 BLACK MAX np array 120 255 25
  • 如何记录 PostgreSQL 查询?

    如何启用 PostgreSQL 8 3 执行的所有 SQL 的日志记录 已编辑 更多信息 我改变了这些行 log directory pg log log filename postgresql Y m d H M S log log st
  • Eclipse:更改ctrl+shift+/的块注释样式

    The keyboard shortcut ctrl shift produces comments in the format of comment 如何更改快捷方式 以便在星号前后添加空格 comment 非常感谢 I m afraid
  • 如何在 Node.js 中列出 cloudinary 文件夹中的所有图像/视频?

    我是新手Node js 我已经开始通过克隆来构建一个应用程序云数示例项目来自github https github com cloudinary cloudinary npm 然后我将工作目录更改为 photo album 并安装了应用程序
  • 将txt文件的内容分解为数组

    我在分解 txt 文件的内容时遇到问题 结构如下 01Name 1 02whatever contents 03whatever contents 01Name 2 02whatever contents 03whatever conten
  • 将变量从 flash 传递到 HTML/php

    我希望也许有人可以对我很难决定如何解决的问题提供一些见解 我有一个相当简单的 Flash 应用程序 用户可以在连接时快速创建一个用户名 并且该用户名是在 Flash swf 内创建的 现在 我有一个 cron 作业 每十分钟删除一次不活动的
  • 用于 bean 验证的自定义验证消息

    我正在创建一个 JSF 2 应用程序 并且尝试在 bean 中而不是 faces page 中使用表单验证 我还想使用 properties 文件来存储消息 我在看这个问题 https stackoverflow com questions
  • 卸载后取消 Redux 操作

    我想在组件卸载后取消一些功能 因为它会导致内存泄漏我的代码如下所示 componentDidUpdate prevProps if prevProps org org this props org org this mounted this
  • 如何使用 Perl SOAP 获取 JIRA 中的自定义字段列表?

    我很好奇是否有其他人知道如何获取您在 JIRA 中创建的所有自定义字段的列表 如果是这样 你是怎么做到的 我一直在尝试使用我在上找到的 Perl SOAP 例程JIRA SOAP 服务文档 http docs atlassian com s
  • Phonegap - 无法从服务器下载存档

    我正在尝试从我的 Phonegap Developer 应用程序运行电话间隙应用程序 但出现错误 无法从服务器下载存档 我正在连接到电话间隙桌面应用程序中显示的 IP 地址 PhoneGap 桌面应用程序显示消息 服务器正在运行http 1
  • 使用自定义键进行数组拼接

    假设我有这个代码 test array test zero abc test two ghi test three jkl dump test array splice test 1 0 def dump test 这给了我输出 Array
  • EF Core 中的 modelBuilder.Configurations.AddFromAssembly

    In EntityFramework 6 x 如果我们有很多EntityConfiguration那么我们可以将它们全部分配给OnModelCreating ModelBuilder modelBuilder 不一一列举如下 protect
  • MVC RadioButtonFor 组

    我有一个 PDF 课程 public class UIClonePDFDetail public int CatalogueID get set public List
  • 通过 API 在我的 Android 应用程序中查看 Excel 文件

    我想在我自己的 Android 应用程序中查看 Excel 文件 目前 使用我的应用程序我可以看到所有谷歌文档 但是在单击任何一个文档 例如 Excel 文件 myDemo xls 后 我想在我自己的应用程序中打开它 用于查看目的 我读过关
  • 使用 Python Paramiko 在不同的 SSH 服务器中并行运行多个命令

    我有一个SSH py目标是通过 SSH 连接到许多服务器来运行 Python 脚本 worker py 我正在使用 Paramiko 但对它非常陌生 并且不断学习 在我通过 ssh 连接的每台服务器上 我需要保持 Python 脚本运行 这
  • 如何使用 ASP.NET 5 MVC 6 保护 Web API

    我有一个很好的 ASP NET 5 MVC 6 应用程序正在运行 本质上 出于此目的 它只是您在启动新项目时获得的普通示例应用程序 以保持简单 到目前为止我可以 注册用户 Login Logout 保护页面 强制登录等 现在 我想要的是为应
  • “venv activate”不会改变我的Python路径

    我创建了一个虚拟环境 假设 test venv 我激活它 一切成功 然而 Python 解释器的路径不会改变 我已经在下面说明了这种情况 为了澄清起见 python 路径应该是 Desktop test venv bin python gt
  • .NET System.Text.Decoder.Convert 方法在字符中间返回completed==true

    我需要从 UTF 8 字节序列中读取一个字符串 这些字节的来源来自单独的读取操作 这些操作不考虑字符边界 因此我无法使用 System Text Encoding UTF8 GetString 但是 由 System Text Encodi
  • x86汇编代码的语法

    我试图了解操作系统的基础知识 并在 OCW 中找到了相关课程 名为 6 828 我在课程的实验室中找到了引导加载程序的代码 我尝试了但不明白以下部分代码 Enable A20 For backwards compatibility with