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子指令操作码混淆[重复] 的相关文章

  • 将 2 个数字与汇编进行比较[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有以下代码 我想完成汇编代码 如下
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • 当下一条(跳过)指令是变量定义时,Shellcode 中的 JMP 意外行为

    Purpose 我试图利用 x86 64 中的 RIP 模式 尽管程序集本身按预期执行 但 shellcode 却没有 问题 简而言之 我尝试过的是这样的 jmp l1 str1 db some string l1 other code l
  • x86 汇编乘法和除法指令操作数,16 位及更高

    我对 x86 汇编中的乘法和除法运算如何工作感到相当困惑 例如 下面的代码看起来并不太困难 因为处理的是 8 位 8 位乘法 User Input num1 20 num2 15 mov ax num1 moves the 8 bits i
  • 如何使用存储在 x64 位置的 x64 内存地址进行跳转?

    据我所知 使用 64 位地址作为操作数的 jmp 是不可能的 但我相信使用 x64 内存位置是 来自here http www tptp cc mirrors siyobik info instruction JMP htmlJMP r m
  • MAC-1 汇编递归

    如何在 MAC 1 汇编器中调用递归函数 在 C 中你会做类似的事情 int func int num if num 0 return 1 return num func num 1 我知道如何使用调用函数 CALL 以及如何将参数加载到堆
  • X86 汇编将小写字母转换为大写字母

    实现toUpper函数 将字符串中的小写字母转换 为大写 该函数采用一个参数 char string 字符串是一个 char类型指针 指向字符串的开头 因为C 样式字符串以零结尾 我们不需要取长度 字符串作为另一个参数 我需要帮助开始 我不
  • 16位汇编:无法取消引用某些寄存器[重复]

    这个问题在这里已经有答案了 我正在尝试以下 Intel 16 位指令 mov si word reg where reg是一些寄存器 它编译得很好 如果reg is bx 但当它是ax cx or dx 我使用 NASM 作为我的汇编器 我
  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 汇编:使用数据段寄存器(DS)

    目前我正在学习 x86 汇编 因为我喜欢微控制器编程 所以我熟悉汇编 目前我一直在到处寻找这个问题的答案 但似乎找不到它 DS寄存器 我知道它应该指向我程序中的全局数据 但我不知道知道它到底是如何工作的 我正在使用 NASM 在大多数简单的
  • 使用 XCHG 解锁的自旋锁

    维基百科提供的使用 x86 XCHG 命令的自旋锁的示例实现是 Intel syntax locked The lock variable 1 locked 0 unlocked dd 0 spin lock mov eax 1 Set t
  • 如果我有一个 8 位值,那么使用 8 位寄存器而不是 16、32 或 64 位寄存器有什么优势吗?

    我读到的 x86 asm 介绍性文献似乎在所有实际场景中都坚持使用 32 位寄存器 eax ebx 等 除了证明 64 位寄存器也存在之外 如果确实提到 16 位寄存器 那也是作为历史注释来解释为什么 32 位寄存器的名称前面有一个 e 编
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 如果没有按下任何键,则检查按键而不阻塞

    我正在创建一个应用程序来查看当前时间 并创建了一个循环来每秒更新时间 循环看起来像这样 UPDATE The code to be re executed JMP UPDATE 但我无法结束它 当我使用 MOV AH 00H INT 21H
  • Mac OS X 上的 64 位程序集运行时错误:“dyld:无可写段”和“Trace/BPT trap”

    当尝试运行以下汇编程序时 globl start start pushq 0x0 movq 0x1 rax subq 0x8 rsp int 0x80 我收到以下错误 dyld no writable segment Trace BPT t
  • GCC 从 C++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

    我有以下 C 代码 int factorial int n if n 0 return 1 return n factorial n 1 int main void factorial 5 return 0 当我使用 g S Factori
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 在汇编中,指令指定数据类型吗?

    我是汇编语言编程 x86 的初学者 以下说法是否正确 在汇编中 BYTE WORD DWORD 等数据类型分别表示 8 位 16 位和 32 位模式 而不仅仅是整数 它们本身没有意义 它们只是位模式 使用它们的指令赋予了它们意义 汇编 代码
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到

随机推荐

  • 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