关于装配中的装配和比较的问题

问题描述 投票:0回答:1

我在理解此练习时遇到问题。我会尽力给出我的推理,希望大家能给我一个思路,每一行代码演示了什么。我们使用的程序集是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个回答
0
投票

请注意,您有两个左移和一个右移,所以总共不剩下3个。另外,您使用的是64位寄存器,因此rbx之前的setg中的值实际上是0x7ffffffffffffffesetg的规格说,如果1,则结果为ZF=0 and SF=OF。好吧,加法的结果是0x7ffffffffffffffd,而不是0,所以ZF0SF作为符号位为零,OF作为符号溢出也为零。因此条件成立,因此bl将为1,但rbx的其余部分不变,为您提供0x7fffffffffffff01

© www.soinside.com 2019 - 2024. All rights reserved.