level 1
DJ南
楼主
在 Linux 操作系统中,当一个可执行程序通过命令行启动时,其所需的参数将被保存到栈中:首先是 argc,然后是指向各个命令行参数的指针数组 argv,最后是指向环境变量的指针数据 envp。在编写汇编语言程序时,很多时候需要对这些参数进行处理,下面的代码示范了如何在汇编代码中进行命令行参数的处理:
例3. 处理命令行参数
# args.s
.text
.globl _start
_start:
popl%ecx# argc
vnext:
popl%ecx# argv
test %ecx, %ecx # 空指针表明结束
jzexit
movl%ecx, %ebx
xorl%edx, %edx
strlen:
movb(%ebx), %al
inc%edx
inc%ebx
test%al, %al
jnzstrlen
movb$10, -1(%ebx)
movl$4, %eax # 系统调用号(sys_write)
movl$1, %ebx # 文件描述符(stdout)
int$0x80
jmpvnext
exit:
movl$1,%eax # 系统调用号(sys_exit)
xorl%ebx, %ebx # 退出代码
int $0x80
ret
2009年06月02日 18点06分
1
例3. 处理命令行参数
# args.s
.text
.globl _start
_start:
popl%ecx# argc
vnext:
popl%ecx# argv
test %ecx, %ecx # 空指针表明结束
jzexit
movl%ecx, %ebx
xorl%edx, %edx
strlen:
movb(%ebx), %al
inc%edx
inc%ebx
test%al, %al
jnzstrlen
movb$10, -1(%ebx)
movl$4, %eax # 系统调用号(sys_write)
movl$1, %ebx # 文件描述符(stdout)
int$0x80
jmpvnext
exit:
movl$1,%eax # 系统调用号(sys_exit)
xorl%ebx, %ebx # 退出代码
int $0x80
ret