x86-64 - 从子指令 x86_64 中得到否定结果
问题描述
我一直坚持一个相当简单的指令,但是在我尝试真正理解它之前,汇编中的所有内容看起来都很简单哈哈。我已经注意到这篇文章澄清了一些东西,但我仍然感到困惑:Understanding intel SUB instructions
这是一个超级简单的情况:
两个字符串被发送到函数进行比较。我脱光衣服以保留必需品。
function:
mov al, [rdi] ; == 0
sub al, [rsi] ; == 32
ret ; returns 224 and not -32 like I would like
我猜我需要在子指令之后检查溢出标志,如果它打开,那么我的结果是否定的。或者也许是标志标志,更合乎逻辑(在这种情况下两者似乎都正确?)
从中,我需要在返回之前将 rax 减去 256 使其变为 -32 ......但这对我来说似乎有点奇怪,必须有更清洁的方法吗?
解决方案
8 位值224
和-32
在 x86 和 x86-64 上是相同的,因为它使用二进制补码来表示负数。减去 256 对你没有帮助。由函数的调用者决定将结果解释为有符号(-128
到127
,在这种情况下是-32
),还是无符号(0
到255
,在这种情况下是224
)。我假设你问这个是因为你调用这个函数的代码错误地解释了它。如果您不小心movzx
在结果上使用而不是movsx
扩展它,或者更糟糕的是,如果您使用ax
,eax
或rax
没有先扩展它(在这种情况下,您最终可能会得到完整的垃圾,例如0x11223344556677e0
),则可能会发生这种情况。
推荐阅读
- php - PHP 检查 CSS 属性
- python - 在标点符号上拆分字符串(标签除外)
- python - 如何将 Stripe 支付网关与 Django Oscar 集成?
- alexa - 使用 Alexa Location API 时获得 204 响应
- javascript - 为什么 Chrome 没有显示我的 User Timing API 使用情况的任何数据?
- spring - 在 Spring cloud consul config 中监听上下文刷新
- ruby - 正则表达式匹配不同于第一个字符的字符
- python - 为什么python中的某些包或函数的首字母大写,而有些则不是?
- reactjs - 在无状态功能组件中使用 Ref 在 React JS 中不起作用
- css - 图像背景而不是下拉按钮