Assembly 不确定为什么在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax
您好,我需要一些帮助来了解此汇编代码中发生了什么:Assembly 不确定为什么在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax,assembly,x86,Assembly,X86,您好,我需要一些帮助来了解此汇编代码中发生了什么: .file "mystery.c" .text .globl mystery .type mystery, @function mystery: pushq %rbp movq %rsp, %rbp movl %edi, -20(%rbp) movl $1, -16(%rbp) movl $0, -12(%rb
.file "mystery.c"
.text
.globl mystery
.type mystery, @function
mystery:
pushq %rbp
movq %rsp, %rbp
movl %edi, -20(%rbp)
movl $1, -16(%rbp)
movl $0, -12(%rbp)
movl $0, -8(%rbp)
cmpl $2, -20(%rbp)
jg .L2
movl $1, %eax
jmp .L3
.L2:
movl $2, -4(%rbp)
jmp .L4
.L5:
movl -12(%rbp), %eax
movl -16(%rbp), %edx
leal (%rdx,%rax), %eax
movl %eax, -8(%rbp)
movl -16(%rbp), %eax
movl %eax, -12(%rbp)
movl -8(%rbp), %eax
movl %eax, -16(%rbp)
addl $1, -4(%rbp)
.L4:
movl -4(%rbp), %eax
cmpl -20(%rbp), %eax
jle .L5
movl -8(%rbp), %eax
.L3:
leave
ret
在我进入.L5之前,我完全理解正在发生的事情,这里的命令leal(%rdx,%rax)
,eax让我感到困惑。到目前为止,我一直在将值移动到eax和edx,现在我在rdx和rax中添加值。rdx和rax从何而来,它们有什么价值?它们只是书写eax和edx的另一种方式吗?感谢您的帮助。这些都是描述寄存器的其他方式。根据“前缀”,它们可以是64、32、16或8位:
-64位rax
-32位eax
-16位ax
-ax的上8位ah
-ax的低位8位al
- 因为在64位模式下,带有64位“地址”和32位目的地的
lea
是最短编码
将其设为32位地址不会影响结果,但需要花费一个字节。请参阅相关答案。它解释了不同的语域及其演变。在这种情况下,%rax
寄存器是64位寄存器%eax
为32位,而%ax
为16位%ah
表示寄存器中16位的高8位,%al
表示低端
这个小图表取自同一个问题的另一个答案,但它很好地展示了它
|63..32|31..16|15-8|7-0|
|AH.|AL.|
|AX.....|
|EAX............|
|RAX...................|
装配问题应该用architeture标记。[x86]?还有别的吗?但为什么不是一个简单的
mov-eax,edx
?@LưuVĩnhPhúc它加上了它们,它可能是一个addl%edx,%eax
(又称add-eax,edx
)。是的,我知道,但为什么要用lea而不是mov呢?会更快吗/shorter@L据我所知,如果可以使用mov
,就没有理由使用lea
。它并不更短,而且在许多µARCH上,lea
的吞吐量略低于mov
。