Assembly 汇编-提取特定位

Assembly 汇编-提取特定位,assembly,x86,gnu-assembler,att,Assembly,X86,Gnu Assembler,Att,我想从32位(int)值中提取第17位。我这样做对吗?我正在使用AT&T语法 movl $0x11112222,%eax movb $0b01000000,%bl andb %ah,%bl 我将32位数字放入32位寄存器。现在,第17位在ah寄存器中(以及其他16-23位)。现在它是ah寄存器中的第二位,我创建了一个“掩码”。然后我在做手术。 我的想法对吗?一般的想法可能是可行的,但是你的常量和字节都错了。您的掩码应该是0B0000001000000000000000(或者更容易理解为0

我想从32位(int)值中提取第17位。我这样做对吗?我正在使用AT&T语法

movl $0x11112222,%eax   
movb $0b01000000,%bl
andb %ah,%bl
我将32位数字放入32位寄存器。现在,第17位在ah寄存器中(以及其他16-23位)。现在它是ah寄存器中的第二位,我创建了一个“掩码”。然后我在做手术。
我的想法对吗?

一般的想法可能是可行的,但是你的常量和字节都错了。您的掩码应该是
0B0000001000000000000000
(或者更容易理解为
0x20000
),并且您应该使用32位掩码,因为您无法访问位为16-23的字节。您错误地声明了那些生活在
%ah
中的人,但这是错误的,因为
%ah
有8-15位


此外,此操作将使钻头保持原位。根据具体需要,您可以将整个eax右移17位,然后保留最低有效位。

通常我必须编写脚本,从几个数字中提取17位,然后对其进行异或运算等。在这种情况下,这和操作是否正确?如果始终需要位#17,则使用固定常数。请注意,您可以先对数字进行异或运算,然后提取一次结果。等一下,我没有发现您的错误<代码>%ah没有位16-23,它有位8-15!啊,是的。那么它应该是al吗?将寄存器18位向右移动将把第17位放入进位标志,从这里您可以根据是否设置BCC/BCS。比用内存中的4字节对其进行anding快得多/小得多。(是的,我知道这会破坏原始值,但这就是寄存器的作用!当然可以。但问题是,
%ah
将被更改。因此,如果您希望值不会被更改,您应该使用
test