ASCII 调整和十进制调整指令如何工作?

2023-11-26

我一直在努力理解 x86 汇编语言的 ASCII 调整指令。

我在互联网上看到所有信息告诉我不同​​的事情,但我想这只是以不同形式解释的同一件事,但我仍然不明白。

谁能用伪代码解释一下为什么AAA, AAS我们必须从 AL 的低位半字节中加、减 6?

有人可以解释一下吗AAM, AAD和十进制调整指令伪代码在Intel指令集手册中还有,为什么会这样,背后的逻辑是什么?

最后,有人可以举例说明这些说明何时有用,或者至少在过去它们在哪些应用程序中有用。

我知道现在这些指令已经不再使用,但我仍然想知道这些指令是如何工作的,很高兴知道。


为什么在AAA、AAS的伪代码中我们要在AL的低位半字节上加、减6

因为在十六进制中,每个字符有 16 个不同的值,而 BCD 只有 10 个。当您以十进制进行数学计算时,如果数字大于 10,您需要取 10 的模并进位到下一行。类似地,在 BCD 数学中,当加法结果大于 9 时,您可以添加 6 以跳过剩余的 6 个“无效”值并进位到下一位。相反,你在减法中减去 6。

例如:27 + 36

  27: 0010 0111
+ 36: 0011 0110
───────────────
5_13: 0101 1101 (13 >= 10)
+  6:      0110
───────────────
  63: 0110 0011 (13 + 6 = 19 = 0x13, where 0x3 is the units digit and 0x10 is the carry)

进行解包加法是相同的,只是直接从个位进位到十位,丢弃每个字节的顶部半字节

欲了解更多信息,您可以阅读

  • BCD加法汇编程序逻辑
  • 如果是无效的 BCD 码,为什么必须在 BCD 加法上加上 6?

有人能解释一下Intel指令集手册中的AAM、AAD和十进制调整指令伪代码吗,为什么它们是这样的,它们背后的逻辑是什么?

AAM只是二进制到BCD的转换。通常以二进制形式进行乘法,然后调用 AAM 将结果除以 10 并将商余数对存储在两个解压缩的 BCD 字符中

例如:

13*6 = 78 = 0100 1110
78/10 = 7 remains 8 => result = 0x78

AAD则相反:在除法之前,调用AAD将其从BCD转换为二进制,然后像其他二进制除法一样进行除法

例如:87/5

0x8*10 + 0x7 = 0x57
0x57/5 = 0x11 remains 0x7

之所以有这些指令,是因为过去内存很昂贵,你必须尽可能减少内存的使用。所以在那个时代CISCCPU 很常见。他们使用大量复杂的指令来最大限度地减少用于执行任务的指令。如今,内存便宜得多,现代架构几乎都是 RISCy,需要权衡 CPU 复杂性和代码密度

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

ASCII 调整和十进制调整指令如何工作? 的相关文章

  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 32位PPC rlwinm指令

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

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

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

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

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 在 Intel x86 架构上使用非 AVX 指令移动 xmm 整数寄存器值

    我有以下问题 需要使用 AVX2 以外的任何工具来解决 我有 3 个值存储在 m128i 变量中 不需要第四个值 需要将这些值移动 4 3 5 我需要两个功能 一个用于按这些值进行右逻辑移位 另一个用于左逻辑移位 有谁知道使用 SSE AV
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 64 位 Windows 汇编器

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

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 为什么 LED 保持亮起而不是闪烁?

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

随机推荐

  • 通过单击按钮更改 viewpager 片段

    我试图通过单击按钮来更改 viewpager 片段 我有 5 个片段 每个片段都有自己的 xml 文件 frag1 xml frag2 xml 等 每个片段都有 5 个按钮 可以转到 viewpager 的其他页面 但问题是如何在 Frag
  • 无法通过 PuTTY 连接到亚马逊 EC2 实例

    我在 Amazon Web Services AWS 中创建了一个新的 Amazon EC2 实例 参考文档 我什至添加了这样的 SSH 规则 Port 22 Type SSH Source
  • Calendar.Month 给出错误的输出

    我一直在使用java util对于所有日期和日历表示 但我在这里面临一个奇怪的问题 Calendar MONTH Calendar DAY OF MONTH等都给出错误的输出 但是当我使用Calendar getTime 我得到了正确的输出
  • Go 中的 Marshall 映射到 XML

    我尝试将地图输出为 XML 数据 但收到以下错误 xml unsupported type map string int 编组映射对于 JSON 工作得很好 所以我不明白为什么它对于 XML 不能同样工作 使用 Struct 真的是唯一的方
  • Git - 删除 Blob

    有没有一种方法或命令可以使用 ID 从 git 中删除 blob 我使用了命令 git rev list objects all git cat file batch check objectname objecttype rest gre
  • Ember:如何将 TinyMCE 文本区域字段值绑定到模型

    我在模板中嵌入了 TinyMCE 现在 我想对 TinyMCE 编辑器 实际上是一个文本区域 的内容进行值绑定 See http jsfiddle net cyclomarc wtktK 10 在文本字段中输入文本时 bodyText 中的
  • 嵌入式 HSQLDB 将数据保存到文件中

    我正在创建一个基于 spring 的 Web 应用程序 该应用程序使用嵌入式 hsqldb 我的 spring 配置非常简单
  • Xamarin 在 Android 中形成 Shadow on Frame

    Xamarin Forms 中的 Frame 类非常有限 不允许我在 Frame 后面获得阴影 我使用以下代码为 iOS 制作了一个自定义渲染器 public class RatingInfoFrameRenderer FrameRende
  • Azure Blob 存储的事务访问

    我想将文件存储在 Azure Blob 存储中 到目前为止 一切都很好 我还想存储有关该文件的附加元数据 为此 我使用 Azure SQL 数据库 因此我可以轻松查询 Blob 存储上的文件 因此 当我向存储添加新文件时 我想确保 blob
  • 单行嵌套 For 循环[重复]

    这个问题在这里已经有答案了 用Python编写这个转置矩阵的函数 def transpose m height len m width len m 0 return m i j for i in range 0 height for j i
  • 设计问题:电话拨打电话号码,还是电话号码在电话上拨打自己?

    这是从我在 DDD Yahoo 上发布的内容重新发布的 团体 在所有条件相同的情况下 您是写phone dial phoneNumber 还是phoneNumber dialOn phone 请记住未来可能的需求 除了电话号码之外的帐号 除
  • 密码中是否应该允许使用空格字符?

    我尝试过不同的网站 产品 这似乎分配得相当均匀 Windows 7 和 Gmail 允许您在密码中插入空格 Hotmail 和 Twitter 则不然 虽然在密码中允许空格会增加密码的复杂性 但似乎许多网站 程序不允许它们 是否有充分的理由
  • 如何在 SPSS 中循环变量?我想避免代码重复

    是否有 原生 SPSS 方法来循环某些变量名称 我想做的就是获取变量列表 我定义的 并为它们运行相同的过程 伪代码 这不是一个很好的例子 但很能说明问题 for i in varlist a b c do FREQUENCIES VARIA
  • CLI/C++ 到底是什么?它与“普通”c++ 有什么不同?

    首先让我澄清一下 普通 C 的含义 我目前正在阅读 Walter Savitch 的 C 中的问题解决 据我所知 这不是专门为 Microsoft 或 Unix 编写的 所以我的问题是 我在这本书中学到的内容 我用它来获取 C 的通用知识
  • 旋转下拉列表在滚动时跳跃

    为什么我的旋转器在滚动时会跳跃 我只是做以下事情 ArrayAdapter
  • 为什么可以等待 Rx observable? [复制]

    这个问题在这里已经有答案了 我刚刚注意到await关键字可以与 Rx Observable 一起使用 例如 await Observable Interval TimeSpan FromHours 1 我非常确定它只能与任务结合使用 那么是
  • 如何刷新数据网格

    我创建 dojox grid datagrid 并填充数组中的内容 如示例所示页面上的最后一个示例 在一段时间内 我在代码中更改了该数组的值 如何刷新该网格的内容 如何从更改的数组加载新数据 要更改网格中的值 您需要更改网格存储中的值 网格
  • 找到到任何子串的最小汉明距离的最快方法?

    给定一个长字符串L和一个较短的字符串S 约束条件是L length 必须 gt S length 我想找到之间的最小汉明距离S和任意子串L长度等于S 长度 让我们为此调用该函数minHamming 例如 minHamming ABCDEFG
  • 在 Laravel 中,使用 App::make('') 而不是构造函数注入有什么缺点吗?

    通常我只会通过构造函数注入依赖项 但是当父类具有依赖项并且必须将它们传递给所有子类时 它会变得非常冗长 另一种方法是使用 this gt dependancy App make Dependancy 单独在父类中 那么父构造函数和子构造函数
  • ASCII 调整和十进制调整指令如何工作?

    我一直在努力理解 x86 汇编语言的 ASCII 调整指令 我在互联网上看到所有信息告诉我不同 的事情 但我想这只是以不同形式解释的同一件事 但我仍然不明白 谁能用伪代码解释一下为什么AAA AAS我们必须从 AL 的低位半字节中加 减 6