为什么 lea 指令只是执行算术运算,却以内存寻址命名? [复制]

2023-12-04

The lea指令(“加载有效地址”)获取第一个值的内存地址并将其与第二个值相加 - 第二个值可能会相乘。然后它将该内存地址加载到给定的寄存器中。

我举个例子来澄清一下我的困惑:

eax = 2
leal (%eax, %eax, 4), %edx

我相信这样做的结果是edx将会有价值10在它里面(2 + 2 * 4 == 10). But 如果这条指令只是对整数进行算术运算,为什么它是针对内存地址的?

我读过其他回复,但他们都说内存地址是唯一涉及的内容。有人可以帮我理解什么吗leal是在做?


LEA 之所以如此工作,是因为在最初的 8086 上,LEA 指令重用了处理器的有效地址计算硬件。有效地址硬件计算指令的内存操作数所作用的地址。由于需要执行许多不同的基本操作来计算有效地址,这意味着相对而言,需要将大量的能量打包到一个LEA操作说明。大多数“真实”算术指令一次仅执行一项操作,并且大多数要求目标寄存器是源操作数之一。由于它可以实现少量的额外编码空间和硅面积,因此考虑到它的能力,它相当便宜。

所以像这样的指令MOV AX,[BX + SI](我在这里使用英特尔语法)加载AX与存储在通过添加计算出的地址处的 16 位值BX and SI。指令LEA AX,[BX + SI] loads AX通过添加计算出的地址BX and SI。换句话说,LEA 指令处理内存操作数的方式与其他指令不同。它不是对内存操作数指示的地址处的内存进行操作,而是直接使用计算出的地址作为操作数。两条指令使用相同的地址编码,LEA 指令只是调整内存操作数的解释方式。

换句话说,LEA 之所以这样称呼,是因为这正是它的作用。它将内存操作数给出的有效地址加载到目标寄存器中。由于内存操作数实际上并不用作内存操作数,因此它实际上像普通算术指令一样工作。如果ADD是加法运算指令,那么LEA就是有效地址运算指令。

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

为什么 lea 指令只是执行算术运算,却以内存寻址命名? [复制] 的相关文章

  • 32位PPC rlwinm指令

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

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • Core i3/5/7 CPU 是否提供测量 IPC 的机制?

    至少 过去十年中的所有英特尔 CPU 都包含一组对各种事件进行计数的性能监视器 最新的 Intel CPU Core i3 i5 和 i7 又名 Nehalem 是否提供了计算每时钟指令 IPC 的机制 如果有 它们是如何使用的 如果可能的
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • 各种中断的区别:SCI、SMI、NMI、普通中断

    我正在学习英特尔架构 到目前为止我遇到过几种类型的中断 SCI 系统控制中断 硬件使用的系统中断 用于向操作系统通知 ACPI 事件 SCI 是一个有效 低电平 可共享的电平中断 SMI 系统管理中断 由遗留系统上的中断事件生成的操作系统透
  • IDA pro asm 指令更改

    我只是想知道我怎样才能 更改IDA视图A中的asm指令 如何编辑指令 对于 实例 jnz 到 jmp 如何插入新指令 call func1 调用 func2 插入到现有的 代码 我知道如何制作 diff 文件 我知道如何在我的 DLL 上应
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 难以理解汇编命令“加载有效地址”[重复]

    这个问题在这里已经有答案了 可能的重复 LEA 指令的目的是什么 https stackoverflow com questions 1658294 whats the purpose of the lea instruction LEA指
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da

随机推荐

  • 删除未级联到sqlalchemy中的表

    我正在开发一个使用 sqlalchemy 0 6 的现有应用程序的扩展 该应用程序具有以非声明方式创建的 sqlalchemy 表 我试图在我的扩展中创建一个新表 其中外键列指向应用程序数据库中主表的主键 并且我以声明方式创建它 这一切都工
  • 在 Google 搜索中显示最后一个 Schema.org 面包屑条目?

    我正在尝试根据 Schema org 标记我的面包屑 以便在 Google 结果中获得面包屑 如下所示 首页 gt 分类 gt 当前页面 但根据我当前的标记 它只显示 首页 gt 分类 我的标记中是否缺少某些内容 示例页面 我正在使用 Wo
  • java中调用R-Rcaller

    我正在尝试通过使用 R 调用程序在 java 中使用 R 来实现集群 我正在尝试运行示例代码进行聚类验证 并且遇到大多数用户面临的常见错误 文件过早结束 package test import rcaller RCaller import
  • python http状态码

    我正在用 python 编写自己的目录破坏程序 并在安全可靠的环境中针对我的 Web 服务器进行测试 该脚本基本上尝试从给定网站检索常见目录 并查看响应的 HTTP 状态代码 它能够确定页面是否可访问 首先 该脚本读取一个包含所有要查找的有
  • 浮点加法 - 给出奇怪的结果..!

    当执行以下代码时 public class FPoint public static void main String args float f 0 1f for int i 0 i lt 9 i f 0 1f System out pri
  • 如何检测文件使用的压缩类型? (如果未指定文件扩展名)

    如何检测文件使用的压缩类型 假设未指定 zip gz xz 或任何其他扩展名 此信息是否存储在该文件的标头中的某个位置 你可以确定它是likely通过查看前几个字节来确定是其中一种格式 然后你应该测试一下是否真的is其中之一 使用该格式的相
  • Web浏览器打印后关闭应用程序

    我尝试使用 WebBrowser 类打印格式化的 HTML 打印后 我想关闭应用程序 如果我尝试关闭应用程序 则打印无法正常工作 我尝试使用计时器也没有效果 请找到下面的代码 static void Main string args var
  • SOLR 可以执行 UPSERT 吗?

    我一直在尝试在 solr 中执行相当于 UPSERT 如果已存在则插入或更新 的操作 我只知道什么不起作用 并且我读过的 solr lucene 文档没有帮助 这是我尝试过的 curl localhost 8983 solr update
  • SimpleDateFormat 字符串的正则表达式 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的日期主要有以下形式yyyy MM dd and yyyy MM dd hh mm ss 我想要模式匹配yyyy MM dd hh mm ss 为此目的编写正则表达式很简单吗 我是正
  • 如何在IE8中动态创建CSS类

    我需要在 IE8 中使用 JavaScript 动态创建 CSS 样式表类 我在其他浏览器中使用了以下代码 var style document createElement style style type text css style i
  • Flickr API iOS 应用程序“POST 大小太大!”

    我正在尝试使用 API 将照片从 iOS 应用程序发送到 Flickr 我已成功获得授权并准备好使用令牌 我通过 HTTP POST 发送照片数据 并遵循此处的格式指南 http www flickr com services api up
  • 故事板奇怪的控制器视图框架起源

    我在 Xcode s 故事板中遇到了一个奇怪的问题 我的板上有大量视图控制器 由于某种原因 它们所有视图的原点都不为 0 所有 x 原点都是 160 y 原点都是 240 所有视图看起来仍然位于左上角 奇怪的是 大多数视图控制器的子视图似乎
  • 将字符串字段值更改为其子字符串的最有效方法

    我有一个包含如下文档的集合 data 11 version 0 0 32 有些有test后缀为version data 55 version 0 0 42 test The version字段具有不同的值 但它始终符合以下模式 0 0 XX
  • Scrapy如何提取类内部属性中的文本?

    我有下面的 HTML 代码 div class hero data skills item hero data skills item passive J tooltip title div
  • 将文档预加载到 iOS 应用程序中

    情况 我有一个 iOS 应用程序 可以处理文件并允许用户保存 编辑 打开这些文件并执行各种操作 我希望能够有一些预制文档供用户在打开应用程序 例如模板 以及他们自己的自定义文档时查看 问题 如何创建文档 或模板文件 并在用户安装我的应用程序
  • 在微风中创建复杂类型的未绑定实例的正确方法是什么?

    想象一下以下模型 class ComplexTypeA public string ComplexPropertyA class ParentTypeA public string ParentPropertyA public Comple
  • 省略html的可选标签

    我刚刚读过本文来自谷歌 我一直认为结束标签对于保持 html 文档干净并使其机器可读非常重要 但他们建议相反 你怎么看待这件事 谷歌的情况有点不寻常 因为他们提供了太多的主要搜索页面副本 以至于页面大小的任何微小节省很快都会增加 这意味着对
  • plpgsql - 在声明语句中使用动态表名

    我正在尝试编写 plpgsql 一个以下形式的函数 注意这是一个简化版本 CREATE FUNCTION check valid tablename regclass RETURNS boolean AS DECLARE valid row
  • css3 比例周围的空白

    我有一个小问题想要解决 但找不到任何好的答案 当我在 div 包含其他 div 上使用比例时 它会在 div 的 原始 宽度和高度周围留下空白 如何在缩放时删除 div 周围的空白 如果需要的话我可以使用js 编辑 这是一些代码 HTML
  • 为什么 lea 指令只是执行算术运算,却以内存寻址命名? [复制]

    这个问题在这里已经有答案了 The lea指令 加载有效地址 获取第一个值的内存地址并将其与第二个值相加 第二个值可能会相乘 然后它将该内存地址加载到给定的寄存器中 我举个例子来澄清一下我的困惑 eax 2 leal eax eax 4 e