汇编语言的基本指令及基本使用操作

news2024/9/20 7:06:50

一、立即数

        立即数判断规则:
  1. 如果某个数的数值范围是0~255之间,那么这个数一定是立即数;

  2. 把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;

  3. 这个数的二进制序列的右边必须为偶数个连续的 0

例:①0x3f4 = 0000 0000 0000 0000 0000 0011 1111 0100

最高位1至最低位1之间的二进制数序列:1111 1101 从第一个1开始到最后一个1之间没有超过8位

末尾1的右边有2个0,所以0x3f4是立即数

②0x132 = 0000 0000 0000 0000 0000 0001 0011 0010

最高位1至最低位1之间的二进制数序列:1001 1001 从第一个1开始到最后一个1之间没有超过8位

末尾1的右边有1个0,不满足第二条,所以0x132不是立即数

为什么最高位1至最低位1之间的二进制数序列的位数不能超过8位?

  • 因为在ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15),只有8bit常数位,只能存下8位。

为什么立即数的二进制序列的右边必须为偶数个连续的 0

  • 因为在ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15),循环右移位值步进是2,如果是奇数个连续的0,在提取其中的最高位1至最低位1之间的二进制数序列后,移动偶数次无法得到右边奇数个连续0的二进制序列,和立即数的二进制序列不相同。

二、基础汇编指令

1、mov指令

加载立即数到寄存器或转移一个寄存器的值到另外一个寄存器,数字压缩到代码里面

MOV{S}<c> <Rd>, #<const>

eg:mov r0, #2 ;加载立即数2到寄存器r0。

MOV{S}<c> <Rd>, <Rm>

eg:mov r1, r0 ;将r0寄存器的值加载到r1

2、add指令

ADD{S}<c> <Rd>, <Rn>, #<const>

ADDS}<c> <Rd>, <Rn>, <Rm>{, <shift>}

3、sub指令

SUB{S}<c> <Rd>, <Rn>, #<const>

 SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}

4、ldr寄存器加载指令

用于将数据从内存加载到寄存器中,是一条伪指令,将数字放入代码区

LDR{<c>}{<q>} <Rt>, <label> ;

如:ldr r0, =0x2FAB4

ldr指令多用于从ram中将一个32位的字数据传送到目的寄存器中

LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}] 

如:LDR   R0,[R1,#8];将内存地址为R1+8的字数据读入寄存器R0,这里的#8作为12位立即数是可以省略的。

通过r0指向的数将数保存到r1中,此时r0是一个指针

LDR<c> <Rt>, [<Rn>], #+/-<imm12> 

如:ldr r0, [r1], #8 ;将内存地址R1的字数据读入r0,之后r1+8

LDR<c> <Rt>, [<Rn>, #+/-<imm12>]! 

如:LDR   R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

5、bic指定位清零指令

BIC{S}<c> <Rd>, <Rn>, #<const>;

将rn中的字数据const为1的比特清零,把结果放入rd。<const>的反码与<Rn>按位逻辑与

6、orr指定位置位指令:

        ORR{S}<c> <Rd>, <Rn>, #<const>   按位逻辑或

三、指令b,bx,bl的主要区别

b  无条件跳转到指定的标签

bl无条件跳转到指定的标签,并将返回地址保存到链接寄存器(LR,通常是R14)

bx跳转到指定寄存器的地址,并根据地址的最低有效位选择ARM或Thumb状态。

在 ARM 汇编中,SWI(Software Interrupt)指令用于生成软件中断,通常用于请求操作系统服务或调用特定的系统功能。SWI #7 表示生成一个软件中断,传递的参数是 #7。

当执行 SWI #7 时,处理器会跳转到一个预定义的中断处理程序,该程序会根据 #7 的值来执行特定的操作。具体的操作取决于操作系统的实现。例如,在某些系统中,SWI #7 可能被用来请求特定的系统调用,如获取系统时间或处理文件操作。

四、程序状态寄存器

(1)条件码标志

N、Z、C、V,最高4位称为条件码标志。ARM的大多数指令可以条件执行的,即通过检测这些条件码标志来决定程序指令如何执行。

各个条件码的含义如下:

N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0。

Z:如果结果为0,则Z=1;如果结果为非零,则Z=0。

C:其设置分一下几种情况:

               对于加法指令(包含比较指令CMN),如果产生进位,则C=1;否则C=0。

               对于减法指令(包括比较指令CMP),如果产生借位,则C=0;否则C=1。

               对于有移位操作的非法指令,C为移位操作中最后移出位的值。

               对于其他指令,C通常不变。

V:对于加减法指令,在操作数和结果是有符号的整数时,如果发生溢出,则V=1;如果无溢出发生,则V=0;对于其他指令,V通常不发生变化。

五、C语言和汇编语言的调用

调用函数时所传递的参数是:r0 r1 r2 r3作为前四个参数;第五个参数以后通过栈来传递。返回值通过r0传递。pop push,

谁调函数,谁保护现场恢复现场

六、三种模式切换及异常处理

	preserve8
	area reset, code, readonly
	code32
	entry

	b start
	ldr pc, =do_undifined
	ldr pc, =do_swi
	ldr pc, =do_p_abort
	ldr pc, =do_d_abort
    nop
	ldr pc, do_irq
	ldr pc, do_fiq
	

do_fiq
	b do_fiq	

do_irq
	import irq_handler
	sub lr, lr, #4
	stmfd sp!, {r0-r12, lr}
	bl  irq_handler
	ldmfd sp!, {r0-r12, pc}^

do_d_abort
	b do_d_abort

do_p_abort
	b do_p_abort

do_swi
	import swi_handler
	stmfd sp!, {r0-r12, lr}	   ;入栈,保护现场
	bl  swi_handler
	ldmfd sp!, {r0-r12, pc}^   ;出栈,恢复现场,并切换回原来的工作模式

do_undifined
	b  do_undifined

start
	ldr sp, =0x40001000 ;svc_sp

	mrs r0, cpsr
	bic r0, r0, #0x1F
	orr	r0, r0, #0x12
	bic r0, #(1 << 7)		   ;中断禁止位,禁止irq
	msr cpsr_c, r0

	ldr r0, =0x40001000
	sub r0, r0, #1024
	mov sp, r0

	mrs r0, cpsr               ;读
	bic r0, r0, #0x1F		   ;irq到user模式
	orr r0, r0, #0x10
	msr cpsr_c, r0             ;写

	ldr r0, =0x40001000
	sub r0, r0, #2048
	mov sp, r0
	
	import main
	b main

asm_fn
	export asm_fn
	swi #7
	bx lr

finished
	b finished

	end
extern void asm_fn(void);

void swi_handler(void)
{
	
}

void irq_handler(void)
{
	
}

int main(void)
{
	while(1)
	{
		
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-Day02学习

Java-Day02 一维数组 1.声明数组 int[ ] a; //声明数组时不规定数组长度 2.分配空间 a new int[5]; //分配空间: 告诉计算机分配几个连续的空间。eg:scores new int[30]; avgAge new int[6]; name new String[30]; 3.赋值 a [0] 8; //向分配的格子里放数…

结构体易忘点

结构体初始化 当我们去初始化一个结构体的时候&#xff0c;我们常常会按变量顺序初始化&#xff0c;但其实也可以不按顺序&#xff0c;同时也可以部分数据初始化。 结构体对齐 结构体里面的成员有一定的对齐规则&#xff0c;他不是每一个空间都存着有效数据的&#xff0c;有些…

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…

小米机型“工程固件” 小米13工程资源预览 写入以及nv损坏修复

目前各大品牌机型中。可以录数于小米机型的工程固件最全 最多。这个也由于小米机型的加密机制比较特殊 。每款新机型发布后不久。工程包就会出现。从小米5起始以及红米note4起始都有工程固件。另外在维修行业中。米系机型更换cpu都需要先写入对应的绑定包。然后才可以写入官方m…

C++竞赛初阶L1-16-第七单元-字符串(36~37课)559: T456513 统计数字字符个数

题目内容 输入一行字符&#xff0c;统计出其中数字字符的个数。 输入格式 一行字符串&#xff0c;总长度不超过 255。 输出格式 输出为 1 行&#xff0c;输出字符串里面数字字符的个数。 样例 1 输入 Today is 2021-03-27 样例 1 输出 8 程序代码输出&#xff1a; #i…

idea多模块启动

文章目录 idea多模块启动2018版本的idea2019版本的idea idea多模块启动 2018版本的idea 1.首先看一下view> Tool Windows下有没有Run Dashboard 如果有&#xff0c;点击一下底部的窗口就会出现 如果不存在&#xff0c;执行下一步 2.查看自己项目的工作空间位置 点击 File&…

获取参数

获取querystring参数 querystring 指的是URL中 ? 后面携带的参数&#xff0c;例如&#xff1a;http://127.0.0.1:9090/web?query杨超越。 获取请求的querystring参数的方法如下&#xff1a; 方法1&#xff1a; Query package main// querystringimport ("github.com/…

如何通过IntelliJ IDEA 创建HTML项目

1、什么是IDEA? IntelliJ IDEA 是 JetBrains 开发的一款集成开发环境(IDE),主要用于 Java 编程,但也支持其他编程语言如 Kotlin、Groovy 和 Scala。它的特点包括智能代码补全、代码重构、集成版本控制、调试工具和丰富的插件支持。IDEA 提供了一个直观的用户界面,帮助开发…

ffmpeg面向对象——参数配置秘密探索及其设计模式

ffmpeg支持很多参数配置——拉流配置推流配置等等——那么庞大繁杂的配置项&#xff0c;如果是你&#xff0c;该如何实现呢&#xff1f; 其实看过一点点源码&#xff08;不用全部&#xff09;后发现&#xff0c;就是它的实现也是遵循一个朴素的思想——所谓“大道至简”&#x…

用 Delphi 实现一个基本的网页邮件抓取和发送功能

如何用 Delphi 实现一个基本的网页邮件抓取和发送功能。以下示例仅作为概念验证&#xff0c;实际应用中需要考虑更多的细节和技术问题。 示例&#xff1a;从简单网页抓取邮件并发送 1. 环境准备 假设你已经安装了 Delphi&#xff0c;并且安装了 Indy 组件库。Indy 是一个用于…

用Python提取PowerPoint演示文稿中的音频和视频

将多种格式的媒体内容进行重新利用&#xff08;如PowerPoint演示中的音频和视频&#xff09;是非常有价值的。无论是创建独立的音频文件、提取视频以便在线分发&#xff0c;还是为了未来的使用需求进行资料归档&#xff0c;从演示文稿中提取这些媒体文件可以为多媒体内容的多次…

linux 系统是如何收发数据包

目录 1. 背景 1.1 协议栈的构成 1. 应用层: 2. Socket 层: 3. 传输层 (TCP/UDP): 4. 网络层 (IP): 5. 数据链路层 (MAC): 6. 物理层 (网卡驱动): 1.2 数据包的组成 2. 接收网络数据包的流程 2.1 数据包接收流程概述 2.2 详细步骤说明 2.2.1 网卡接收数据包 2.2.2…

JVM 虚拟机的编译器、类加载过程、类加载器有哪些?

JVM 虚拟机的编译器 编译器可以分为&#xff1a;前端编译器、JIT 编译器、AOT编译器。 前端编译器&#xff1a;源代码 --> 字节码 在Java语言中&#xff0c;JDK安装目录中的javac就是编译器。它负责将Java源代码编译为字节码。因为处于编译的前期&#xff0c;javac也叫做前…

C语言 | Leetcode C语言题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; static const int dirs[4][2] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};void bfs(int row, int col, bool ** ocean, const int ** heights, int m, int n) {if (ocean[row][col]) {return;}ocean[row][col] true;int * queue (int *)malloc…

如何安装和注册 GitLab Runner

如何安装和注册 GitLab Runner GitLab Runner 是一个用于运行 GitLab CI/CD (Continuous Integration/Continuous Deployment) 作业。它是一个与 GitLab 配合使用的应用程序&#xff0c;可以在本地或云中运行。Runner 可以执行不同类型的作业&#xff0c;例如编译代码、运行测…

有效安全计划评估的基本指标

衡量安全计划成功与否的最有效指标是什么&#xff1f; 最直接的指标是&#xff1a;您的组织是否遭到入侵&#xff1f;如果答案是肯定的&#xff0c;那么显然还有工作要做。如果答案是否定的&#xff0c;那么您的状况就更好了——但情况比这更复杂。 即使您没有遭到入侵&#…

视频理解大模型最新进展

文章目录 Video-LLaMAVision-Language BranchAudio-Language Branch Video-ChatGPTMiniGPT4-videoCogVLM2-Video&#xff08;1&#xff09;Pre-training&#xff08;2&#xff09;Post-training Qwen2-VLMA-LMMChat-UniVi大模型对比 Video-LLaMA 2023&#xff1a;阿里达摩院的…

JAVA虚拟机----JVM

(一)认识JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 &#xff08;二&#xff09;JVM运…

2017年国赛高教杯数学建模C题颜色与物质浓度辨识解题全过程文档及程序

2017年国赛高教杯数学建模 C题 颜色与物质浓度辨识 比色法是目前常用的一种检测物质浓度的方法&#xff0c;即把待测物质制备成溶液后滴在特定的白色试纸表面&#xff0c;等其充分反应以后获得一张有颜色的试纸&#xff0c;再把该颜色试纸与一个标准比色卡进行对比&#xff0c…

如何查看电脑什么时候被人动过及看过的文件?

一、查看Windows事件查看器 Windows系统具有强大的日志记录功能&#xff0c;通过“事件查看器”可以查看电脑的使用记录。具体步骤如下&#xff1a; 按下Win R组合键打开运行窗口&#xff0c;输入eventvwr.msc命令并回车&#xff0c;打开事件查看器。 在事件查看器中&#x…