尽管代码能够正常工作,但我对编译器似乎混合使用相同类型的32位和64位参数感到困惑。具体地说,我有一个接收三个char指针的函数。查看汇编代码,其中三个指针中的两个被传递为64位指针(如预期所示),而第三个是本地常量,但仍然是字符字符串,并被传递为32位指针。我不明白当第3个参数不是完全加载的64位指针时,我的函数怎么可能知道。显然,只要高位为0,这并不重要,但我没有看到它努力确保这一点。在这个例子中,RDX的高位可以是任何值。我错过了什么?顺便说一下,接收函数假定它是一个完整的64位指针,并在进入时包括此代码:
movq %rdx, -24(%rbp)
以下是相关代码:
.LC4
.string "My Silly String"
.text
.globl funky_funk
.type funky_funk, @function
funky_funk:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $16, %rsp
movq %rdi, -16(%rbp) ;char *dst 64-bit
movl %esi, -20(%rbp) ;int len, 32 bits OK
movl $.LC4, %edx ;<<<<---- why is it not RDX?
movl -20(%rbp), %ecx ;int len 32-bits OK
movq -16(%rbp), %rbx ;char *dst 64-bit
movq -16(%rbp), %rax ;char *dst 64-bit
movq %rbx, %rsi ;char *dst 64-bit
movq %rax, %rdi ;char *dst 64-bit
call edc_function
void funky_funk(char *dst, int len)
{ //how will function know when
edc_function(dst, dst, STRING_LC4, len); //a str passed in 3rd parm
} //is 32-bit ptr vs 64-bit ptr?
void edc_function(char *dst, char *src, char *key, int len)
{
//so, is key a 32-bit ptr? or is key a 64-bit ptr?
}
lea .LC4(%rip),%rdx
。而不是使用64位绝对地址的10字节mov
指令。如何在GNU汇编器中将函数或标签的地址加载到寄存器中。 - Peter Cordes