用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

这篇具有很好参考价值的文章主要介绍了用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARM 编程模拟器

ARM 编程模拟器网站地址:

https://cpulator.01xz.net/?sys=arm-de1soc

在arm里也有和高级语言一样的for和while循环,可以根据条件来判断是否执行

带有分支的循环

首先我们创建一个data标签,然后在里面写一个分支,存放一些数值,然后使这些存放的数值依次相加

.global _start
_start:
	
.data   //data段,用于存放数据
list:   //定义的变量名
	.word 1,2,3,4,5,6,7,8,9,10  //.word:告诉程序每一个值都是word类型,大小为32位,用于存放数据

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

然后我们要将list加载到内存里

.global _start
_start:
	ldr r0,=list  //ldr:将data段里list中的数据加载到r0寄存器中
	 
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

然后使用直接寻址,将r0寄存器里的值放到r1寄存器里

.global _start
_start:
	ldr r0,=list
	ldr r1,[r0]   //汇编程序寻找r0寄存器地址中的值,移动到r1寄存器里
	
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

然后我们可以使用加法,将第一个值添加到r2寄存器里

.global _start
_start:
	ldr r0,=list
	ldr r1,[r0]   
	add r2,r2,r1  //r2 = r2 + r1 
	
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

现在按f5执行程序,看看内存里是什么样子的

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

存放的都是list里的值,1-10,之后就都是aaaaaaaa,aaaaaaaa的意思是内存中空闲的位置,我们可以利用这个aaaaaaaa,使遍历列表的时候告诉程序这就是列表的末尾了

我们可以将aaaaaaaa存放到某个变量里,但是在arm里,存放的值只能是特定大小,大小为两个十六进制值,明显aaaaaaaa大于了两个十六进制,这里我们就要使用常量了

常量很简单,在程序顶端输入.equ就可以定义了,我们可以给他一个名称和值,这和高级语言中定义常量的方法相同

.global _start
.equ endlist,0xaaaaaaaa   //定义一个常量,名称为endlist,内容为0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r1,[r0]   
	add r2,r2,r1
	
	
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

然后可以使用ldr将其加载到内存中

.global _start
.equ endlist,0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r3,=endlist   //加载到r3寄存器中,之后写循环时方便利用
	ldr r1,[r0]   
	add r2,r2,r1
	
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

之后我们就可以开始写循环了,首先创建一个loop标签,加载list里的值

.global _start
.equ endlist,0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r3,=endlist
	ldr r1,[r0]   
	add r2,r2,r1
loop:
	ldr r1,[r0,#4]!   //r0寄存器里的值偏移4字节,移动到r1寄存器里,然后他会查看内存中的那个位置是否是空的,之后将值存放在这里

.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

然后我们比较两个r1,r3,如果他们相等,我们就离开循环

.global _start
.equ endlist,0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r3,=endlist
	ldr r1,[r0]   
	add r2,r2,r1
loop:
	ldr r1,[r0,#4]!
	cmp r1,r3   //比较这两个寄存器
	beq exit   //小于等于则调用exit标签
	
.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

然后创建一个exit标签,不用写内容,他的作用就是程序的出口点

.global _start
.equ endlist,0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r3,=endlist
	ldr r1,[r0]   
	add r2,r2,r1
loop:
	ldr r1,[r0,#4]!
	cmp r1,r3
	beq exit
	
exit:  //exit标签

.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

如果我们还没达到list的末尾,我们可以添加值到r2寄存器里,然后再次循环直到到达末尾

.global _start
.equ endlist,0xaaaaaaaa
_start:
	ldr r0,=list
	ldr r3,=endlist
	ldr r1,[r0]   
	add r2,r2,r1
loop:
	ldr r1,[r0,#4]!
	cmp r1,r3
	beq exit
	add r2,r2,r1  // //r2 = r2 + r1 
	bal loop  //然后通过跳转指令建立一个无限循环,直到r1和r3相等,到达list末尾
exit:

.data
list:
	.word 1,2,3,4,5,6,7,8,9,10

这就是一个完整的循环,作用是遍历list,使里面的值依此相加
之后运行程序

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

然后进入循环,在循环10次后退出程序

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行
用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

1到10相加就等于55

条件指令执行

条件指令可以根据运算结果更新的条件标志,来判断指令的条件码是否符合条件,符合条件就执行,不符合条件则不执行

现在我们随便在寄存器里放一些值,然后比较

.global _start
_start:
	mov r0,#2
	mov r1,#4
	cmp r0,r1

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

如果r0小于r1,就在r2寄存器里放入一个值

.global _start
_start:
	mov r0,#2
	mov r1,#4
	cmp r0,r1
	blt addr2   //如果r0小于r1,就调用addr2标签

addr2:
	add r2,#1  //r2+1

然后设置一个退出程序的出口

.global _start
_start:
	mov r0,#2
	mov r1,#4
	cmp r0,r1
	blt addr2
	bal exit  //跳转到exit标签里

addr2:
	add r2,#1
	
exit:

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

仅仅实现这么简单的一个功能,需要的代码也太多了,有没有其他方法呢,我们可以使用条件指令来少写一些代码

还是随便在寄存器里放一些值然后比较

.global _start
_start:
	mov r0,#2
	mov r1,#4
	cmp r0,r1

之后可以使用addlt指令

addlt:意思是加小于(+<),这个指令只会触发比较结果小于的情况
.global _start
_start:
	mov r0,#2
	mov r1,#4
	cmp r0,r1
	addlt r2,#1

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

只用四行代码就实现了上面的功能,我们执行看看

用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行

可以看到,确实实现了我们想要的功能

比如还有movge……很多组合,这样可以使程序更加简洁

movge:比较结果是大于等于之后进行移动操作

总结

这是我学习的笔记,有什么错误和不懂的地方欢迎来私信我,或者加我qq文章来源地址https://www.toymoban.com/news/detail-461921.html

到了这里,关于用ARM进行汇编语言编程(4)带有分支的循环和条件指令执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基础汇编语言编程

    目录 什么是汇编语言? 工程搭建 新建工程 环境设置  测试是否成功  正式学习汇编语言 数据处理指令 填充,加,减,乘  思考:我们可以看到R0寄存器可以存放8位十六进制数,那么0x12345678能不能用mov存入? 与,或,异或,左移,右移 思考:UART通信过程中为什么数据位规

    2024年02月08日
    浏览(25)
  • 汇编语言中断编程步骤

    1、调用movsb指令将中断处理程序载入内存的指定位置; 1)使用offset指令计算doIntEnd-doInt获取中断处理程序的代码长度; 2)doIntEnd位置使用nop指令。 2、修改中断向量表项为指定位置; 1)使用word ptr确定内存单元; 2)使用es=0来定位中断向量表首地址。 3、编写中断处理程序。

    2024年02月07日
    浏览(28)
  • Keil MDK配置ARM汇编/C语言混合开发环境

    1. 安装Keil MDK 安装方法这里不再说明,懂得都懂!🐶 2. 安装ARM开发包 在Keil MDK5之后,不再原生支持ARM7/9,需要自行安装软件包,链接在这,注意安装与自己MDK版本对应的那个包 我的版本是5.18,下载之后傻瓜式安装,因为它会自动检测你MDK所在的位置。 3. 新建工程 注意:选

    2024年02月02日
    浏览(47)
  • ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】

    2023-4-14 19:30:55 以下内容源自《创作模板三》 仅供学习交流使用 ARM简单程序设计【嵌入式系统】 第一点 关于 号 不会有人不知道? 我流程图中写的 R3=nums 是什么意思吧? 请看下面C语言程序 回答 号是 取地址 的意思哦 第二点 关于说明中的 R0++ 说明 此处R0用来遍历数组的指针

    2023年04月15日
    浏览(32)
  • 从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

       本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记,计划从RISC-V的底层汇编指令学起,结合C语言,在Ubuntu 20.04上开发一个简易的操作系统。一个目的是通过实践操作学习和了解什么是操作系统,第二个目的是为之后学习RISC-V的集成电路设计打下一定基础

    2024年01月25日
    浏览(29)
  • 汇编语言笔记(一)——汇编语言基础

    一、开发环境 我使用visual studio 2022 preview,其他版本的设置大同小异。 第一步: 打开visual studio,点击“创建新项目”: 第二步: visual studio并没有专门的汇编项目,所以需要挂羊头卖狗肉,选择C++空项目 第三步: 输入项目名称,点击创建 第四步: 鼠标右键单击项目名称—

    2024年02月05日
    浏览(29)
  • 汇编语言—常见汇编指令汇总

    mov    寄存器 ,数据                如:mov ax ,8 mov   寄存器,寄存器              如:mov ax,bx mov   寄存器,内存单元          如:mov ax,[0] mov   内存单元,寄存器          如:mov [0],ax mov   段寄存器,寄存器          如:mov ds,ax add   寄存器,数据

    2024年02月10日
    浏览(27)
  • 5.8 汇编语言:汇编高效除法运算

    通常情况下计算除法会使用 div/idiv 这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但Release模式下,除法运算指令会被特定的算法经过优化后转

    2024年02月11日
    浏览(30)
  • 5.6 汇编语言:汇编高效数组寻址

    数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包