从x86 32位程序集调用C main()函数_start

时间:2017-11-24 08:51:49

标签: c assembly command-line x86 crt

我正在尝试编写一份作业:

  

编写一个简单的汇编程序,它只需调用一个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

所以我想知道的是,argcargv位于何处?另外,我只需要将指针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 = 3argv[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

0 个答案:

没有答案