三、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!\\n" # 要输出的字符串

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 中,可以找到所有系统调用的定义。

linux汇编指令输出到屏幕,Linux 汇编语言(GNU GAS汇编)开发指南相关推荐

  1. 汇编指令对应的机器码_汇编语言输出“welcome to you!”

    基础知识 汇编语言指令组成 汇编指令:机器码的助记符,有对应的机器码. 伪指令:没有对应的机器码,编译器执行,机器不执行. 其他符号:如+-*/有编译器识别,无对应机器码. CPU与外部器件交互需要 ...

  2. Linux常用指令(幻影快递Linux小组)

    Linux新手管理员指南(中文版) Linux Newbie Administrator Guide (Simplified Chinese Version) 幻影快递Linux小组(SLT-Shad ...

  3. linux下汇编程序gas,Linux 汇编语言(GNU GAS汇编)开发指南

    汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的.Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底 ...

  4. linux操作指令训练,实验二linux 常用命令练习

    一.使用简单的命令:date,cal,who,echo,clear等,了解linux命令格式. 1.date系列命令,用来显示日期:     2.cal系列命令,用来显示日历: 3.who系列命令,用 ...

  5. linux tee 日志输出_25 个 Linux 下最炫酷又强大的命令行神器,你用过其中哪几个呢?...

    众所周知,我们在 Linux 下大多数时候是使用命令行来处理任务的.这样不但操作起来效率比较高,而且界面也比较炫酷.下面,我们就给大家推荐一些不但炫酷又好用的 Linux 命令行神器. 1. exa ...

  6. linux毁灭指令,那些致命的Linux命令

    本文介绍了您千万不要在系统上运行的那些Linux命令,因为它们对于您的Linux系统可能很致命.因此我想先指出一点,本文旨在让读者知道应避免执行以下任何命令.本文提到的所有命令可能会对您的系统及数据造 ...

  7. linux 错误信息 输出到管道,linux grep通过管道输出到head出现write error: Broken pipe错误...

    转载请注明地址:http://blog.csdn.net/echoutopia/article/details/51655882 之前做一个分页,利用grep加head加tail实现的: ls /tm ...

  8. 屏幕录制与GIF转换---OpenCV-Python开发指南(46)

    目录 常规应用 视频转换为GIF 录制屏幕 常规应用 对于程序员来说,在实际的生活中,对于一些简单的程序,往往都是使用自己编写的代码.毕竟学以致用才能熟练掌握,而OpenCV在生活中最常用的一些功能包 ...

  9. linux查看进程运行日志文件,【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件...

    1.说出 10 个 linux 常用的指令 1) ls 查看目录中的文件 2)cd /home 进入 '/ home' 目录:cd .. 返回上一级目录:cd ../.. 返回上两级目录 3)mkdi ...

最新文章

  1. 将ubuntu系统设置静态ip及ssh
  2. 英特尔成立物联网视频事业部,这届IESS还揭露了哪些信息?
  3. 批处理中百分号%的作用
  4. java编写socket使用bufferedReader.readLine()问题研究
  5. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
  6. virtio后端驱动详解
  7. iOS判断是模拟器还是真机
  8. 计算机动漫游戏制作 巴中,四川省哪些中专学校有计算机动漫与游戏制作专业...
  9. ApplicationInsights的探测器尝鲜
  10. 一个德国设计奖,怎么就成了中国品牌的财富密码
  11. webstorm 不识别.config文件_用TypeScript开发手势库 - (2)tsconfigamp; rollup.configamp;npx...
  12. InstallSield更新包快速入门文档
  13. pd虚拟机 17+win10、11懒人镜像 Mac
  14. 超详细的QSS样式表入门Demo
  15. c语言timer linux 回调函数_SetTimer 与 回调函数
  16. 新能源专属车险可在线投保 80%车主基准保费下降
  17. 计算机管理系统工具共享文件夹,win7一键共享工具【管理方式】
  18. 【Android】自定义倒计时弹框(Handler/Timer/RxJava/持续更新)
  19. 纵横算法之四:算法应该怎么学
  20. vue3.0 watch监听器使用方法

热门文章

  1. 【回文串1 动态规划 马拉车算法】LeetCode 5. Longest Palindromic Substring
  2. 【有返回值的回溯】剑指offer——面试题67——机器人的运动范围(回溯法)
  3. 【前端】jQuery学习内容概览
  4. MariaDB -- 数据类型
  5. 面向对象第二单元总结
  6. 吴恩达深度学习笔记 3.1~3.11 浅层神经网络
  7. JS特效之很牛叉的轮播图
  8. HTML5项目笔记8:使用HTML5 的跨域通信机制进行数据同步
  9. [IOI2018] seats 排座位
  10. 白话SpringCloud | 第三章:服务注册与发现-高可用配置(Eureka)-下