试图理解汇编指令:x86上的cltd

时间:2013-06-18 13:37:56

标签: assembly x86 att

我找到了汇编指令

cltd

通过在英特尔架构上反汇编代码。我发现的描述是,它清除了%edx寄存器,但我不明白发生了什么......有人可以解释这个命令到底是做什么的吗?

4 个答案:

答案 0 :(得分:20)

cltdcdqreference)的别名,将eax签名延伸到edx:eax

这在实践中意味着edx充满了eax(符号位)的最高位。例如,如果eax 0x7F000000 edx0x00000000之后变为cdq。如果eax 0x80000000 edx成为0xFFFFFFFF

答案 1 :(得分:1)

cltd将签名长转换为已签名的双倍长

如果您想查看所发生情况的图表,请跳至http://download.intel.com/products/processor/manual/325462.pdf的第160页(详情请参阅第681页)

答案 2 :(得分:1)

答案 3 :(得分:1)

the documentation的摘要,was mentioned by Michael

Intel   AT&T   From   To
CBW     CBTW   AL     AX
CWDE    CWTL   AX     EAX
CWD     CWTD   AX     DX:AX
CDQ     CLTD   EAX    EDX:EAX
CDQE    CLTQ   EAX    RAX
CQO     CQTO   RAX    RDX:RAX

现在有一些注释的代码片段:

/* Quad to Octo: top bit is zero: extend with zeroes. */
mov $0x7FFFFFFFFFFFFFFF, %rax
mov $0x123456789ABCDEF0, %rdx
cqto
mov %rax, %r12
mov %rdx, %r13
/* rax is unchanged. */
LKMC_ASSERT_EQ(%r12, $0x7FFFFFFFFFFFFFFF)
/* rdx is filled with zeros. */
LKMC_ASSERT_EQ(%r13, $0)

/* Quad to Octo: top bit is one: extend with ones. */
mov $0x8000000000000000, %rax
mov $0x123456789ABCDEF0, %rdx
cqto
mov %rax, %r12
mov %rdx, %r13
LKMC_ASSERT_EQ(%r12, $0x8000000000000000)
LKMC_ASSERT_EQ(%r13, $0xFFFFFFFFFFFFFFFF)

/* Intel equivalent syntax also accepte by GNU GAS. */
mov $0x7FFFFFFFFFFFFFFF, %rax
mov $0x123456789ABCDEF0, %rdx
cqo
mov %rax, %r12
mov %rdx, %r13
LKMC_ASSERT_EQ(%r12, $0x7FFFFFFFFFFFFFFF)
LKMC_ASSERT_EQ(%r13, $0)

/* Smaller size example: Double to Quad.
 * Also zeroes top 32-bits of RDX like many 32 to 64 operaions. */
mov $0xFFFFFFFF7FFFFFFF, %rax
mov $0x123456789ABCDEF0, %rdx
cltd
mov %rax, %r12
mov %rdx, %r13
LKMC_ASSERT_EQ(%r12, $0xFFFFFFFF7FFFFFFF)
LKMC_ASSERT_EQ(%r13, $0)

/* Even smaller size example: Word to Doubleword.
 * Unlike the 32-bit one, does not zero out the top 32-bits of RDX. */
mov $0xFFFFFFFFFFFF7FFF, %rax
mov $0x123456789ABCDEF0, %rdx
cwtd
mov %rax, %r12
mov %rdx, %r13
LKMC_ASSERT_EQ(%r12, $0xFFFFFFFFFFFF7FFF)
LKMC_ASSERT_EQ(%r13, $0x123456789ABC0000)

/* CLTQ: top bit is zero: extend with zeroes. */
mov $0x123456787FFFFFFF, %rax
cltq
LKMC_ASSERT_EQ(%rax, $0x000000007FFFFFFF)

/* CLTQ: top bit is one: extend with ones. */
mov $0x1234567880000000, %rax
cltq
LKMC_ASSERT_EQ(%rax, $0xFFFFFFFF80000000)

/* CWTL: zeroes top 32-bits. */
mov $0x123456789ABC8EF0, %rax
cwtl
LKMC_ASSERT_EQ(%rax, $0xFFFF8EF0)
CWTL

/* CBTW. */
mov $0x123456789ABCDE80, %rax
cbtw
LKMC_ASSERT_EQ(%rax, $0x123456789ABCFF80)
CWTL

可运行的GitHub上游: