在Linux下运行你的第一个汇编程序

汇编语言对于大多数程序员来说都是进而远之的,原因当然是汇编语言晦涩难懂,各种指令搞得人头疼,不过汇编语言适当了解一些还是蛮有意思的,今天带大家在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 汇编语言格式:

当然 我们和学习所有的编程语言一样 打印一个hello world

#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       # 调用内核功能


代码有了 这个要怎么运行呢
这里我要提到两个概念 一个是汇编器 另一个是链接器

汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序:
首先我们使用汇编器将刚写好的程序编译一下
as -o hello.o hello.s
这样会生成一个hello.o的文件

我们用xxd可以查看编译好的二进制文件

但是这个程序还是不能运行 这就需要前面提到的链接器了

由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:

ld -s -o hello hello.o

最后./hello 打印出了我们的第一个汇编hello world!

查看下篇
x86-gcc与arm-linux-gcc分别编译运行第一个C/C++程序(附安装详解与C源码文件传输乱码问题)

在Linux下运行你的第一个汇编程序相关推荐

  1. Kali Linux下运行Sniffjoke出错的解决

    Kali Linux下运行Sniffjoke出错的解决 由于Kali Linux版本的更新和Sniffjoke发布时间久远等问题,Sniffjoke在新版本的Kali Linux中运行存在各种问题.下 ...

  2. linux中计算高斯的进程,linux下运行高斯比windows的优势

    转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...

  3. 推荐两款支持在linux下运行ASP.NET网站的国产免费WEB服务器软件

    推荐两款支持在linux下运行ASP.NET网站的国产免费WEB服务器软件 1.kangle kangle web server是一款跨平台(windows/linux/bsd).功能强大.安全稳定. ...

  4. linux版gaussian运行,linux下运行高斯比windows的优势

    转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...

  5. deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序

    刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...

  6. Linux下运行纯dos软件,在linux下运行dos软件(转)

    在linux下运行dos软件(转)[@more@]在linux系统上运行的dosemu软件包使你能在linux环境运行许多dos软件. [安装] DOSEMU处于不断进行修改和升级的过程中.它在不断增 ...

  7. linux如何编译wine,利用winelib编译一个可在linux下运行的程序

    利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...

  8. linux下能运行python,(转)Linux下运行python

    原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...

  9. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

最新文章

  1. LeetCode实战:LRU缓存机制
  2. mysql8.0.22 win7_现在还能不能下载到正版WIN 7
  3. [armv9]-Introducing-Arm-Confidential-Compute-Architecture
  4. qa dataset
  5. golang 引用相对路径package
  6. 【机器视觉】 HDevelop语言基础(三)-容器和保留字
  7. 将一个对象拆开拼接成URL
  8. 如何新建分支上传_如何创建git分支?
  9. cli3解决 ie11语法错误 vue_基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册...
  10. POJ3185(简单BFS,主要做测试使用)
  11. 我的MVVM框架 v0.1发布
  12. Centos系统使用代理上网时 yum的代理设置
  13. MapXtreme 使用技巧10例
  14. android selector 开始自定义样式
  15. 大数据思维与数据驱动
  16. oracle awr 定期,Oracle 每天自动生成AWR报告
  17. FDM3D打印技术原理简析
  18. 趣味记忆5大经典的软件架构风格
  19. alanwang[GDOU] 简单排序法:冒泡排序法(谭浩强例题)
  20. PADS的四层板转换成2层板

热门文章

  1. pages.php,manage-pages.php
  2. 如何在Python中移动文件
  3. git ——回退过去、回到未来
  4. 【调制识别】基于高阶累积量的调制方式识别算法matlab仿真,课题识别BPSK, QPSK, 16QAM, 64QAM
  5. Anaconda3最新版2022版网盘(云盘)免费,不限速
  6. 计算机网络(一):网络基础知识
  7. IdentityServer4总结
  8. [RK3399][Android7.1] 调试笔记 --- 使用ADC芯片ES7243遇到的问题
  9. java script error_JavasScript 简单错误总结 错误调试
  10. 基于jsp的火车票网上订票系统