程序集比较标志理解

2024-05-11

我正在努力理解汇编程序中的以下代码片段:

if ( EAX >= 5 )
  EBX = 1;
else
  EBX = 2;"

在汇编程序中,可以写如下(根据我的书),模拟jge操作说明 https://www.felixcloutier.com/x86/jcc您通常会使用“更简单”的分支,一次只查看一个标志:

1     cmp eax, 5       ;(assuming eax is signed)
2     js signon        ;goto signon if SF = 1
3     jo elseblock     ;goto elseblock if OF = 1 and SF = 0
4     jmp thenblock    ;goto thenblock if SF = 0 and OF = 0
5 signon:
6     jo thenblock     ;goto thenblock if SF = 1 and OF = 1
7 elseblock:
8     mov ebx, 2
9     jmp next
10 thenblock:
11    mov ebx, 1
12    next:

我可以理解,结果标志可以是:(if ( EAX >= 5 )):

SF = 0 & OF = 0 但我无法理解这些标志是如何的: SF = 1 & OF = 1?这是什么计算得出的?

为了澄清我的意思:

如果 eax 位于负下限内,则减去 5 可能会溢出为正数。如果 eax 位于正上界内,则减去 5 后不会溢出为负数吗?


用 3 位数字来思考这些要容易得多,它们都是可扩展的。嗯,如果这是有符号的(您没有在高级代码中指定/发布),那么四位更好,因为您使用了 5。遍历 5 附近的数字(这显示了 alu 的输出)

cmp reg,5
0111 - 0101 = 0111 + 1010 + 1 = 10010
0110 - 0101 = 0110 + 1010 + 1 = 10001
0101 - 0101 = 0101 + 1010 + 1 = 10000
0100 - 0101 = 0100 + 1010 + 1 = 01111
0011 - 0101 = 0011 + 1010 + 1 = 01110

现在您必须了解硬件的工作原理。某些处理器系列在执行减法时会反转来自 alu 的进位标志,而其他处理器系列则不会。不管怎样,你肯定可以在 5 - 5 点看到状态变化。无论如何,你在这里不需要进位标志,代码不使用它。

如果您正在做有符号数学,那么也尝试一些负数。

0000 - 0101 = 0000 + 1010 + 1 = 01011  
1111 - 0101 = 1111 + 1010 + 1 = 11010
1110 = 0101 = 1110 + 1010 + 1 = 11001

这让我们对这个问题有了一些了解。

有符号溢出定义为进位不等于加法器 msbit 上的进位。这可能会变得混乱,所以我们只需要知道边界在哪里。

0111 - 0101 = 7 - 5 = 2
0110 - 0101 = 6 - 5 = 1
0101 - 0101 = 5 - 5 = 0
0100 - 0101 = 4 - 5 = -1
0011 - 0101 = 3 - 5 = -2

等等。使用这个 4 位模型,在有符号解释中,我们限制为 +7 (0b0111) 到 -8 (0b1000)。所以在 -3 - 5 之后我们就会遇到麻烦:

1110 - 0101 = 1110 + 1010 + 1 = 11001 , -2 - 5 = -7
1101 - 0101 = 1101 + 1010 + 1 = 11000 , -3 - 5 = -8
1100 - 0101 = 1100 + 1010 + 1 = 10111 , -4 - 5 = 7 (-9 if we had more bits)
1011 - 0101 = 1011 + 1010 + 1 = 10110 , -5 - 5 = 6 (-10 if we had more bits)
1010 - 0101 = 1010 + 1010 + 1 = 10101 , -6 - 5 = 5 (-11 if we had more bits)
1001 - 0101 = 1001 + 1010 + 1 = 10100 , -7 - 5 = 4 (-12 if we had more bits)
1000 - 0101 = 1000 + 1010 + 1 = 10011 , -8 - 5 = 3 (-13 if we had more bits)

后五位是有符号溢出,有符号结果无法用可用位数表示。 (请记住,我们现在使用的是四位系统,最高位是进位位,当您查看结果时,可以直观地删除它)。

有符号标志只是结果的 msbit,这也改变了有趣的边界。设置有符号标志(结果的 msbit)的情况是低于 5 的正 (eax) 值和不会导致有符号溢出的负数(+4 到 -3)。所有这些都属于

因此,如果您通过 js 登录,则符号位关闭,即数字大于或等于 5(想要结果为 1)或结果负到足以导致有符号溢出(想要结果为 2)。所以 jo elseblock 通过选取 2 个案例的结果(有符号溢出,非常负面)来对这两个案例进行排序。 jmp thenblock 取 5 以上的正数。

在我看来,您在这里正在做签名数学(使用签名溢出标志有点明显)。由于您使用 5 来比较和签名数学,因此您的系统中需要 4 位或更多位来实现此代码,因此 8、32、64、123456 位,这并不重要,它的工作方式与 4 位系统相同(对于这个比较)。我发现最小化进行分析的位数更容易。像这样的硬编码比较使它变得更加容易,正如上面手动计算的结果就在上面、在和下面。然后遍历有符号数的全零(零)到全一(减一),并非常负地进入有符号溢出范围。对于无符号数,它更容易一些,但过程相同。

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

程序集比较标志理解 的相关文章

随机推荐

  • 如何在 Rails 中制作动态下拉菜单?

    我正在开发一个电子商务项目 其中将有用于选择尺寸的单选按钮 我有一个数量下拉菜单 我想根据用户所选尺寸的可用库存使此下拉列表动态化 谁能告诉我如何在 Rails 上做到这一点 不会用大量的 javascript 扰乱我的视图文件 如果您使用
  • UV 展开运行时优化

    我正在尝试在运行时创建 UV 我使用 BOX 类型 UV 类似于 3ds max 中的 BOX UVW 并基于面方向进行计算 我知道将其创建为运行时不是一个好的选择 但我别无选择 它是在计算后保存的 所以我做了一次 但我花了 40 秒处理
  • 拒绝在框架中显示“https://www.youtube.com/watch?v=oKZRsBjQJOs”,因为它将“X-Frame-Options”设置为“sameorigin”

    我需要将来自 youtube 的视频放置在我的网站中 但 URL 是一个变量 我创建了一个可以放置的管道 但不起作用 这是我在 HTML 文件中的代码 我的管道的代码是这样的 export class VideoPipe implement
  • Xcode 警告引用开发第三方库的用户帐户

    我在我的项目中使用第三方库 BugSense 我已将他们的框架添加到我的项目中 对其进行初始化等 以便一切正常 然而 每次构建项目时 我都会收到大量 40 多个 以下警告 警告 i386 Users genesis Library Deve
  • Android ListView addHeaderView() XML 中定义的预定义视图出现 nullPointerException

    尝试使用addHeaderView and addFooterView for a ListView 如果我尝试使用在 XML 中为页眉或页脚预定义的视图 则会出现空指针异常 但是 如果我使用代码动态创建一个视图 它工作得很好 This d
  • 在 C# 中根据鼠标点击获取活动窗口名称

    我正在尝试使应用程序获取用户单击的窗口的鼠标单击位置和标题 名称 我目前使用的是 LowLevelMouseProc 它提供了良好的结果 但每当我单击 Google chrome 时 它 都会使应用程序崩溃 这是代码 using Syste
  • 如果 1 个 Gremlin 查询中不存在顶点和边,则创建

    我找到以下代码来创建边缘 如果它尚不存在 g V hasLabel V1 has userId userId as a V hasLabel V1 has userId userId2 coalesce bothE link where o
  • Flutter“Mailer”API 多图像附件

    我正在制作一个简单的应用程序 用于从用户获取个人信息和图像数量 然后通过后端邮件 API 通过一键单击按钮发送它们 到目前为止 我可以通过邮件获取和发送 FormData 但我不知道如何发送图像数组 我已经尝试了几个 API 但 Maile
  • 我可以按日期查询 MongoDB ObjectId 吗?

    我知道 ObjectId 包含它们的创建日期 有没有办法查询ObjectId的这方面 将时间戳弹出到 ObjectId 中 http www kchodorow com blog 2011 12 20 querying for timest
  • 如何终止当前正在运行的git进程? [复制]

    这个问题在这里已经有答案了 git commit m 45 fatal Unable to create F SoftifyBD Projects proj 4 CMS Latest contentmanagementsystem git
  • 安卓后退按钮不起作用

    我正在使用 cocos2dx 制作一个小游戏 在游戏的活动中我提供以下函数来处理后退按钮 Override public boolean onKeyDown int keyCode KeyEvent event return super o
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 使用哪个 gradle 文件将应用程序设置为可调试?

    我是android开发新手 我刚刚开始设置我的设备来调试我的应用程序 当经历安卓开发者工具 http developer android com tools device html setting up它说要设置buildTypes deb
  • 如何在 VS Code 中仅提交跟踪文件?

    git status 显示以下三个信息 要提交的变更 分阶段变更 未暂存提交的更改 未暂存更改 未跟踪的文件 我曾经git commit a 它提交 1 和 2 然而VS代码Commit All提交 1 2 和 3 Commit Stage
  • 如何对定义的字符集python中的所有可能的字符串进行加密?

    我试图加密定义的字符集中所有可能的字符串 然后将它们与用户输入给出的哈希进行比较 这就是我目前拥有的 import string from itertools import product import crypt def decrypt
  • 测试期间依赖性不满足

    我有一个运行良好的 Spring Boot 2 0 0 M2 应用程序 我在构造函数上使用自动装配 RequestMapping value rest RestController public class AddressRestContr
  • 在 SQLite 数据库中存储日期时间值的最佳方式(Delphi)

    我将把日期时间值存储在 SQLite 数据库中 使用 Delphi 和 DISqlite 库 数据库的本质是它永远不需要在计算机或系统之间传输 因此互操作性不是一个限制 相反 我的重点是阅读速度 日期时间字段将被索引 我将对其进行大量搜索
  • 我想要 TS 中完全不可变的对象

    我有一些大物体 比如 const a b 33 c 78 99 d e f g true h boom selecta well even deeper than this 还有我想要TSnot让我做 a d e f h boom resp
  • 如何用 unicode 图像替换字符?

    我怎样才能更换一个 来自数据库到碧玉字段的文本中的字符 带有图像 目标如下图所示 就像是 F KN Zusatzinfo DV Einleitungstext replaceAll x254 哪里的x254是红色方块的ascii 代码 但上
  • 程序集比较标志理解

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