test 和 test 和 test 和有什么不一样
What is the difference between test and testl and testb
我在一个函数中有以下 3 条装配线,但我不知道为什么要使用 test/testl/testb。我尝试使用谷歌搜索但找不到任何答案:
testl [=10=]x1000000,(%rax)
test %rdx,%rdx
testb [=10=]x4,0x830(%rdx)
我知道 test 执行 AND,并且从我的代码 testl 做同样的事情,因为该行是 x & 0x1000000
。那么这些不同的测试指令有什么作用呢?
当你用寄存器测试时,操作数的大小是已知的,所以你只需要使用test
。当您使用内存和立即数进行测试时,您需要指定操作数的大小。所以 testb
告诉汇编程序测试一个字节(8 位)而 testl
是测试 32 位。
这些是指定操作数大小的后缀。请参阅:GAS_Syntax - Operation_Suffixes:
GAS assembly instructions are generally suffixed with the letters "b", "s", "w", "l", "q" or "t" to determine what size operand is being manipulated.
b
= byte (8 bit).
s
= single (32-bit floating point).
w
= word (16 bit).
l
= long (32 bit integer or 64-bit floating point).
q
= quad (64 bit).
t
= ten bytes (80-bit floating point).
If the suffix is not specified, and there are no memory operands for the instruction, GAS infers the operand size from the size of the destination register operand (the final operand).
我在一个函数中有以下 3 条装配线,但我不知道为什么要使用 test/testl/testb。我尝试使用谷歌搜索但找不到任何答案:
testl [=10=]x1000000,(%rax)
test %rdx,%rdx
testb [=10=]x4,0x830(%rdx)
我知道 test 执行 AND,并且从我的代码 testl 做同样的事情,因为该行是 x & 0x1000000
。那么这些不同的测试指令有什么作用呢?
当你用寄存器测试时,操作数的大小是已知的,所以你只需要使用test
。当您使用内存和立即数进行测试时,您需要指定操作数的大小。所以 testb
告诉汇编程序测试一个字节(8 位)而 testl
是测试 32 位。
这些是指定操作数大小的后缀。请参阅:GAS_Syntax - Operation_Suffixes:
GAS assembly instructions are generally suffixed with the letters "b", "s", "w", "l", "q" or "t" to determine what size operand is being manipulated.
b
= byte (8 bit).s
= single (32-bit floating point).w
= word (16 bit).l
= long (32 bit integer or 64-bit floating point).q
= quad (64 bit).t
= ten bytes (80-bit floating point).If the suffix is not specified, and there are no memory operands for the instruction, GAS infers the operand size from the size of the destination register operand (the final operand).