Linux下的汇编程序设计

ARM9嵌入式Linux开发-ARM汇编程序设计基础 目录 1.1 ARM源文件格式 1.2 ARM指令集 1.2.1跳转指令 1.2.2数据处理指令 1.2.3程序状态寄存器处理指令 1.2.4批量数据加载/存储指令 1.2.5协处理器指令 1.3 ARM汇编规范 1.3.1 ARM汇编语句格式 1.3.2ARM汇编中的常用符号 1.3.3汇编语言程序中的表达式和运算符 1.4 ARM汇编语言的程序结构 1.5 ARM汇编... 阅读详情

一、汇编语言的优缺点:

由于Linux是用C写的,所以C自然而然的就成为了Linux的标准编程语言。大部分人都把汇编给忽略了,甚至在因特网上找资料都是非常的困难,很多问题都需要靠自己来尝试。我认为这样对待汇编语言是不公平的,不能只看到它的缺点,当然也不能只看到它的优点,下面把它的优缺点作一个比较:

优点:汇编语言可以表达非常底层的东西

l 可以直接存取寄存器和I/O

l 编写的代码可以非常精确的被执行

l 可以编写出比一般编译系统高效的代码

l 可以作为不同语言或不同标准的接口

缺点:汇编语言是一个非常低级的语言

l 非常冗长单调,在DOS下编程时就可以体会到

l 易出BUG,且调试困难

l 代码不易维护

l 兼容性不好,与硬件关系非常紧密

总的来说,汇编语言要用在必须的地方,尽量少用汇编编写大型程序,多采用inline模式。

二、汇编语言工具:

DOS下常用的工具MASM和TASM到Linux下就用不起来了,Linux有自己的汇编工具,而且种类非常的多。其中Gas可以算是标准配置,每一种Linux中都包括有Gas,但是GAS采用的不是我们通常在DOS下采用的汇编语法,它采用的是AT&T的语法格式,与intel语法格式有很大的不同。

如果要采用与DOS接近的语法格式,就必须用另一种汇编工具NASM,NASM基本与MASM相同,但也有不少地方有较大区别,特别涉及到操作系统原理时,与DOS可以说是截然不同。

Linux汇编程序设计:

一、Hello,world!

几乎所有的语言入门篇都是以“Hello,world!”为例,那么我也以Hello,world!为例开始。

;-------------NASM’s standalone Hello-World.asm for Linux --------
section .text
extern puts
global main

main:
push dword msg ;stash the location of msg on the stack.
call puts ;call the "puts" routine (libc?)
add esp, byte 4 ;clean the stack?
ret ;exit.

msg:
db "Hello World!",0

编译:
nasm –f elf hello.asm
gcc –o hello hello.o

说明:这个程序实际上是调用了,Linux系统的puts函数,原理与调用DOS下C语言的函数相同,先用Extern声明puts是外部函数,再把参数(即msg的地址)压入堆栈,最后Call函数实现输出。
我们再来看一个程序:

section .text
global main

main:
mov eax,4 ;4号调用
mov ebx,1 ;ebx送1表示stdout
mov ecx,msg ;字符串的首地址送入ecx
mov edx,14 ;字符串的长度送入edx
int 80h ;输出字串
mov eax,1 ;1号调用
int 80h ;结束
msg:
db "Hello World!",0ah,0dh
(编译同上一个程序)

这个程序与DOS程序十分相似,它用的是linux中的80h中断,相当于DOS下的21h中断,只是因为Linux是32位操作系统,所以采用了EAX、EBX等寄存器。但是Linux作为一个多用户的操作系统与DOS又是有着非常大的区别的。要写出有特色的程序,不了解操作系统和硬件是不行的。下面我介绍一下Linux操作系统。

二、Linux操作系统简介:

操作系统实际是抽象资源操作到具体硬件操作细节之间的接口。对Linux这样的多用户操作系统来说,它需要避免用户对硬件的直接访问,并防止用户之间的互相干扰。所以Linux接管了BIOS调用和端口输入输出,关于端口输入输出方面请参阅Linux IO-Port-Programming HOWTO。而要通过Linux对硬件硬件进行访问就需要用到System Call,实际上是许多C的函数,可以在汇编程序中调用,调用方法与DOS下的汇编完全相同,而且用ASM汇编时不用链接额外的库函数。

Linux与DOS的主要区别在于内存管理、进程(DOS下无进程概念)、文件系统,其中内存管理和进程与汇编编程的关系比较密切:

1、内存管理:

对任一台计算机而言,其内存以及其他资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux采用了称为“虚拟内存”的内存管理方式。Linux将内存划分为容易处理的“内存页”,在系统运行过程中,应用程序对内存的需求大于物理内存时,Linux可将暂时不用的内存页交换到硬盘上,这样,空闲的内存页可以满足应用程序的内存需求,而应用程序却不会注意到内存交换的发生。

2、进程

进程实际是某特定应用程序的一个运行实体。在Linux系统中,能够同时运行多个进程,Linux通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“调度”,完成调度的程序称为调度程序。通过多任务机制,每个迸程可认为只有自己独占计算机,从而简化程序的编写,每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。

为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。

三、Linux下的汇编工具:

Linux下的汇编工具可谓百家争鸣,不像DOS下都要给MASM和TASM给控制了。但是Linux下每一种汇编工具都有很大的区别,要想全部掌握几乎是不可能的,下面我介绍几种常用的汇编工具,重点介绍NASM及其使用和语法。

1、GCC

GCC其实是GNU的C语言产品,但它支持Inline Assemble,在GCC中inline assemble使用就像宏一样,但它比宏能更清楚更准确的表达机器的工作状态。

C是汇编编程的一个高度概括,它可以减少许多汇编中的麻烦,特别是在GCC这个C编译器中,assemble似乎起不了多大的作用。

2、GAS

GAS是Linux各版本中基本的汇编工具,但它采用的是AT&T的语法标准与Intel的语法标准有很大的不同,对于DOS编程的我们来说,学习起来是非常困难的。当然如果要精通Linux下的汇编编程,学习GAS也是非常必要的,具体的语法标准可以参看Using GNU Assembler。

3、GASP

GASP是GAS的扩展,它增强了GAS对宏的支持。

4、NASM

NASM是linux中语法与DOS最为相像的一种汇编工具。虽说如此,它与MASM也是有着很大区别的。

l NASM的使用格式如下:

Nasm –f -o

例如:

Nasm -f elf hello.asm

将把hello.asm汇编成ELF object文件,而

Nasm -f bin hello.asm -o hello.com

会把hello.asm汇编成二进制可执行文件hello.com

Nasm –h

将会列出NASM命令行的完整说明。

NASM不会有任何输出,除非有错误发生。

-f 在Linux下主要有aout和ELF两种,如果你不确定你的Linux系统应该用AOUT还是ELF,可以在NASM目录中输入 File nasm ,如果输出nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1表示是ELF,如果输出nasm: Linux/i386 demand-paged executable (QMAGIC)表示是aout。

l NASM与MASM的主要不同:

首先与linux系统一样,nasm是区分大小写的,Hello与hello将是不同的标识符,如果要汇编到DOS或OS/2,需要加入UPPERCASE参数。

其次,nasm中内存操作数都是以[ ]表示。

在MASM中

foo equ 1
bar dw 2
mov ax,foo
mov ax,bar
将被汇编成完全不同的指令,虽然它们在MASM中的表达方式完全一样。而NASM完全避免了这种混乱,它使用的是这样的规则:所有对内存的操作都必须通过[ ]来实现。例如上例中对bar的操作就要写成如下形式 mov ax,[bar]。由此可见,nasm中对offset的使用也是没有必要的(nasm中无offset)。Nasm对[ ]的使用与masm也有所不同,所有的表达式都必须写在[ ]中,下面举两个例子来说明:

Masm Nasm
Mov ax,table[di]
Mov ax,[table+di]

Mov ax,es:[di]
Mov ax,[es:di]

Mov ax,[di]+1
Mov ax,[di+1]

Nasm 中不存储变量类型,原因很简单masm中通过[ ]寻址方式的变量也必须要指定类型。Nasm中不支持LODS, MOVS, STOS, SCAS, CMPS, INS, OUTS,只支持lodsb、lodsw等已经指定类型的操作。Nasm中不再有assume操作,段地址完全取决于存入段寄存器的值。

关于NASM的使用方法及语法还可以参阅NASM使用手册。

结论:

我认为不论是在Windows/DOS下还是在Linux下完完全全用汇编编一个大型程序已经是不可能了,也不会有人愿意去这样做。在windows下我们可以用VC,在Linux/Xwindows下我们可以用C甚至C++ Builder,但是像VC、C++ Builder之类的工具尽量隐藏了底层的调用,同时也阻隔了成为高手的机会,因为编出来的程序无法了解它的执行过程也就使编程中最重要的“可预测”性变得很低。正因为如此汇编才有它存在的必要性,同时还有一个更重要的原因,正如《超级解霸》的作者梁肇新所说:“编程序的重点不是“编”,而是调试程序,理论上的完美在实现的时候会遇到很多细节问题,这些问题必须调试才能解决。我的编程习惯是一天写五天调试,《超级解霸》是调试出来的,而不是写出来的。调试就涉及到汇编的问题,不进行汇编级的调试是不彻底的,也不能让人放心。

参考资料:

l Jan’s Assemble Homepage

by Jan Wagemakers 8.1999

l Linux Assemble HOWTO

by Konstantin Boldyshev and Fran鏾is-Ren?Rideau 12.1999

l Linux/i386 System Calls

By Konstantin Boldyshev 1999

linux汇编语言程序设计 一步一步学习linux汇编语言程序设计].Assembly.Language.Step-by-Step.-.Programming.with.Linux,.3rd.Edition.Oct.2009.rar ) 立即下载

相关推荐

Linux下一款比较好的汇编器

这是Linux下一款比较好的汇编器,支持X86 MASM汇编语言格式,提供的文档齐全,是Linux下汇编语言开发的利器。NASM是由The NASM Development Team开发组维护。

linux下搭建汇编环境

在windows学习都是用的MASM,那如果在linux下也用MASM呢,怎么办?方法如下: 一.安装 可以通过一些软件,来模拟DOS,可以用Dosbox。如果用的ubuntu,在软件中心就可以找到。 直接安装后就可以在启动栏看到图标 ,     或是通过命令:sudo apt-get install dosbox   二.环境搭建 1.在 linux下新建一个 masm 文

左手代码 右手诗 1万+

MasmForWindows20125

汇编语言编译软件,汇编课专用软件,解压之后再进行安装即可

在Linux环境下(Ubuntu)编写MASM汇编程序

转载自:http://blog.renren.com/share/333499439/14661346767 作者:丁枣枣 名词解释: MASM: MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程

小小码农 1万+

汇编语言基于Linux

学习linux内核,一定要学习汇编语言,这是一本完全基于linux讲解汇编的书

汇编语言程序设计(中文版Richard Blum-linux+AT&T)

经典的AT&T汇编,值得下载学习 由于体积较大,超过能上传的上限,故拆开打包

Ubuntu Linux 汇编语言程序设计

借鉴 《深入理解程序设计》 的两个小例子,对应到opencl的汇编语言程序设计 案例一 1.源码 将如下源码保存为 exit.s .section .data # 汇编器指令,数据段,表示存放数据的内存区域 .section .text # 汇编器指令,代码段,表示下面是程序指令 .globl _start # 程序的全局入口 _start 是一个关键字符号 _start: # 表示下面是程序指令 movl $1, %eax # 移入eax,由于后面执行了int $0

eloudy的专栏 653

ROS中costmap_converter插件的配置与使用

在学习TEB算法的过程中,作者提供了一个插件用于转换代价地图,原始的代价地图是由栅格地图中单元格组成,用于表示障碍物,但单元格占用的计算资源较大,故采用插件将单元格转换成点,线,多边形表示。 插件激活 rospack plugins --attrib=plugin costmap_converter 配置cfg文件 在导航配置文件下,新建costmap_converter_params.yaml #######################################################

weixin_42621524的博客 5903

C# 实现虚拟桌面和桌面切换

网上有不少用其他语言实现虚拟桌面的例子,但是用C#实现的倒是比较少,所以就封装了一个VirtualDesktop类,可以很方便的实现虚拟桌面。 实现虚拟桌面,主要是利用CreateDesktop、OpenDesktop和 SwitchDesktop这几个API函数,如果想在打开的桌面上运行程序的话还需要的就是CreateProcess函数,这些API函数的具体介绍可以到MSD...

老罗传奇 1010

OpenCV+ArUco实战:如何用Python实现高精度二维码测距(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现基于ArUco标签的高精度单目视觉测距。通过相机标定、标签检测和三维位置估算,结合完整代码示例,帮助开发者在机器人导航、工业自动化等场景中实现厘米级距离测量,并探讨了精度优化与三维可视化等进阶应用。

weixin_29052717的博客 474

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 431

汇编写的程序linux可以用吗,Linux下如何使用MASM编写汇编程序呢?

目前多数学校的微机原理课程使用的是MASM汇编器,而Linux中的汇编工具是nasm 。二者之间的语法有不少差别,不能通用。安装dosbox 或dosemu 之后都可以在Linux中使用MASM和Debug,而且由于是在Dosbox及dosemu的虚拟机中运行,安全性也较高。安装你可以选择安装dosbox或dosemu,也可以选择二者都安装。Dosbox的网站为 http://www。dosbox...

weixin_28990983的博客 316

deepin搭建samba服务器

一.为什么要用Samba? Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享。二.需要的软件? 我是在deepin上实现的,在终端中使用一下两句命令,就可以安装Samba的软件包 $sudo apt-get install samba //安装samba 三.Samba服务的组成 Samba的核心是两个守护进程smbd和nmbd。当然,它

xbrother123的博客 8598

Linux的x86汇编程序设计

本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 位的保护模式下...但它又有一个截然不同的优势就是它允许你调用 C 的标准库函数和 Linux 的共享库函数. 我开始给 Linux 下的汇编语言编程来个简要介绍; 为了更好读一点,

iamempty的专栏 1224

基于分位数回归的静态CoVaR计算 案例与代码

原文链接:https://bbs.pinggu.org/thread-7925441-1-1.html 一、静态CoVaR模型介绍 二、资料简介 实现对相关期刊论文进行论文重现,解决实证分析中的技术操作问题。里面包含了每一步详细的步骤,可以方便的利用这个手册解决大部分利用分位数回归计算静态CoVaR的论文的模型实现问题。即从数据下载到模型实现一整条操作步骤。 关键词:【分位数回归】【Co...

ChenQihome9的博客 7503

国产平替NeuroSky?实测金牛座TGAM脑电模块,从Arduino到Python的完整数据采集指南

本文详细介绍了国产金牛座TGAM脑电模块的完整使用流程,包括硬件连接、数据采集和Python分析。通过Arduino和Python的实战案例,展示了如何从脑电波传感器获取并解析专注度、放松度等数据,适用于专注力训练和脑机接口开发。

weixin_30735745的博客 575

linux arm汇编,嵌入式Linux ARM汇编(四)——ARM汇编程序设计

嵌入式Linux ARM汇编(四)——ARM汇编程序设计汇编程序有顺序、循环、分支、子程序四种结构形式。一、顺序结构程序实例:AREA Buf,DATA,READWRITE;定义数据段BufArrayDCB 0x11,0x22,0x33,0x44;定义12个字节的数组ArrayDCB 0x55,0x66,0x77,0x88DCB 0x00,0x00,0x00,0x00AREA hello,CODE...

weixin_33382711的博客 1955

高阶玩法——Dify生成的数据自动写入mysql数据库

采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。工具:sql_save_post;

qq_44493378的博客 8539

x86汇编 linux,Linux操作系统的X86汇编程序设计

本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 位的保护模式下...但它又有一个截然不同的优势就是它允许你调用 C 的标准库函数和 Linux 的共享库函数。 我开始给 Linux 下的汇编语言编程来个简要介绍; 为了更好读一点, 你可能要跳过这个...

weixin_39719585的博客 365

华为OD机试真题 新系统2026-04-01 Java&Go【计算数列位置N的值】

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

MISAYAONE的博客 2030

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计

嵌入式Linux ARM汇编(四)——ARM汇编程序设计汇编程序有顺序、循环、分支、子程序四种结构形式。一、顺序结构程序实例:AREA Buf,DATA,READWRITE;定义数据段BufArrayDCB 0x11,0x22,0x33,0x44;定义12个字节的数组ArrayDCB 0x55,0x66,0x77,0x88DCB 0x00,0x00,0x00,0x00AREA hello,CODE...

weixin_35626356的博客 694

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: Ubuntu下安装kde(kubuntu)桌面
下一篇: 学习汇编前你应该知道的知识(一)
Linux先生
博客等级 码龄20年 97粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值