作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
第四课时:Linux 命令行参数
在 Linux 操作系统中,当一个可执行程序通过命令行启动时,其所需的参数将被保存到栈中:首先是 argc,然后是指向各个命令行参数的指针数组 argv,最后是指向环境变量的指针数据 envp。在编写汇编语言程序时,很多时候需要对这些参数进行处理,下面的代码示范了如何在汇编代码中进行命令行参数的处理:
例3. 处理命令行参数
- # args.s
- .text
- .globl _start
- _start:
- popl %ecx # argc
- vnext:
- popl %ecx # argv
- test %ecx, %ecx # 空指针表明结束
- jz exit
- movl %ecx, %ebx
- xorl %edx, %edx
- strlen:
- movb (%ebx), %al
- inc %edx
- inc %ebx
- test %al, %al
- jnz strlen
- movb $10, -1(%ebx)
- movl $4, %eax # 系统调用号(sys_write)
- movl $1, %ebx # 文件描述符(stdout)
- int $0x80
- jmp vnext
- exit:
- movl $1,%eax # 系统调用号(sys_exit)
- xorl %ebx, %ebx # 退出代码
- int $0x80
- ret
【编辑推荐】