常用的汇编指令与技巧(收藏)

1.数据传送指令:mov

move r1,r2 /*r1=r2*/

move r1,#4096 /*r1=4096*/

2.大范围的地址读取指令:ldr

ldr r1,=0x123456789 /*r1=0x123456789*/

ldr r1,=label /*获取绝对地址,即label的地址*/

label:

  ……

3.内存访问指令(当ldr后面没有=号时为内存读取指令)

读取指令:ldr

ldr r1 ,[r2,#4] /*将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作*/

ldr r1,[r2],#4 /*将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4*/

ldr pc,_irq /*pc=*(_irq)将标号中的内容放入pc中

_irq:

  .word do_swi

存储指令:str

str r1 ,[r2,#4] /*将r1的值存入地址为r2+4的内存中*/

str r1,[r2],#4 /*将r1的值存入地址为r2的内存中,再将地址加4,r2=r2+4*/

4.批量内存访问指令ldm,stm

格式:ldm {cond} <addresing_mode> <rn> {!} <register list> {^}

   stm{cond} <addresing_mode> <rn> {!} <register list> {^}

格式说明:

1){cond}:表示指令的执行条件,根据cpsr寄存器中的条件标志位决定是否执行该条指令,每条ARM指令包含4bit的条件码域,

可以定义16个执行条件,具体如下表:

2)<addresing_mode>表示地址变化模式,具体如下:

3)<rn> 中保存内存的地址,如果后面加上!,指令执行完成后,rn的值会更新,等于下一个内存的地址,否则保持初始值。

4)<register list>表示寄存器列表,对于ldm指令,从<rn>所对应的内存块中读取数据写入这些寄存器,对于stm把这些寄存器的值写入

<rn>对应的内存块中。如果寄存器地址连续,可以写成r1-rx的格式,不连续的用逗号隔开。^符号有两种含义:如果<register list>有pc寄存器,

它表示指令执行后,spsr寄存中的值将自动复制到cpsr寄存器中--这通常用于中断处理函数的返回;如果没有pc寄存器,那^表示操作的是

用户模式下的寄存器,而不是当前特权模式下的寄存器。

5)指令中<register list>与<rn>的对应关系为:编号低的寄存器对应内存中低地址单元,编号高的寄存器对应内存中高地址单元,具体如下:

扩展:

ldmfd

stmfd

5.算术指令

加指令:add

add r1,r2,#1 /*r1=r2+1*/

减指令:sub

sub r1,r2,#1 /*r1=r2-1*/

乘指令:mul

mul r1,r2,#4 /*r1=r2*4*/

6.程序状态寄存器的访问指令

msr cpsr, r0 /* s<-r,r0的值复制到cpsr中*/

mrs r0,cpsr /*r<-s,将cpsr的值复制到r0中*/

7.相对跳转指令b,bl

1)这两条指令的区别在于bl除了跳转以外,还将返回地址(bl的下一条指令地址)保存在lr寄存器中

2)这两条指令的跳转范围是当前指令前后32M范围内

3)他们是位置无关的指令,相对跳转

e.g:

b fun1

fun1:

  bl fun2

fun2:

  ..............

扩展:绝对跳转 ldr pc,=xxx

直接将要执行的指令地址存入pc中,pc为程序计数器,指向当前指向位置

8.其他指令

比较指令:cmp

cmp r1,r2 /*根据对比的结果设置cpsr寄存器的标志位,参考ARM指令条件码表

逻辑指令

位与:and(相当于&)

and r0,r1,#0xff /*r0=r1&0xff*/

位或:orr(相当于|)

orr r0,r1,#0xff /*r0=r1|0xff*/

清零:bic

bic r0,r0,#0x03 /*将r0中的第一位和第二位清零*/

测试:tst

tst r0,#0x20 /*测试第六位是否为0,为0则将cpsr的Z位置1*/

总结

以上所述是小编给大家介绍的常用的汇编指令与技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    汇编语言是依赖于计算机的低级的程序设计语言. RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位: 如果把进位标志位当作操作数最高位的附加位,那么 RCL 就成了循环左移操作.下面的例子中,CLC 指令清除进位标志位.第一条 RCL 指令将 BL 最高位移入进位标志位,其他位都向左移一位.第二条 RCL 指令将进位标志位移入最低位,其他位都向左移一位: clc                             ; CF = 0 mov bl

  • 16位汇编语言寄存器及指令整理(小结)

    寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI EDI 源目标寄存器 DH,DL DX EDX 基地址寄存器 DH,DL DX EDX 栈顶寄存器 段寄存器 标号 名称 CS 代码段 DS 数据段 SS 栈段 ES 附加数据段 GS,FS 附加数据段(+80386) 专用寄存器 标号

  • 汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植. XOR 指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存放在目标操作数中: XOR dest

  • 汇编语言无效指令错误概述

    问题:cmpxchg8b 指令比较一个8字节值edx和EAX带有8字节值内存( 目的地操作数). 只有有效目标操作数用于此指令是内存 操作数. 如果目标操作数是一个寄存器处理器应产生一个 无效OpCode例外,执行的指令cmpxchg8b应当停止和 处理器应该执行无效OpCode异常处理程序. 此错误发生是 锁定前缀为使用cmpxchg8b指令与一个(无效)寄存器目的地 操作数. 在这种情况下,处理器可能无法启动执行无效OpCode 异常处理程序,因为总线已锁定. 这将导致系统挂起. 提示:如果

  • HTML技巧汇编

    1.怎样定义网页语言(字符集)?            在制作网页过程中,你首先要定义网页语言,以便访问者浏览器自动设置语言,而我们用所见即所得的HTML工具时,都没有注意到这个问题,因为它是默认设置.要设置的语言可以在HTML代码状态下找到: <meta http-equiv="Content Type" content="text/html; charset=gb2312"> 把charset=gb2312改换成其它语言代码即可,比如英文harset

  • 汇编语言指令集之串处理指令讲解

    串处理指令 串处理指令分类情况如下: 指令类型 MOVS move string 传传送 CMPS compare string 串比较 SCAS scan string 串扫描 LODS load from string 从串取 STOS store in to string 存入串 INS input from port to string 串输入 OUTS output string to port 串输出 REP repeat 重复 REPE/REPZ repeat while equa

  • 常用的汇编指令与技巧(收藏)

    1.数据传送指令:mov move r1,r2 /*r1=r2*/ move r1,#4096 /*r1=4096*/ 2.大范围的地址读取指令:ldr ldr r1,=0x123456789 /*r1=0x123456789*/ ldr r1,=label /*获取绝对地址,即label的地址*/ label: -- 3.内存访问指令(当ldr后面没有=号时为内存读取指令) 读取指令:ldr ldr r1 ,[r2,#4] /*将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作*/

  • PHP网站开发中常用的8个小技巧

    PHP是一种用于创建动态WEB页面的服务端脚本语言.如同ASP和ColdFusion,用户可以混合使用PHP和HTML编写WEB页面,当访 问者浏览到该页面时,服务端会首先对页面中的PHP命令进行处理,然后把处理后的结果连同HTML内容一起传送到访问端的浏览器.但是与ASP或 ColdFusion不同,PHP是一种源代码开放程序,拥有很好的跨平台兼容性.用户可以在Windows NT系统以及许多版本的Unix系统上运行PHP,而且可以将PHP作为Apache服务器的内置模块或CGI程序运行. 本

  • 28个JavaScript常用字符串方法以及使用技巧总结

    目录 前言 1. 获取字符串长度 2. 获取字符串指定位置的值 (1)charAt() (2)charCodeAt() 3. 检索字符串是否包含特定序列 (1)indexOf() (2)lastIndexOf() (3)includes() (4)startsWith() (5)endsWith() 4. 连接多个字符串 5. 字符串分割成数组 6. 截取字符串 (1) slice() (2) substr() (3) substring() 7. 字符串大小写转换 (1)toLowerCase

  • 汇编语言:x86汇编指令大全及其注意事项

    目录 Part 1:instruction Part 2 2.1 (逻辑)运算.移位等常用指令 2.1 (逻辑)运算.移位等常用指令 2.2 循环移位指令 2.3 数据串操作指令 2.4 逻辑运算指令 2.5 基于大小关系的跳转指令 2.6 基于单标志位的转移指令 Part 1:instruction 积少成多,持续更新.(这将会是一个极其漫长的过程) 表格中各条指令的顺序根据笔者所认为的重要或常用程度进行排序,仅供参考. Part 2 本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以

  • 汇编语言入门汇编指令及寄存器详解教程

    目录 前言 什么是汇编语言 汇编语言产生的原因 汇编与二进制的关系 寄存器 寄存器作用 存取速度比较 寄存器分类 常用寄存器用途 寄存器EAX.AX.AH.AL的关系 汇编语言指令 数据传送指令 算术运算指令 逻辑运算指令 循环控制指令 转移指令 linux 和 windows 下汇编的区别 总结 前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在

  • 常用Javascript函数与原型功能收藏(必看篇)

    如下所示: // 重复字符串 String.prototype.repeat = function(n) { return new Array(n+1).join(this); } // 替换全部 String.prototype.replaceAll = function(str1, str2) { return this.replace(new RegExp(str1, "gm"), str2); } // 清除空格 String.prototype.trim = function

  • docker指令收集整理(收藏)

    Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案.  1.Docker安装 utuntu中安装docker: apt-get install docker-engine apt-get install docker apt-get install docker.io 其他的系统使用类似的包管理器,centos中使

  • 详解kali linux 常用文件与指令路径

    kali linux 常用文件与指令路径 重启网络 /etc/init.d/networking restart 语言设置文件 /etc/default/locale apt 安装deb保存目录 /var/cache/apt/archives 字体修改目录 /etc/fonts/conf.d 配置更新源文件 /etc/apt/sources.list 配置更多更新源文件,将list文件放入此目录文件 /etc/apt/sources.list.d 配置本机网络lo与eth0接口 /etc/net

  • C 表达式中的汇编指令

    asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifiers 包含了 goto 语句. 第一种形式为常见的用法,AssemblerTemplate 和 OutputOperands 必须存在, 其中 Clobbers 存在需要 InputOperands 也出现. asm asm-qualifiers ( AssemblerTemplate : Outpu

  • 汇编语言伪指令和汇编指令的区别

    [指令语句] 每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句.每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU).存储器.I/O接口等硬件设备来实现的. [伪指令语句] 伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句.例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中

随机推荐