x86子指令操作码混淆[重复]

2024-02-24

玩了一下 Turbo Assembler 和 Turbo Debugger,我对操作码感到惊讶。更准确地说,我有一些汇编的二进制文件,其中 Turbo Debugger 反汇编了单词

29 C3

正确地sub bx, ax。然而,Turbo Assembler 汇编了完全相同的指令sub bx, ax到下面的词

2B D8

正疑惑着这个问题,我发现this https://c9x.me/x86/html/file_module_x86_id_308.html引用指出从寄存器中减去寄存器确实可以从两者开始29 and 2B。事实是否确实如此exactly同一条指令可以用不同的操作码表示吗?如果是这样,那是为什么呢?是因为历史原因和兼容性吗?该参考文献规定了操作码的不同操作数类型,它们只是一致的sub bx, ax。这是为了以后能够通过自修改代码等修补不同的操作数吗?此外,Turbo Assembler 是否具有语法结构来选择一种操作码而不是另一种操作码?

Note:我知道条件跳转就像je and jz具有相同的操作码,因为它们具有相同的依赖于标志的行为,并且不同的助记符反映了同一操作的不同语义,但前者让我感到困惑。


大多数 x86 指令支持两个操作数,其中一个操作数可以是内存操作数。这是通过将操作数编码为modr/m字节。该字节始终编码一个寄存器操作数和一个寄存器或存储器(r/m)操作数,但指令必须决定其操作数中哪个是寄存器操作数,哪个是存储器操作数。

因此,为了支持在源操作数或目标操作数中具有存储器操作数,可以使用许多指令,其中一种变体是源操作数可以是存储器操作数,而另一种变体是目标操作数可以是存储器操作数。这个一般是通过位来控制的01(在一些手册中称为 d 位)。

因此,不需要内存操作数的指令可以采用两种方式进行编码,并且汇编器通常会选择一种或另一种作为稍微随机的实现细节。

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

x86子指令操作码混淆[重复] 的相关文章

  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 为什么我可以使用 ret 退出 main?

    我即将弄清楚程序堆栈到底是如何设置的 我了解到用以下方式调用该函数 call pointer 实际上等同于 mov register pc programcounter add register 1 where 1 is one instr
  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 什么时候汇编比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
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li

随机推荐

  • bmp宽高比问题

    我一直在尝试了解 bmp 文件的工作原理 以便我可以渲染一些 Mandelbrot 设置图片并将它们输出为 bmp 文件 因为这似乎是最简单的方法之一 但由于某种原因 当我使用不是 1 的纵横比时 1 尽管它是 4 的幂 所以不需要填充 我
  • 创建纯 HTML 的自定义 ExtJS 的最佳方法

    所以我需要创建一个ExtJS组件 版本2 3 0 该组件只是简单的 HTML 样式化 它是一个标题 我当前的方法是创建一个自定义组件 如下所示 A ExtJS component for a header for the applicati
  • 获取设备的 IMEI 代码或/和 Mac 地址

    我正在实施一种唯一标识设备的方法 建筑师向我发送了以下规格 带 Wifi 3G 的设备 IMEI 代码 设备 仅 Wifi MacAddress 两者还需要制造商 型号来完成 ID 我的问题是 如何从设备获取 IMEI 如何从设备获取制造商
  • 仅当导出的符号存在于 insmod 的 Linux 内核模块中时,如何选择性地使用它们?

    我正在修改 Linux 内核以向 Linux 虚拟服务器 LVS 添加一些功能 我开发了一个模块 我称之为net netfilter ipvs ip vs utils c 以及负载平衡时要使用的一些函数 这里的所有函数都是使用导出的EXPO
  • Visual Studio 2012 ExtJS 智能感知

    有没有办法在 Visual Studio 2012 中获取 ExtJS intelliSense 这与新的 JavaScript 支持相结合将使我的 ExtJS 项目更容易编码 在 js 文件中添加 ext all 的引用路径将提供支持 具
  • 如何将网站IE浏览器自动重定向到Chrome浏览器?

    最近 我们迁移到最新版本的应用程序 允许用户在任何浏览器中打开应用程序 早期它仅支持 IE 浏览器 迁移后 许多用户仍然在旧浏览器中打开应用程序 由于应用程序在 IE 浏览器中速度非常慢 我们正在寻找一种解决方案 当用户在 IE 浏览器中打
  • viewDidLoad (AdMob) 上的 Swift 插页式广告

    我正在关注这个tutorial http www ios blog co uk tutorials swift display ads in your application with google admob 到目前为止 当我单击按钮时
  • 使用 CMake 构建 Windows DllMain DLL

    我有一个类似的问题this one https stackoverflow com questions 29490489 create a windows shared library with dllmain function mingw
  • Selenium 中

    我正在努力从 grailed com 上删除所有 Air Jordan 数据 https www grailed com designers jordan brand hi top sneakers https www grailed co
  • java比较器,如何按整数排序?

    我试图学习java中的比较器 我在网上找到了这个很好的例子 我的问题是如何更改这段代码 以便宠物名按年龄和降序排列 以便最老的在第一个 最小的在最后 class Dog implements Comparator
  • 如何在 C++ 中声明指向常量的指针?

    我正在尝试编写一个函数来解析命令行参数 这是函数声明 void parse int char const 以防万一 我也尝试过 const char const char and cchar 用一个typedef const char cc
  • JavaMail 可与 JBOSS Application Server 7 配合使用,但无法与 OpenShift 上的 Tomcat7 配合使用

    package com example web import java io import java util import javax servlet import javax servlet annotation WebServlet
  • 如何制作可编辑的 GridView 模板单元格文本框?

    如何制作可编辑的 GridView 模板单元格文本框 使用命令列并设置ShowEditButton True EditText Edit ButtonType Link 在模板列中 使用 ItemTemplate 来描述列在非编辑模式下的外
  • 在准备好的语句中使用问号占位符时出现 MySQL 语法错误

    尝试了我能想到的一切 我已经将范围缩小到 占位符 我尝试过替换 带有随机文本的占位符 一切都很好 当然除了它不断覆盖同一行 我得到的错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 附近使用的正确语法
  • sqlite删除行数

    我需要编写一个 SQLite 查询 该查询将从表中删除 200 以上的行 我认为这会起作用 DELETE FROM tbl names WHERE count gt 200 但这给了我 滥用聚合函数 count 我知道我可以使用一个限制条款
  • 在 postgres 中打印运行时消息

    我们可以使用RAISE NOTICE在 postgres 中相当于RAISERROR 要显示的消息 WITH NOWAIT在 SQL Server 中 或者是否有更好的方法在 postgres 查询运行时打印中间消息 请建议是否有更好的方法
  • lxc 驱动程序不支持 Exec:如何解决这个问题?

    在 CoreOS 上使用 Docker 我有一个脚本调用 docker exec 这在 CoreOS 上工作得很好 但我也想在上面测试一下CircleCI http circleci com 当我尝试在 CircleCI 上运行该脚本时 我
  • java中mongo数据库中所有集合的列表

    如何获取数据库中所有集合的列表 数据库 mongodb 语言 java ide 日食 获取集合列表 每个数据库都有零个或多个集合 您可以从数据库中检索它们的列表 并打印出其中的任何内容 Set
  • 用于散列资产和资源文件夹的文件名的 Angular 构建过程

    我有一个角度 4 4 6应用程序 我使用构建它角度 CLI 1 0 1 我遇到的问题是 除了inline bundle js main bundle polyfills bundle js styles bundle js vendor b
  • x86子指令操作码混淆[重复]

    这个问题在这里已经有答案了 玩了一下 Turbo Assembler 和 Turbo Debugger 我对操作码感到惊讶 更准确地说 我有一些汇编的二进制文件 其中 Turbo Debugger 反汇编了单词 29 C3 正确地sub b