在Linux下运行你的第一个汇编程序
在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下运行你的第一个汇编程序相关推荐
- Kali Linux下运行Sniffjoke出错的解决
Kali Linux下运行Sniffjoke出错的解决 由于Kali Linux版本的更新和Sniffjoke发布时间久远等问题,Sniffjoke在新版本的Kali Linux中运行存在各种问题.下 ...
- linux中计算高斯的进程,linux下运行高斯比windows的优势
转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...
- 推荐两款支持在linux下运行ASP.NET网站的国产免费WEB服务器软件
推荐两款支持在linux下运行ASP.NET网站的国产免费WEB服务器软件 1.kangle kangle web server是一款跨平台(windows/linux/bsd).功能强大.安全稳定. ...
- linux版gaussian运行,linux下运行高斯比windows的优势
转引自GaussianFAQ第一章第四节 (1.4) 难道非要用Linux算高斯吗?Windows算高斯的缺陷是什么? 后续问题:听说Linux很难的.我是电脑小白,在Windows上都不太懂,只会最 ...
- deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序
刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...
- Linux下运行纯dos软件,在linux下运行dos软件(转)
在linux下运行dos软件(转)[@more@]在linux系统上运行的dosemu软件包使你能在linux环境运行许多dos软件. [安装] DOSEMU处于不断进行修改和升级的过程中.它在不断增 ...
- linux如何编译wine,利用winelib编译一个可在linux下运行的程序
利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...
- linux下能运行python,(转)Linux下运行python
原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...
最新文章
- LeetCode实战:LRU缓存机制
- mysql8.0.22 win7_现在还能不能下载到正版WIN 7
- [armv9]-Introducing-Arm-Confidential-Compute-Architecture
- qa dataset
- golang 引用相对路径package
- 【机器视觉】 HDevelop语言基础(三)-容器和保留字
- 将一个对象拆开拼接成URL
- 如何新建分支上传_如何创建git分支?
- cli3解决 ie11语法错误 vue_基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册...
- POJ3185(简单BFS,主要做测试使用)
- 我的MVVM框架 v0.1发布
- Centos系统使用代理上网时 yum的代理设置
- MapXtreme 使用技巧10例
- android selector 开始自定义样式
- 大数据思维与数据驱动
- oracle awr 定期,Oracle 每天自动生成AWR报告
- FDM3D打印技术原理简析
- 趣味记忆5大经典的软件架构风格
- alanwang[GDOU] 简单排序法:冒泡排序法(谭浩强例题)
- PADS的四层板转换成2层板
热门文章
- pages.php,manage-pages.php
- 如何在Python中移动文件
- git ——回退过去、回到未来
- 【调制识别】基于高阶累积量的调制方式识别算法matlab仿真,课题识别BPSK, QPSK, 16QAM, 64QAM
- Anaconda3最新版2022版网盘(云盘)免费,不限速
- 计算机网络(一):网络基础知识
- IdentityServer4总结
- [RK3399][Android7.1] 调试笔记 --- 使用ADC芯片ES7243遇到的问题
- java script error_JavasScript 简单错误总结 错误调试
- 基于jsp的火车票网上订票系统