我目前正在使用Linux上的ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。任何人都可以向我指出有关在调用第一条指令之前在程序开始时堆栈指针和其他寄存器处于什么状态的信息吗?显然,pc / r15指向_start,其余似乎已初始化为0,只有两个例外:sp / r13指向我程序之外的地址,而r1指向稍高的地址。
因此,提出了一些可靠的问题:
任何指针将不胜感激。
这是使我的编译器启动Linux / ARM程序的方法:
/** The initial entry point. */ asm( " .text\n" " .globl _start\n" " .align 2\n" "_start:\n" " sub lr, lr, lr\n" // Clear the link register. " ldr r0, [sp]\n" // Get argc... " add r1, sp, #4\n" // ... and argv ... " add r2, r1, r0, LSL #2\n" // ... and compute environ. " bl _estart\n" // Let's go! " b .\n" // Never gets here. " .size _start, .-_start\n" );
如您所见,我只是从[sp]的堆栈中获取了argc,argv和环境材料。
一些澄清:堆栈指针指向进程内存中的有效区域。r0,r1,r2和r3是被调用函数的前三个参数。我分别用argc,argv和environ填充它们。