首页 > 编程语言 >GNU 汇编语法基础

GNU 汇编语法基础

时间:2024-08-31 18:53:18浏览次数:5  
标签:汇编 操作数 r0 r1 GNU 语法 指令 寄存器

3719304ea7c04b299509ac142bd52e28.png

 

目录

一、引言

二、GNU 汇编基本结构

1.指令格式

2.注释

3. 段

三、寄存器和寻址方式

1.寄存器命名

2.寻址方式

四、指令集 

1.数据传送指令

2.算术运算指令 

3.逻辑运算指令

4.控制流指令 

五、宏和函数 

1.宏定义

 

2. 函数定义

六、总结


 

一、引言

        在嵌入式系统开发和底层编程中,汇编语言是一种强大的工具。GNU 汇编器(Gas)是一种广泛使用的汇编器,支持多种处理器架构。本文将深入介绍 GNU 汇编语法,帮助读者更好地理解和使用汇编语言。

 

二、GNU 汇编基本结构

1.指令格式

  • GNU 汇编指令通常由操作码和操作数组成。操作码表示要执行的操作,操作数可以是寄存器、内存地址或立即数。
  • 例如,mov r0, #10表示将立即数 10 加载到寄存器 r0 中。

 

2.注释

  • GNU 汇编中的注释使用@符号表示‌在GNU汇编语法中,@符号用于标识注释,类似于C语言中的///* */。注释可以出现在指令的后面,用于解释指令的功能或用途。
  • 例如:            add:MOVS R0,#0X12@设置 R0=0X12    这行代码中, @设置 R0=0X12 就是注释部分,用于解释add:MOVS R0,#0X12这条指令的作用是将R0寄存器的值设置为0X12

 

3. 段

  • GNU 汇编将代码和数据分为不同的段。常见的段包括.text(代码段)、.data(数据段)和.bss(未初始化数据段)。
  • 代码段用于存储可执行的指令,数据段用于存储已初始化的数据,未初始化数据段用于存储未初始化的数据,在程序加载时会被初始化为零。

 

三、寄存器和寻址方式

1.寄存器命名

  • GNU 汇编使用特定的命名约定来表示不同的寄存器。例如,在 ARM 架构中,寄存器 r0-r15 分别表示不同的通用寄存器。
  • 寄存器的命名可以在指令中直接使用,例如mov r0, r1表示将寄存器 r1 的值复制到寄存器 r0 中。

 

2.寻址方式

  • GNU 汇编支持多种寻址方式,包括立即寻址、寄存器寻址、寄存器间接寻址、基址加偏移寻址等。
  • 立即寻址:操作数是一个立即数,直接在指令中给出。例如,mov r0, #10表示将立即数 10 加载到寄存器 r0 中。
  • 寄存器寻址:操作数是一个寄存器,直接在指令中给出寄存器的名称。例如,mov r0, r1表示将寄存器 r1 的值复制到寄存器 r0 中。
  • 寄存器间接寻址:操作数是一个内存地址,通过寄存器间接给出。例如,ldr r0, [r1]表示将寄存器 r1 所指向的内存地址中的值加载到寄存器 r0 中。
  • 基址加偏移寻址:操作数是一个内存地址,通过基址寄存器加上偏移量给出。例如,ldr r0, [r1, #4]表示将寄存器 r1 加上偏移量 4 所指向的内存地址中的值加载到寄存器 r0 中。

 

四、指令集 

1.数据传送指令

  • 数据传送指令用于在寄存器和内存之间或寄存器之间传送数据。常见的数据传送指令包括movldrstr等。
  • mov指令用于将一个值从一个源操作数复制到一个目标操作数。例如,mov r0, #10表示将立即数 10 加载到寄存器 r0 中。
  • ldr指令用于从内存中加载数据到寄存器中。例如,ldr r0, [r1]表示将寄存器 r1 所指向的内存地址中的值加载到寄存器 r0 中。
  • str指令用于将寄存器中的数据存储到内存中。例如,str r0, [r1]表示将寄存器 r0 的值存储到寄存器 r1 所指向的内存地址中。

 

2.算术运算指令 

  • 算术运算指令用于执行加法、减法、乘法和除法等算术运算。常见的算术运算指令包括addsubmuldiv等。
  • add指令用于将两个操作数相加,并将结果存储在目标操作数中。例如,add r0, r1, r2表示将寄存器 r1 和 r2 的值相加,并将结果存储在寄存器 r0 中。
  • sub指令用于将两个操作数相减,并将结果存储在目标操作数中。例如,sub r0, r1, r2表示将寄存器 r1 和 r2 的值相减,并将结果存储在寄存器 r0 中。
  • mul指令用于将两个操作数相乘,并将结果存储在目标操作数中。例如,mul r0, r1, r2表示将寄存器 r1 和 r2 的值相乘,并将结果存储在寄存器 r0 中。
  • div指令用于将两个操作数相除,并将结果存储在目标操作数中。例如,div r0, r1, r2表示将寄存器 r1 除以 r2,并将结果存储在寄存器 r0 中。

 

3.逻辑运算指令

  • 逻辑运算指令用于执行与、或、异或等逻辑运算。常见的逻辑运算指令包括andorreor等。
  • and指令用于将两个操作数进行与运算,并将结果存储在目标操作数中。例如,and r0, r1, r2表示将寄存器 r1 和 r2 的值进行与运算,并将结果存储在寄存器 r0 中。
  • orr指令用于将两个操作数进行或运算,并将结果存储在目标操作数中。例如,orr r0, r1, r2表示将寄存器 r1 和 r2 的值进行或运算,并将结果存储在寄存器 r0 中。
  • eor指令用于将两个操作数进行异或运算,并将结果存储在目标操作数中。例如,eor r0, r1, r2表示将寄存器 r1 和 r2 的值进行异或运算,并将结果存储在寄存器 r0 中。

 

4.控制流指令 

  • 控制流指令用于改变程序的执行流程。常见的控制流指令包括b(跳转)、bl(带链接的跳转)、cmp(比较)和branch(条件跳转)等。
  • 指令用于无条件跳转。例如,b label表示跳转到标签label处继续执行。
  • bl 指令用于带链接的跳转,即在跳转的同时将下一条指令的地址存储到链接寄存器中。例如,bl function表示跳转到函数function处执行,并将返回地址存储到链接寄存器中。
  • cmp指令用于比较两个操作数,并根据比较结果设置条件标志位。例如,cmp r0, r1表示比较寄存器 r0 和 r1 的值,并根据比较结果设置条件标志位。
  • branch指令用于根据条件标志位进行条件跳转。例如,beq label表示如果相等标志位为 1,则跳转到标签label处继续执行。

 

五、宏和函数 

1.宏定义

GNU 汇编支持宏定义,可以将一段代码定义为一个宏,并在需要的地方进行展开。宏定义可以提高代码的可读性和可维护性。

例如,以下是一个宏定义的示例:

.macro add_two_numbers a, b
    add \a, \a, \b
.endm

在这个例子中,定义了一个名为 add_two_numbers 的宏,它接受两个参数ab,并将参数b的值加到参数a上。在代码中,可以使用以下方式调用这个宏:

add_two_numbers r0, r1

这将展开为add r0, r0, r1,即将寄存器 r1 的值加到寄存器 r0 上。

 

2. 函数定义

GNU 汇编也支持函数定义,可以将一段代码定义为一个函数,并在需要的地方进行调用。函数定义可以提高代码的可读性和可维护性。

例如,以下是一个函数定义的示例:

function:
    push {lr}
    add r0, r0, r1
    pop {pc}

在这个例子中,定义了一个名为function的函数,它接受两个参数r0r1,并将参数r1的值加到参数r0上。在代码中,可以使用以下方式调用这个函数:

bl function

这将跳转到函数function处执行,并将返回地址存储到链接寄存器中。当函数执行完毕后,将返回地址从链接寄存器中弹出,并继续执行下一条指令。

 

六、总结

        GNU 汇编语法是一种强大的底层编程工具,它可以帮助开发者更好地理解和控制计算机的底层操作。本文介绍了 GNU 汇编的基本结构、寄存器和寻址方式、指令集、宏和函数等方面的内容,希望能够帮助读者更好地掌握 GNU 汇编语法。在实际应用中,开发者可以根据具体的需求选择合适的汇编指令和编程技巧,以提高程序的性能和效率。同时,也可以结合高级编程语言和汇编语言,实现更加复杂的程序功能。

 

标签:汇编,操作数,r0,r1,GNU,语法,指令,寄存器
From: https://blog.csdn.net/qq_38072731/article/details/141717631

相关文章

  • Go plan9 汇编: 打通应用到底层的任督二脉
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言作为一个严肃的Gopher,了解汇编是必须的。本汇编系列文章会围绕基本的Go程序介绍汇编的基础知识。1.Go程序到汇编首先看一个简单到令人发指的示例:packagemainfuncmain(){ a:=1 print(a)}运行程序,输出:#gorun......
  • RSIC-V常用汇编语言及常用数据结构-栈
    这是我在上完浙大刘鹏老师的视频课后做的笔记。我觉得在学完后,自己写出来会记忆会更深刻,因为要重新梳理一遍。同时遇到不会的还可以重新复习以前的知识。程序执行流程:高级语言->汇编语言->逻辑块->数字电路常用汇编语言:1.算数指令和访存指令在汇编语言里面,操作对象是寄存......
  • 【Python技术学习】- python基础语法
    编码默认情况下,Python3源码文件以 UTF-8 编码,所有字符串都是unicode字符串。当然你也可以为源码文件指定不同的编码:#-*-coding:cp-1252-*-上述定义允许在源文件中使用Windows-1252字符集中的字符编码,对应适合语言为保加利亚语、白罗斯语、马其顿语、俄语、塞......
  • Day01.md-Markdown语法讲解
    标题三级标题四级标题字体Hello,Word!Hello,Word!Hello,Word!Hello,Word!引用选择狂神说java,走向人生巅峰分割线图片超链接点击跳转到狂神博客列表ABCABC表格名字性别生日张三男1997.1.1代码......
  • JDBC SQL语法
    结构化查询语言(SQL)是一种标准化语言,允许对数据库执行操作,例如:创建数据记录,读取内容,更新内容和删除数据记录等。本教程中将概述SQL,这是了解和学习JDBC概念的前提条件。经过本章后,您将能够在数据库中创建,创建,读取,更新和删除(通常称为CRUD操作)数据。有关SQL的详细了解,可以阅......
  • markdown语法
    markdown学习标题语法+空格+标题几个#就是几级标题,最高六级如:六级标题+空格+标题字体粗体**+内容+**斜体*+内容+*粗体+斜体***+内容+***删除线()~~+内容+~~引用作用当某段内容出自某人之口或者某篇文章时,使用引用可以方便地把引用的部分分开......
  • 【信息收集】网络空间测绘FOFA,查询语法最全使用方法(图文解析)
    高级搜索基础类别标记类(SpecialLabel)协议类(type=service)网站类(type=subdomain)证书类地理位置(Location)时间类(Lastupdatetime)独立IP语法(独立IP系列语法,不可和上面其他语法共用)查询基础语法案例html搜索title标题搜索domain域名搜索host主机名搜索o......
  • PHP和Composer做语法转换工具
    原文地址:https://www.mengze2.cn/post/5/最近不是把博客的一些文章从和HTML转到Markdown了吗,因为之前换到了wordpress所以是HTML,但是这些文章再typecho无法被解析,于是就打算开发一个Markdown2HTML工具下面使我的开发笔记,可能比较含糊项目结构一般情况下,我不会这么干,但是为了......
  • day15JS-es6的基础语法
     1.严格模式1.1严格模式的使用方法使用方法1:"usestrict";开启严格模式。使用方法2:<scripttype="moaule"></script> 当设置script标签为模块化时,自动启用严格模式。 1.2严格模式的限制1. 要求变量不能重名。//报错"usestrict";vara=2;vara=4; 2.......
  • 技术分享:jsx语法和应用
    首先问问大家对JSX了解多少,可以提几个问题,引发大家的思考和求知欲。然后开始讲 JSX是React架构里的东西,但是不局限于React,它是一种JavaScript的语法扩展,完全是JavaScript内部实现的,所以vue里面也能用。 JSX的优点:JSX执行更快,因为它在编译为JavaScript代码后进行了优化它是......