目的
了解如何通过命令行向AT&T程序传递参数
前置知识
通过命令行运行AT&T程序时,系统会将一些参数压到程序的栈中,可以通过访问程序堆栈来获取这些参数,参数分布如下:
程序
.section .data
output1:
.asciz "There are %d parameters:\n"
output2:
.asciz "%s\n"
.code32
.section .text
.global _start
_start:
movl (%esp), %ecx
pushl %ecx
pushl $output1
call printf
addl $4, %esp
popl %ecx
movl %esp, %ebp
addl $4, %ebp
loop1 :
pushl %ecx
pushl (%ebp)
pushl $output2
call printf
addl $8, %esp
popl %ecx
addl $4, %ebp
loop loop1
pushl $0
call exit
程序的编译连接执行
汇编
链接
执行
总结
1、主程序与被调用函数之间的参数传递可以通过寄存器、变量和堆栈
2、汇编函数标准结构
.section .text
.type func, @function
.global func
func:
pushl %ebp
movl %esp, %ebp
函数体...
movl %ebp, %esp
popl %ebp
ret
这样操作ebp与esp,是为了使用ebp作为基址来访问堆栈中的参数
3、as --32:表示生成32位代码
ld -m elf_i386:表示以elf格式输出i386的32位代码