assembly - 关于Assembly中setg和比较的问题
问题描述
我在理解这个练习时遇到了问题。我会尽力给出我的推理,我希望你们能给我一个想法,每一行代码都展示了什么。我们使用的程序集是 x86 假设存储在 %rax = x 中的值
xorq %rax, %rax // value stored in %rax: x ^ x = 0
addq $-1, %rax // value stored in %rax: 0 - 1 = -1
movq %rax, %rbx // value stored in %rbx: -1 or 0xFFFFFFFF
shlq $2, %rbx
shrq $1, %rbx // left shift by 3 total, so value stored in %rbx: 0x7fffffff8
addq %rbx, %rax // value stored in %rax: 0x7fffffff9
对于最后一行,我的教授说我们实际上在计算 (TMax-1)-1,我真的不明白。
问题是:
假设 Q3.2 中的 addq 确实执行了,假设我们现在执行了以下指令:
setg %bl
什么值(十六进制,包括前缀)现在存储在 %rbx 中?
我真的不明白 setg 是什么意思(我确实阅读了规范但不知所措)。非常感谢您的帮助!
解决方案
请注意,您有两个左移和一个右移,因此总共不是 3 个。此外,您使用的是 64 位寄存器,因此rbx
之前的值setg
实际上是0x7ffffffffffffffe
. setg
说结果的指令集参考条目是1
if ZF=0 and SF=OF
。好吧,加法的结果是,事实0x7ffffffffffffffd
并非0
如此。符号位为零,有符号溢出也为零。因此条件成立,所以将是,但其余的不变给你。ZF
0
SF
OF
bl
1
rbx
0x7fffffffffffff01
推荐阅读
- flutter - 为什么animatedBuilder中只有顶部和底部元素在clic上什么都不做
- android - 使用 Compose Navigation 导航时 TopAppBar 闪烁
- performance - 浏览器中的 http 请求之间的间隙 - 加载媒体资源
- python - 跨整个数据帧的 scikit 预处理
- android - 如何根据接近传感器关闭屏幕?
- typescript - 从 Typescript 中的 http 响应获取标头值
- spring-boot - 远程主机终止握手,SSL 对等体使用 Intellij Editor 2020.3 错误关闭
- wordpress - 在 Wordpress 中更改选项卡标题
- javascript - Scrapfly 服务不会将值替换为输入字段
- c++ - 如何通过 C++ 手动构造 Napi::CallbackInfo 对象?