您的位置: 首页 计算机类> Linux认证> 考试介绍
Linux认证介绍 linux认证题库 linux认证证书 linux考试
公务员考试辅导课程

Linux汇编语言开发指南(3)

发布时间:11-21

来 源:100ksw.com整理

页 数:4页

上一篇:Linux使用基本知识:修改环境变量PATH

下一篇:Linux下常用配置文件及常用命令介绍


第2页的内容  当一个系统调用所需的参数个数大于 5 时,执行int 0x80 指令时仍需将系统调用功能号保存在寄存器 eax 中,所不同的只是全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针。系统调用完成之后,返回值仍将保存在寄存器 eax 中。由于只是需要一块连续的内存区域来保存系统调用的参数,因此完全可以像普通的函数调用一样使用栈(stack)来传递系统调用所需的参数。但要注意一点,Linux 采用的是 C 语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即最后一个参数先入栈,而第一个参数则最后入栈。如果采用栈来传递系统调用所需的参数,在执行int 0x80 指令时还应该将栈指针的当前值复制到寄存器 ebx中。

    六、命令行参数

    在 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

    七、GCC 内联汇编

    用汇编编写的程序虽然运行速度快,但开发速度非常慢,效率也很低。如果只是想对关键代码段进行优化,或许更好的办法是将汇编指令嵌入到 C 语言程序中,从而充分利用高级语言和汇编语言各自的特点。但一般来讲,在 C 代码中嵌入汇编语句要比"纯粹"的汇编语言代码复杂得多,因为需要解决如何分配寄存器,以及如何与C代码中的变量相结合等问题。

    GCC 提供了很好的内联汇编支持,最基本的格式是:

__asm__("asm statements");

例如:

__asm__("nop");

    如果需要同时执行多条汇编语句,则应该用"\\n\\t"将各个语句分隔开,例如:




Google
 

     

考试信息

热点

课程

更新

©2005-2006 100ksw.com 版权所有 皖ICP备06013378号