源操作数和目标操作数是否需要相同大小?

2024-04-17

我刚刚尝试了这个问题,要求你解释一下代码行有什么问题:

movl %eax, %rdx

解决方案表明目标操作数的大小错误。

仅当从较大尺寸变为较小尺寸时才“非法”,还是源操作数和目标操作数对于所有指令(或至少 mov 类类型)必须具有相同的尺寸?


是的,除了一些特殊指令之外,操作数必须具有相同的大小,例如shl %cl, %eax or movzwl %ax, %edx.

CPU 执行机器代码,而不是汇编。在机器代码中,有操作码和前缀(以及 64 位模式提供的默认值)来指定操作数大小。每个操作数没有单独的大小属性;那会浪费比特。

汇编语言是一种用于描述/指定机器指令的文本格式。

ISA 设计者(Intel,然后是 64 位模式的 AMD)选择根据窄操作数大小来定义指令集中部分寄存器的语义。当您写入 AL、AH 或 AX(由 Intel 在 8086 和 808386 中定义,AMD64 与之匹配)时,对完整寄存器的影响将被合并,或者当您写入 EAX 时,隐式零扩展到 RAX(AMD64 中的新语义)寄存器中新的部分)。

See 为什么 32 位寄存器上的 x86-64 指令会将整个 64 位寄存器的上部清零? https://stackoverflow.com/questions/11177137/why-do-x86-64-instructions-on-32-bit-registers-zero-the-upper-part-of-the-full-6以及 Intel 的指令集参考指令like mov https://www.felixcloutier.com/x86/mov vs. movsx https://www.felixcloutier.com/x86/movsx:movsxd (and movsxd这是 AMD64 的新功能)。

在 asm 文本语法中,没有对应于的机器代码movl %eax, %rdx.
汇编器正确地告诉你这是没有意义的。

这也是 AT&T 语法附加操作数大小后缀 (b/w/l/q) 到助记符,而不是单独到每个操作数。唯一的歧义是没有寄存器操作数的指令,只有立即数和内存操作数andl $1, (%rdi) vs. andb $1, (%rdi) or notq (%rdi, %rsi, 8).

有一个说明movsld %eax, %rdx to 符号扩展从 32 位到 64 位。 (没有movzx32 至 64;这隐含在mov %eax, %edx: MOVZX 缺少 32 位寄存器到 64 位寄存器 https://stackoverflow.com/questions/51387571/movzx-missing-32-bit-register-to-64-bit-register,只有 8 位或 16 位源操作数,例如movzbl %al, %edx.)

还有其他具有不同大小操作数的特殊指令,例如移位shl %cl, %edx.

这种语法设计非常适合加载/存储,例如mov %eax, (%rdi) or add (%rdi), %esi,其中寄存器操作数意味着内存操作数大小。如果mov可能有两个单独的大小,您总是需要指示内存操作数大小,就像您作为 movzx/movsx 助记符的一部分所做的那样。 (例如 AT&T 语法movzbl (%rdi), %eax通过显式写入 EAX 将字节从内存隐式零扩展到 RAX。)


描述机器代码的文本语法的其他设计是possible,例如你可以发明一种语法,其中movl %eax, %rdx只是使零扩展变得明确,也许movl %eax, %edx不允许,因为无法写入 32 位寄存器without隐式零扩展至 64 位。然后你可以定义movl (%rdi), %rdx作为 32 位负载(由l后缀)零扩展到 64 位 RAX。即我们当前在 AT&T 语法中定义为movl (%rdi), %edx.

我认为假设的设计比仅仅说大多数指令要求所有操作数具有相同的宽度更不直观。实际上,AT&T 语法并不是这样设计的。相反,AT&T 采用了与 Intel / AMD 在其手册中使用的相同约定,只是操作数顺序相反。我不知道任何以这种方式工作的 ISA 的语法;当写入窄寄存器隐式零扩展时,这会隐含在 asm 文本语法中(例如,在 AArch64 中,以及所有各种 x86-64 语法;Intel、AT&T、Plan9/Go)


参考:

  • x86-64 (AMD64) 架构中是否有默认操作数大小? https://stackoverflow.com/questions/68289333/is-there-a-default-operand-size-in-the-x86-64-amd64-architecture- 是的,在 64 位模式下,大多数操作码都是 32 位的,字节操作数大小的操作码除外。 16 和 64 位大小由前缀表示。

  • 为什么 64 模式下默认操作数大小为 32 位? https://stackoverflow.com/questions/59849429/why-is-default-operand-size-32-bits-in-64-mode- 这个选择是有道理的,因为 32 位int除其他历史原因外,它足够大且常用。

  • https://wiki.osdev.org/X86-64_Instruction_Encoding https://wiki.osdev.org/X86-64_Instruction_Encoding

  • 以及英特尔的手册和其他链接https://stackoverflow.com/tags/x86/info https://stackoverflow.com/tags/x86/info

  • 为什么当操作数大小相同时 MOVZX 不起作用? https://stackoverflow.com/questions/67933514/why-doesnt-movzx-work-when-operands-have-the-same-size- 它确实如此,但效率低下,因此大多数汇编器拒绝它。

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

源操作数和目标操作数是否需要相同大小? 的相关文章

  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

    我只是汇编语言编程的初学者 我们的第一个任务是让程序仅在输入为 ESC 时退出 退出之前请求确认 y n 否则循环 我知道 ESC 在 ASCII 代码中具有等效值 但我对插入位置或是否需要添加更多内容感到困惑 请帮我 这是程序 model
  • 为什么当设置为 TLS 选择器时,ES 和 DS 在 64 位内核上最终会归零?

    下面的 32 位程序调用set thread area 2 http linux die net man 2 set thread area在 GDT 中创建一个条目 该条目旨在用于 TLS 通常将结果选择器放入FS or GS并成功使用
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 遍历内存编辑每个字节

    我正在编写汇编代码 提示用户输入一串小写字符 然后输出包含所有大写字符的相同字符串 我的想法是迭代从特定地址开始的字节 并从每个字节中减去 20H 将小写变为大写 直到到达具有特定值的字节 我对 Assembly 相当缺乏经验 所以我不确定
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 汇编基础知识:输出寄存器值

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

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L

随机推荐

  • 使用 python 进行简单的 ascii url 编码

    看那个 import urllib print urllib urlencode dict bla 输出是 bla C3 BC 我想要的很简单 我想要 ascii 格式的输出而不是 utf 8 格式的输出 所以我需要输出 bla C3 如果
  • 此链接内的链接和跨度的文本装饰

    我有类似的链接 a href Link text span Link sub text span a 悬停时 我需要跨度内的文本不带下划线装饰 但主链接文本是 是否可以 我试过了 a hover span text decoration n
  • 如何更改列表中的ListStyle

    在 SwiftUI 中List似乎有一个名为ListStyle 如何更改列表的样式 struct ListView View var body some View NavigationView List Item create identi
  • jQuery document.ready 与 pageLoad

    我从另一位开发人员那里挑选了一个现有项目 我在代码中注意到他们正在三个不同的事件处理程序中执行 js 代码 function pageLoad execute code document ready function execute cod
  • ASP.NET MVC 中 ViewModel 的验证

    大多数关于如何在 ASP NET MVC 中实现验证的技巧似乎都以模型为中心 在模型和控制器之间构建服务层 或者使用验证属性装饰模型的属性 在我的应用程序中 我使用 ViewModel 进行控制器和视图之间的所有通信 我的登录页面有一个名为
  • 用glib进行垃圾收集?

    我想将垃圾收集语言 具体来说 它使用古老的 Boehm libgc 与 glib 系列 API 接口 glib 和 gobject 在内部使用引用计数来管理对象生命周期 包装这些的正常方法是使用垃圾收集的对等对象 该对象保存对 glib 对
  • 有“进度按钮”吗?

    我想要一个具有双重功能的按钮作为进度条 例如 随着任务的进展 按钮会填充绿色背景 我知道我可以创建自己的 但如果有现成的东西 我很乐意使用它 有谁知道适合该要求的免费或商业组件吗 我希望它能在 Delphi 2007 中工作 但如果它仅在
  • glBitmap 问题

    我正在使用一些遗留代码来工作 它使用 glBitmap 调用来绘制位图图标 我的问题是 一旦你一次绘制大约 1000 个图标 它就会变得相当慢 它会减慢到大约 1 到 2 秒的刷新率 我想看看是否可以让它更快 首先我应该描述当前代码是如何工
  • 长度为 k 的非重叠子串的随机采样

    给定一个长度的字符串n 我将如何 伪 随机采样m大小子串k这样采样的子串就不会重叠 我的大部分脚本编写经验都是使用 Perl 但任何通用语言的易于运行的解决方案就足够了 如果输入中不能出现某个字符 例如X just my size 20 m
  • 如何删除损坏的图像框?

    我正在尝试构建一个电子邮件模板 其中我必须向不同的邮件客户端 例如 Outlook thunderbird 显示一些图像 现在的问题是 当这些客户端不允许显示图像时 会显示我不想显示的损坏的图像框 我也参考过 参考链接1 https i s
  • 如何将嵌套字典转换为带有键顺序的列表

    我想从嵌套字典中创建一个列表 Name 20 Paul Merrill 21 Brynne S Barr Phone 20 1 313 739 3854 21 939 4818 Address 20 916 8087 Vehicula Rd
  • 调用未定义的方法 mysqli_result::fetch()

    我能够从中获取数据get result 使用任何fetch assoc fetch all 和fetch row 但是当我尝试使用简单的fetch 只是 我收到这个错误 未捕获的错误 调用未定义的方法 mysqli result fetch
  • 应用部分比 Monad 部分可以更好优化的 monad 示例

    在一次讨论中我听说Applicative一些解析器的接口的实现方式不同 但比它们的更有效Monad界面 原因是与Applicative在运行整个有效计算之前 我们提前知道所有 效果 对于 monad 效果可能取决于计算期间的值 因此这种优化
  • Apache Beam:DoFn 与 PTransform

    Both DoFn and PTransform是一种定义操作的方法PCollection 我们如何知道何时使用哪个 理解它的一个简单方法是类比map f 对于列表 高阶函数map将函数应用于列表的每个元素 返回结果的新列表 您可以将其称为
  • 每n秒运行某些代码[重复]

    这个问题在这里已经有答案了 有没有办法 例如打印Hello World 每n秒 例如 程序会执行我拥有的任何代码 然后一旦过了 5 秒 time sleep 它将执行该代码 我会用它来更新文件 而不是打印 Hello World 例如 st
  • 在 SQL Server 2005 存储过程中使用 .NET Framework 3.5

    我有一个 SQL Server 2005 服务器 我想在其上运行 Net CLR 存储过程 但是 我想使用 NET Framework 3 5 如果我现在尝试这个 我会收到以下错误 Error Assembly system core ve
  • 在 C++ 程序中包含 C 头文件

    我有一个 C 程序 cpp 在其中我希望使用 C 头文件中存在的一些函数 例如 stdio h conio h stdlib h graphics h devices h 等 我可以将 stdio h 库包含在我的 cpp 文件中 如下所示
  • 冲突:被其他getUpdates请求终止;确保只有一个机器人实例正在运行

    有人遇到这样的错误吗 我该如何修复它们 2021 11 07 08 29 38 643 telegram ext updater ERROR Error while getting Updates Conflict terminated b
  • 如何在角度指令中绑定布尔值?

    我想将一些布尔属性绑定 设置到指令 但我真的不知道如何做到这一点并实现以下行为 想象一下 我想为结构设置一个标志 假设列表是否可折叠 我有以下 HTML 代码
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的