【问题标题】:Question about setg and comparison in Assembly关于Assembly中setg和比较的问题
【发布时间】:2019-10-18 16:41:10
【问题描述】:

我在理解这个练习时遇到了问题。我会尽我所能给出我的推理,我希望你们能给我一个想法,每行代码演示了什么。我们使用的程序集是 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 是什么意思(我确实阅读了规范但不知所措)。非常感谢您的帮助!

【问题讨论】:

    标签: assembly x86-64


    【解决方案1】:

    请注意,您有两个左移和一个右移,所以总共不是 3 个左移。此外,您使用的是 64 位寄存器,因此 rbxsetg 之前的值实际上是 0x7ffffffffffffffesetg 的指令集引用条目表示,如果 ZF=0 and SF=OF,则结果为 1。好吧,加法的结果是0x7ffffffffffffffd,而不是0,所以ZF0SF 是符号位为零,OF 是有符号溢出也是零。因此条件成立,所以bl 将是1rbx 的其余部分不变,给你0x7fffffffffffff01

    【讨论】:

      【解决方案2】:

      将 RBX 添加到 RAX 计算 RBX - 1,因为 RAX 仍然 = -1。

      我认为TMax - 1 的意思是INT64_MAX - 1

      两次左移和一次右移为您提供了一个高位清零(非负数)和低位清零的数字。最大正(2 的补码)整数是除符号位之外的所有位设置,并且比那个小一。

      Jester 解释了 setg 如何根据 add 设置的 EFLAGS 工作。在手册中查找setcc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多