我正在尝试编写一份作业:
编写一个简单的汇编程序,它只需调用一个C程序, 并向它发送命令行参数,以便它可以正常运行 (argc和argv)。
如何做到这一点?作为作业的一部分,我们被赋予了这个作为:
section .text
global _start
extern main
_start:
;;code to setup argc and argv for C program's main()
call main
mov eax,1
int 0x80
所以我想知道的是,argc
和argv
位于何处?另外,我只需要将指针argc
放在eax
寄存器中,就像将值返回到常规C函数一样时,C程序会将其余部分用完吗?
最后,在使用以下Makefile编译我的C程序后(正如我所说,我是Assembly的新手,这是老师给我们的Makefile,我不完全理解):
%.o: %.asm
nasm -g -O1 -f elf -o $@ $<
%.o: %.c
gcc -m32 -g -nostdlib -fno-stack-protector -c -o $@ $<
all: lwca
lwca: lwc.o start.o
ld -melf_i386 -o $@ $^
运行./lwca arg1 arg2
会产生argc = 3
和argv[1]=arg1 argc[2]=arg2
解答: 没有答案解决了我的问题,最终有效的是:
pop dword ecx ; ecx = argc
mov ebx,esp ; ebx = argv
push ebx ; char** argv
push ecx ; int argc
call main