莱斯的教学目的?

2023-12-30

目的是什么les汇编指令?

为什么我们需要加载es部分and寄存器?书中给出了以下例子:

les    bx, p           ; Load p into ES:BX
mov    es:[bx], al     ; Store away AL

为什么我们需要加载es and bx在这种情况下?

还有我们为什么要使用es:[bx]? If p指向内存中的 100h,两者都不是es and bx100 小时 = 200 小时(bx+es)?


不幸的是,您正在学习架构混乱的微处理器的汇编程序。您会遇到令人困惑的概念,例如 LES 指令。

传统微处理器的寄存器足够大以包含完整的存储器地址。您可以简单地将内存位置的地址加载到寄存器中,然后通过寄存器访问该位置(通常是那些附近有索引的位置)。

有些机器(特别是实模式下的 Intel 286,这似乎就是您正在编程的机器)只有 16 位寄存器,但可以寻址 1MB 内存。在这种情况下,寄存器没有足够的位:您需要 20 位,但寄存器只有 16 位。

解决方案是使用第二个寄存器来包含丢失的位。一种简单的方案是需要 2 个寄存器,其中一个具有低 16 位,其中一个具有高 16 位,以产生 32 位地址。那么引用两个寄存器的指令就有意义了:您需要两个寄存器才能获得完整的内存地址。

英特尔选择了更混乱的segment:offset方案:普通寄存器(在您的情况下是bx)包含低16位(偏移量),特殊寄存器(称为ES)包含16位,这些16位左移4位,并添加到偏移量,以获得结果线性地址。 ES 被称为“段”寄存器,但这没有任何意义,除非你去阅读有关多路操作系统 https://stackoverflow.com/questions/501208/what-projects-do-you-feel-sorry-for/1183967#1183967大约 1968 年。

(x86 允许地址的“有效地址”或“偏移”部分采用其他寻址模式,例如es:[bx + si + 1234],但总是恰好有一个段寄存器用于存储地址。)

[当完全实现 Multics 方式时,段和段寄存器确实是一个有趣的想法。如果您不知道这是什么,并且您有any如果您对计算机和/或信息架构感兴趣,请查找 Elliot Organick 关于 Multics 的书并从头到尾阅读。你会对我们在60年代末所拥有的东西感到沮丧,并且似乎在50年的“进步”中失去了东西。如果您想对此进行更长时间的讨论,请参阅我对 FS 和 GS 段寄存器用途的讨论 https://stackoverflow.com/a/10810340/120163 ]

x86 中剩下的想法几乎就是一个笑话,至少它在“现代”操作系统中的使用方式是这样。你并不真正关心;当一些硬件设计师向您展示一台机器时,您必须接受它的本来面目。

对于 Intel 286,您只需加载段寄存器和索引寄存器即可获取完整地址。每条机器指令必须引用一个索引寄存器和一个段寄存器才能形成完整地址。对于 Intel 286,有 4 个这样的段寄存器:DS、SS、ES 和 CS。每种指令类型都显式指定一个索引寄存器,并隐式选择 4 个段寄存器之一,除非您提供显式覆盖来说明要使用哪一个。除非另有说明,否则 JMP 指令使用 CS。 MOV 指令使用 DS,除非您另有说明。 PUSH 指令使用 SS,除非您另有说明(在这种情况下最好不要)。 ES 是“额外”段;您只能通过在指令中显式引用它来使用它(块移动 [MOVB} 指令除外,它隐式使用 DS 和 ES)。

希望有帮助。

最好使用更现代的微处理器,其中段寄存器的愚蠢不是问题。 (例如,32 位模式 x86,其中主流操作系统使用平面内存模型,所有段基数 = 0。因此您可以忽略分段并使用单个寄存器作为指针,只关心地址的“偏移”部分。 )

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

莱斯的教学目的? 的相关文章

  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save

随机推荐

  • 无效的二进制或无效的 Swift 支持

    将应用程序发送到应用程序商店以供批准后 我在 iTunes Connect 中收到消息 无效的二进制文件 然后我在 Apple 发来的电子邮件中收到以下消息 无效的 Swift 支持 该捆绑包包含无效的 Swift 实现 该应用程序可能是使
  • Chart.js x 轴线性比例:奇怪的行为

    我正在尝试在 Chart js 图表中的 x 轴上使用线性刻度 我添加了一些代码 因为 stackoverflow 使其在添加 jsfiddle url 时必须这样做 但我不明白这一点 var options scales xAxes ty
  • 相当于其他编译器中 MSVC 的 _countof 吗?

    是否有任何内置的等价物 countof http msdn microsoft com en us library ms175773 v VS 100 aspx由其他编译器提供 特别是 GCC 和 Clang 有没有非宏观形式 使用C 11
  • 理解 sklearn CountVectorizer 中的“ngram_range”参数

    我对如何在 Python 的 scikit learn 库中使用 ngrams 有点困惑 具体来说 如何ngram range参数在 CountVectorizer 中工作 运行这段代码 from sklearn feature extra
  • 等待 Task.Run 与等待

    我在网上搜索了一下 看到很多关于Task Run与await async相比 但是有一个特定的使用场景 我不太理解其中的区别 我相信场景很简单 await Task Run gt LongProcess vs await LongProce
  • C# 拖放:拖动时显示拖动的项目

    我正在使用 C 和 Windows 窗体构建桌面应用程序 我有一个自定义控件 我希望能够将其拖放到我的应用程序内 而不是外部 现在我正在使用通常的 DoDragDrop OnDragOver OnDragDrop 方法来实现它 有没有什么方
  • 如何在php mysql中获取结果的所有行?

    在我的表中我有 2 条记录companyid 1 但是当我运行下面的 php 时companyid 1它只返回第一个 如何获取所有记录 php 文件 if isset GET companyid companyid GET companyi
  • R:将数据帧转换为三维数组?

    我想转换一个数据框 例如 day lt c 1 1 1 2 2 2 3 3 3 area lt c A B C area lt rep area 3 measure1 lt c 99 97 95 102 105 98 103 98 90 m
  • 查找将两个 Numpy 数组平均划分的值

    我有两个数组 x1 and x2 具有相同长度且具有重叠的值范围 我需要找到一个值q这样l1 l2被最小化 并且 l1 x1 np where x1 gt q shape 0 l2 x2 np where x2 lt q shape 0 我
  • FragmentActivity 中的“setSupportActionBar(toolbar)”?

    我如何访问setSupportActionBar Toolbar toolbar inside FragmentActivity 我无法访问里面的内容FragmentActivity toolbar Toolbar findViewById
  • Phoenix 和 Ecto 以及 SELECT

    我在凤凰城建立了一个 Ecto 模型协会 一个组织有许多组织成员 在 OrganizationMember 控制器的 Edit 方法中 我尝试创建一个 SELECT 元素来保存所有可供选择的组织 在里面edit定义 我有以下两行 organ
  • 为什么使用“composer create-project”创建项目后,依赖项不是最新的可用版本?

    因为某些原因 composer create project命令似乎会拉出过时的依赖项版本 运行后create project if I chdir创建文件夹并运行composer update 下载较新的版本 aherne aherne
  • R 将数据框从长格式重塑为宽格式? [复制]

    这个问题在这里已经有答案了 将下面的数据帧从长格式转换为宽格式的最佳方法是什么 我尝试使用重塑但没有得到预期的结果 2015 PROD A test1 2015 PROD A blue 2015 PROD A 50 2015 PROD A
  • Cython 中是否可以使用 C++ 风格的内部 typedef?

    在 C 中 可以声明作为类或结构成员的类型别名 struct Foo internal type alias typedef int DataType 有没有办法在 Cython 中做同样的事情 我尝试过最明显的方法 cdef struct
  • SystemInfo - 通过 CMD 获取计算机系统模型 - 额外空格错误

    我正在尝试通过批处理文件获取计算机系统模型类型 为此我创建了这个脚本 systeminfo find System Model gt temp TEMPSYSINFO txt for F tokens 2 delims a in temp
  • 验证 Spring Web 应用程序配置的最佳实践

    我希望我的基于 Spring 的 Web 应用程序能够validate它在启动期间的配置 这意味着例如 检查是否所需文件夹存在并且可读 可写 检查是否符合要求配置键已设定且一致 检查任何其他约束这是正确运作所必需的 您如何执行这些检查和no
  • 如何从 Quart 获取事件循环

    你好 我对 Python 相当陌生 我正在尝试将 Flask 上的现有应用程序转换为 Quart https gitlab com pgjones quart https gitlab com pgjones quart 它应该构建在 as
  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • LNK2019 错误 C++ 无法解析的外部符号

    我收到这些错误消息 错误1错误LNK2019 未解决 外部符号 public void thiscall ArrayIntStorage sortOwn void sortOwn ArrayIntStorage QAEXXZ 函数中引用 m
  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况