| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
龙腾教程网  
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
 
  您当前位置:您现在的位置: 龙腾软件教程网 >> 文章中心 >> 应用程序 >> 汇编教程 >> Linux 汇编语言开发指南 >> 文章正文>>>>>> 
Linux 汇编语言开发指南 三、Hello World!
真不知道打破这个传统会带来什么样的后果,但既然所有程序设计语言的第一个例子都是在屏幕上打印一个字符串 "Hello World!",那我们也以这种方式来开始介绍 Linux 下的汇编语言程序设计。

  在 Linux 操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用 Linux 内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯,不需要链接诸如 libc 这样的函数库,也不需要使用 ELF 解释器,因而代码尺寸小且执行速度快。

  Linux 是一个运行在保护模式下的 32 位操作系统,采用 flat memory 模式,目前最常用到的是 ELF 格式的二进制代码。一个 ELF 格式的可执行程序通常划分为如下几个部分:.text、.data 和 .bss,其中 .text 是只读的代码区,.data 是可读可写的数据区,而 .bss 则是可读可写且没有初始化的数据区。代码区和数据区在 ELF 中统称为 section,根据实际需要你可以使用其它标准的 section,也可以添加自定义 section,但一个 ELF 可执行程序至少应该有一个 .text 部分。下面给出我们的第一个汇编程序,用的是 AT&T 汇编语言格式:

  例1. AT&T 格式

#hello.s
.data          # 数据段声明
    msg : .string "Hello, world! " # 要输出的字符串
    len = . - msg          # 字串长度
.text          # 代码段声明
.global _start      # 指定入口函数
    
_start:         # 在屏幕上显示一个字符串
    movl $len, %edx # 参数三:字符串长度
    movl $msg, %ecx # 参数二:要显示的字符串
    movl $1, %ebx  # 参数一:文件描述符(stdout)
    movl $4, %eax  # 系统调用号(sys_write)
    int $0x80    # 调用内核功能
    
             # 退出程序
    movl $0,%ebx   # 参数一:退出代码
    movl $1,%eax   # 系统调用号(sys_exit)
    int $0x80    # 调用内核功能

  初次接触到 AT&T 格式的汇编代码时,很多程序员都认为太晦涩难懂了,没有关系,在 Linux 平台上你同样可以使用 Intel 格式来编写汇编程序:

  例2. Intel 格式

; hello.asm
section .data      ; 数据段声明
    msg db "Hello, world!", 0xA   ; 要输出的字符串
    len equ $ - msg         ; 字串长度
section .text      ; 代码段声明
global _start      ; 指定入口函数
_start:         ; 在屏幕上显示一个字符串
    mov edx, len   ; 参数三:字符串长度
    mov ecx, msg   ; 参数二:要显示的字符串
    mov ebx, 1    ; 参数一:文件描述符(stdout)
    mov eax, 4    ; 系统调用号(sys_write)
    int 0x80     ; 调用内核功能
             ; 退出程序
    mov ebx, 0    ; 参数一:退出代码
    mov eax, 1    ; 系统调用号(sys_exit)
    int 0x80     ; 调用内核功能

  上面两个汇编程序采用的语法虽然完全不同,但功能却都是调用 Linux 内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出程序。在 Linux 内核源文件 include/asm-i386/unistd.h 中,可以找到所有系统调用的定义。


上一篇:
  • 上一篇文章:
  • 下一篇
  • 下一篇文章: 没有了
  • 收藏此文到百度搜藏 百度搜藏| 新浪VIvi| 365key| Younote| 博采中心| 你好BLOG| 亿友网摘| 和讯网摘|
    相关文章    
    Linux 汇编语言开发指南 二、Linux 汇编语法
    Linux 汇编语言开发指南 一、简介
    修复Linux操作系统的Root密码的几种方法
    Linux系统下网卡手写配置文件
    Linux下安装Apache与PHP的方法
    修复Linux系统Root密码技巧
    Linux下配置基于策略的路由
    全面介绍linux系统下安装配置WEB服务器教程
    Linux系统网络配置详细解析
    Linux下配置多线路ADSL的方法
     
     
     
    最新文章
    普通文章 Linux 汇编语言开发指南 三、Hel最新文章
    普通文章 Linux 汇编语言开发指南 二、Lin最新文章
    普通文章 Linux 汇编语言开发指南 一、简介最新文章
    普通文章 3DSMAX制作三维迷宫最新文章
    普通文章 Fireworks制作网站动态banner教程最新文章
    普通文章 Fireworks绘制质感锁具图标最新文章
    普通文章 基于MySQL数据库的论坛设计方案最新文章
    普通文章 MySQL 5.0常见中文乱码问题的解决最新文章
    普通文章 Fireworks制作精美闪图动画最新文章
    普通文章 FLASH制作新年烟火效果最新文章
     
    热门文章
    推荐文章 CorelDraw 表格制作终极方案
    推荐文章 Photoshop鼠绘水墨风格的精美荷花
    推荐文章 Fireworks网页界面综合设计实例详
    推荐文章 Oracle数据库配置中的常见错误代
    推荐文章 最新迅雷下载电骡资源技巧放送
     
     
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 

    版权所有2006-2008 龙腾教程网