在AT&T 32位汇编中,传递字符串通常需要使用movl指令将字符串地址保存到寄存器中,并使用push指令将寄存器中的地址推入栈中。但是,如果在函数调用后立即推送字符串,string指令将无法正常工作,因为函数调用会改变栈指针,导致字符串地址变得不正确。
为了解决这个问题,需要使用lea指令来传递字符串地址。这个指令可以将字符串地址计算到寄存器中,然后使用push指令将寄存器的内容推送到栈中。这种方法可以避免栈指针的问题,并确保字符串参数正确地传递给函数。
下面是一个示例代码,演示如何在AT&T 32位汇编中函数调用后推送字符串:
.section .data
hello:
.string "Hello world\n"
.section .text
.globl _start
_start:
call my_function
lea hello, %eax
push %eax
call printf
addl $8, %esp
movl $1, %eax
xorl %ebx, %ebx
int $0x80
my_function:
push %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call strlen
addl $4, %esp
movl %ebp, %esp
pop %ebp
ret
在这个示例中,我们在函数调用后使用lea指令来计算字符串地址,并将其保存在eax寄存器中。然后使用push指令将eax寄存器中的值推送到栈中,以便将字符串传递给printf函数。最后使用addl指令调整栈指针,以将我们之前推送的内容弹出栈。
在my_function中,我们使用push指令将第一个参数(字符串地址)推送到栈中。然后调用strlen函数来计算字符串的长度,并使用addl指令弹出栈。最后,使用movl指令将栈指针设置回先前的值,并从栈中