Linux下的匯編語言之系統(tǒng)調用
作為最基本的編程語言之一,匯編語言雖然應用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿 Linux 內核來講,雖然絕大部分代碼是用 C 語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是 C 語言也會有些力不從心,而匯編語言則能夠很好揚長避短,最大限度地發(fā)揮硬件的性能。
第四課時:Linux 命令行參數(shù)
在 Linux 操作系統(tǒng)中,當一個可執(zhí)行程序通過命令行啟動時,其所需的參數(shù)將被保存到棧中:首先是 argc,然后是指向各個命令行參數(shù)的指針數(shù)組 argv,最后是指向環(huán)境變量的指針數(shù)據(jù) envp。在編寫匯編語言程序時,很多時候需要對這些參數(shù)進行處理,下面的代碼示范了如何在匯編代碼中進行命令行參數(shù)的處理:
例3. 處理命令行參數(shù)
- # 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 # 系統(tǒng)調用號(sys_write)
- movl $1, %ebx # 文件描述符(stdout)
- int $0x80
- jmp vnext
- exit:
- movl $1,%eax # 系統(tǒng)調用號(sys_exit)
- xorl %ebx, %ebx # 退出代碼
- int $0x80
- ret
【編輯推薦】