您好我需要一些帮助来了解这个汇编代码中发生了什么:
.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
我完全理解UNTIL到底发生了什么.L5,这里的命令leal(%rdx, %rax)
,eax让我感到困惑。到目前为止,我一直在将值移到eax和edx,现在我在rdx和rax中添加了值。 rdx和rax来自哪里,他们持有什么价值?它们只是编写eax和edx的另一种方式吗?谢谢你的帮助。
答案 0 :(得分:20)
请参阅this相关答案。它解释了不同的寄存器及其演变。在这种情况下,%rax
寄存器是64位寄存器。 %eax
是32位,%ax
是16位。 %ah
指的是寄存器中16位的高8位,%al
指的是低位。
这个小图取自同一个问题的另一个答案,但它很好地显示了......
|63..32|31..16|15-8|7-0|
|AH.|AL.|
|AX.....|
|EAX............|
|RAX...................|
答案 1 :(得分:7)
这些“真的只是”描述寄存器的其他方式。根据“前缀”,它们是64位,32位,16位或8位:
rax
- 64位eax
- 32位ax
- 16位ah
- ax
al
- ax
答案 2 :(得分:3)
因为在64位模式下,具有64位“地址”和32位目标的lea
是最短编码。
使其成为32位地址不会影响结果,但会花费一个字节。