汇编-数据处理指令-笔记

合集下载

汇编语言寄存器和指令操作的整理

汇编语言寄存器和指令操作的整理
l DI 目的变址寄存器
与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能
段寄存器l CS 代码段
存放当前程序的指令代码
l DS 数据段
存放程序所涉及的源数据或结果
l SS 堆栈段
当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负
6. TF 跟踪标志位
用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断
7. IF 中断允许标志位
l POP DST ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字
l XCHG OPR1, OPR2 ;交换指令: 将这两个操作数交换
地址传送指令:
l LEA DST, SRC ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中
算术运算指令加法指令:
l ADD DST, SRC ;DST+SRC的和存放到DST中去
l ADC DST, SRC ;带进位加法指令, DST+SRC+CF
l INC DST ;增1指令
减法指令:
l LOOPZ/LOOPE, LOOPNZ/LOOPNE ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件
子程序调用指令:
l imme: 立即数
l DST: 目的操作数
l SRC: 源操作数
l mem: 存储器操作数

DSP汇编指令学习笔记

DSP汇编指令学习笔记

Knowledge问题谁在DSP的汇编语言中加入了NOP指令?NOP指令加入的条件是什么?About DSP1.DSP是实时数字信号处理的核心和标志。

2.DSP分为专用和通用两种类型。

专用DSP一般采用定点数据结构(一般不支持小数),数据结构简单,处理速度快;通用DSP灵活性好,但是处理速度有所降低。

3.DSP采用取指、译码、执行三个阶段的流水线(Pipeline)技术,缩短了执行时间,提高了运行速率。

DSP具有8个Functional unit,如果并行处理的话,以600MHz的时钟计算,如果执行的指令是single cycle指令,则可以4800MIPS(指令每秒)。

4.DSP的8个functional Unit,具有独特的功能,对滤波、矩阵运算、FFT(傅里叶变换)具有哈弗结构把指令空间与数据空间隔离的存储方式。

这样实现是为了实现指令的连续读取,而实现pipeline流水线结构。

传统哈弗结构:两个独立的存储空间,还使用独立总线。

让取指与执行存储独立,加快执行速度。

改进型哈弗结构:指令与数据的存储空间还是独立的。

但是使用公共的总线(地址总线与数据总线)。

这样实现的原因是因为出现了CACHE,数据的存储动作大部分被内部的CACHE 总线承接了,所以总线冲突的情况会大大减少。

同时让总线的结构与控制变得简单,CACHE 存储的速度也明显快于外设存储器。

冯诺依曼结构:是指令空间与数据空间共享的存放方式。

它不能实现pipeline的执行过程。

Pipeline(流水线)技术是把指令的取指-译码和指令的执行独立开来的技术。

虽然每条指令的过程还是要经过取指-译码-执行三个阶段最少3个CPU Cycle。

但是多个指令同时并行先后进行,保证总体的指令吞吐速率理想情况下可以保证在每个指令只要一个CPU CYCLE。

Pipeline技术必须要有哈弗结构支持,即必须把指令空间与数据空间隔离存放。

流水线阻断流水线中阻断现象也十分普遍,下面就各种阻断情况下的流水线性能进行详细分析。

51单片机汇编指令及伪指令小结

51单片机汇编指令及伪指令小结

51单片机汇编指令及伪指令小结51单片机汇编指令及伪指令小结51单片机是一种广泛应用的基于汇编语言的微控制器。

它的汇编指令集非常丰富,包括了基本的数据处理、逻辑运算、分支跳转、数据存储和输入输出等指令。

汇编指令的灵活运用可以实现各种复杂的功能,因此掌握51单片机的汇编指令是开发嵌入式系统的重要基础。

1. 基本数据处理指令51单片机汇编指令集包括了一系列基本的数据处理指令,如加法(add)、减法(sub)、乘法(mul)、除法(div)等。

这些指令用于实现对数据的基本运算操作。

2. 逻辑运算指令逻辑运算指令用于实现各种逻辑运算,如与(and)、或(or)、非(not)、异或(xor)等。

这些指令通常用于处理数据的开关控制、状态判断等功能。

3. 分支跳转指令分支跳转指令用于实现程序的流程控制。

常用的分支跳转指令包括无条件跳转(jmp)、条件跳转(jz、jnz、jc、jnc等)、循环跳转(loop)等。

这些指令可以根据条件和需求设置程序的执行流程,实现各种循环、分支等功能。

4. 数据存储指令数据存储指令用于实现数据的存储和加载操作。

常用的存储指令包括将数据存储到寄存器或内存中(mov)、将数据从寄存器或内存中加载(ld)等。

这些指令通过对数据的存储和加载,实现对数据的读写操作。

5. 输入输出指令输入输出指令用于实现与外设的数据通信。

常用的输入输出指令包括从端口输入(instr)、输出到端口(outstr)等。

这些指令通过与外部设备的数据交互,实现嵌入式系统与外设的连接。

除了以上的基本指令外,51单片机还提供了一些伪指令,用于程序的组织和调试。

这些伪指令包括宏指令、条件编译指令、调试指令等。

1. 宏指令宏指令是一种通过宏展开的方式来扩展汇编代码的指令。

它通过提前定义一些宏,并在代码中使用这些宏来生成更复杂的汇编代码。

宏指令的好处是可以简化代码的书写,使得程序的逻辑更清晰。

2. 条件编译指令条件编译指令用于根据编译时的条件来选择性地编译代码。

second汇编指令用法 -回复

second汇编指令用法 -回复

second汇编指令用法-回复[second汇编指令用法]汇编语言是计算机硬件能够直接识别和执行的一种低级语言。

在汇编语言的指令集中,有许多常用的指令,其中包括了一些用于处理数据的指令,也就是我们所说的"数据处理指令"。

其中,"second"指令是一种常用的数据处理指令,用于将操作数中的秒部分提取出来。

本文将以"second"指令为主题,详细介绍其用法和实际应用。

第一部分:指令介绍"second"指令是一种简单易用的指令,它用于将参数中的时间值的"秒"部分提取出来。

该指令的语法如下所示:second operand1, operand2其中,"operand1"表示要提取秒数的时间值,"operand2"表示将提取的秒数存储的寄存器或内存地址。

第二部分:用法解析1. "second"指令的操作数类型"second"指令的操作数可以是寄存器、内存地址、立即数等。

2. 操作数的格式和数据类型在使用"second"指令时,操作数的格式应与运行环境和数据类型相匹配。

例如,如果操作数是寄存器,那么应该使用正确的寄存器名称。

3. "second"指令的执行过程当执行"second"指令时,计算机会去除时间值中的"分钟"和"小时"部分,然后将剩余部分存储到指定的寄存器或内存地址中。

第三部分:实际应用案例以下是一个实际应用案例,演示如何使用"second"指令来提取秒数,并将其存储到寄存器BX中。

section .datatime db '12:34:56' ; 定义一个包含时间值的字符串section .textglobal _start_start:mov esi, time ; 将时间值的内存地址存储到ESI寄存器中mov cl, [esi+6] ; 获取时间值中的秒部分并存储到CL寄存器中mov ah, 0 ; 将AH寄存器清零mov al, cl ; 将AL寄存器设置为秒数mov bx, ax ; 将AX寄存器的值存储到BX寄存器中mov eax, 1 ; 设置系统调用号为1(exit)xor ebx, ebx ; 设置返回值为0int 0x80 ; 调用系统中断在上述示例代码中,我们首先定义了一个包含时间值的字符串,接着通过将其内存地址存储到ESI寄存器中,从而将其作为"second"指令的操作数。

学习笔记-汇编-两个16位数字相加获得32位数字

学习笔记-汇编-两个16位数字相加获得32位数字

学习笔记-汇编-两个16位数字相加获得32位数字使⽤的是MASM编译在XP环境下 command内 debug 调试的啥也不说上代码!!assume cs:code,ds:datadata segmentdw 0fa12h,0fdffhdata endscode segmentstart:mov ax,datamov ds,ax ;设置数据段mov ax,0h ;清零mov bx,0h ;清零mov al,ds:[0] ;fa12低位mov bl,ds:[2] ;fdff低位add ax,bx ;两个8位数字相加 ah ⾼位存储进位的数mov ds:[0],al ;将低位结果存到ds[0]mov al,ah ;将进位数存⾄ax低位mov ah,0h ;⾼位清零xor bx,bx ;bx清零mov bl,ds:[1]add ax,bx ;数字1⾼位与进位数相加mov bl,ds:[3]add ax,bx ;数字2⾼位与进位数相加mov ds:[1],ax ;⾼位相加后的数据放⾄ds[1];⾼位相加可能是8位也可能是16位int 21hcode endsend start主要思路就是在16位寄存器⾥⾯计算两个⼋位数字的和将进位的数保存⾄⾼位可以依次扩展⾄ 32位 64位等等闲来⽆事最近看了⼀点汇编的知识课本上都是⼀些 mov add之类的操作但是都没有任何实际的⽤途第⼀次发帖来博客园也有好⼏年时间了⼀直都处于潜⽔阶段看各位⼤侠再次⾼谈阔论看的⼩弟也是蠢蠢欲动终于忍不住写下了⼀点微薄见解忘在此结实各路英雄豪杰。

32位汇编语言学习笔记3leal和算术运算指令

32位汇编语言学习笔记3leal和算术运算指令

32位汇编语言学习笔记3leal和算术运算指令32位汇编语言学习笔记在学习汇编语言的过程中,我们已经了解了一些基本指令和寄存器的用法。

本文将继续介绍两个重要的指令:leal指令和算术运算指令。

通过深入了解和学习这两个指令,我们将更好地理解和掌握汇编语言编程的技巧和方法。

一、leal指令leal指令用于将一个有效地址(Effective Address,EA)加载到目标操作数中。

它的一般格式为:leal Source, Destination。

在这个指令中,Source表示源操作数,可以是寄存器、内存或立即数。

Destination表示目标操作数,只能是寄存器。

leal指令在源操作数的基础上进行计算,将计算结果存储到目标操作数中。

下面是一些leal指令的示例:1. leal (%eax,%ebx,4), %edx这条指令将地址(%eax + %ebx * 4)的结果存储到%edx寄存器中。

其中,%eax是个基址寄存器,%ebx是个变址寄存器,4表示缩放因子。

2. leal -8(%ebp), %ecx这条指令将地址(%ebp - 8)的结果存储到%ecx寄存器中。

其中,%ebp是个基址寄存器,-8是个偏移量。

需要注意的是,leal指令只能进行地址计算,并将结果存储到目标操作数中,不能进行实际的加载操作。

二、算术运算指令在汇编语言中,算术运算指令主要用于进行数值的计算和操作。

常见的算术运算指令包括add、sub、mul、div等。

这些指令可以对数据寄存器和内存中的数据进行四则运算。

下面是一些常用的算术运算指令及其示例:1. add指令:用于将两个操作数相加,并存储结果到目标操作数中。

一般格式为:add Source, Destination。

示例:add %eax, %ebx这条指令将%eax和%ebx寄存器中的值相加,结果存储到%ebx中。

2. sub指令:用于将第一个操作数减去第二个操作数,并将结果存储到目标操作数中。

汇编语言学习笔记

汇编语言学习笔记

汇编语言学习笔记《汇编语言》--王爽前言学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。

原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。

第一章基础知识有三类指令组成汇编语言:汇编指令;伪指令;其他符号。

8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。

1.1节--1.10节小结(1)汇编指令是机器指令的助记符,同机器指令一一对应。

(2)每一种cpu都有自己的汇编指令集。

(3)cpu可以直接使用的信息在存储器中存放。

(4)在存储器中指令和数据没有任何区别,都是二进制信息。

(5)存储单元从零开始顺序编号。

(6)一个存储单元可以存储8个bit,即八位二进制数。

(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。

也可以说,这些管脚引出总线。

一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。

地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。

监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。

对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。

这个逻辑存储器即是我们所说的内存地址空间。

第二章寄存器(cpu的工作原理)mov ax, 2add ax, axadd ax, axadd ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器;段地址*16+偏移地址= 物理地址的本质含义内存并没有分段,段的划分来自cpu。

汇编学习笔记(13)-宏指令(MASM)

汇编学习笔记(13)-宏指令(MASM)

汇编学习笔记(13)-宏指令(MASM)结构说明: 是⼀堆数据的定义的集合基本格式: 结构名称 STRUC 字段的定义 结构名称 ENDS 举例: STUDENT STRUC ID DW ? SCORE DB 1 NAME DB 'STUDENTNAME' STUDENT ENDS定义变量: 变量名结构类型 < 参数表 > 举例: S1 STDUENT <1,50,'zhao'> S2 STDUENT <1,60,'zhang'> S3 STDUENT <1,70,'wang'>结构使⽤: 1. MOV AX, P1.ID 2. MOV BX, OFFSET P1 MOV AL, [BX].SCORE总结: 使⽤起来还是和C/C++ 的结构⽐较类似的,实际上 P1.ID 和 [BX].SCORE 的两种引⽤⽅式本质上是汇编器帮我们转换了地址。

记录说明: 结构是将将⼀堆定义结合起来,⽅便管理,那么记录就是讲⼀个字或者⼀个字节拆分成各种按照位的定义 实际上记录就是⼀个字或者字节的按位定义,所以长度最长不超过16位,右对齐。

基本格式: 记录名称 RECORD 字段1:位宽=初始值,字段2:位宽=初始值,…. 举例: ABCD RECORD AA:5=12, BB:3=6, CC:4=3 内存结构: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 aa aa aa aa aa bb bb bb cc cc cc cc定义变量: 变量名结构类型 < 参数表 > 举例: S2 ABCD <1,2,3> S1 ABCD <1,2,3> S3 ABCD <3,2,1>记录使⽤: WIDTH 返回⼀个记录整体的位宽或者⼀个字段的位宽 MOV AX, WIDTH ABCD MOV AX, WIDTH AA MASK 返回对应字段的掩码 MOV BX, MASK AA; BX = 0001111100000000B总结: 和结构的功能有点类似,相当于在字节尺度尺度上的结构定义,相当于定义标志位,⽽MASK 就是提取标志位的掩码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据处理指令1.数据传送(MOV MVN)2.算术运算(ADD ADC SUB SBC RSB RSC)3.位运算(AND ORR EOR BIC)4.比较测试(CMP CMN TST TEQ)操作码{条件码}S 目标寄存器,第一源操作数,第二源操作数1.数据传送指令无第一源操作数2.比较测试指令无目标寄存器3.比较测试指令不加S,结果影响NZCV4.第一源操作数是寄存器5.第二源操作数有:8位图立即数,寄存器,寄存器移位(LSL,LSR,ASR,ROR,RRX)6.S:1.目标寄存器为PC,CPSR=SPSR2.目标寄存器不为PC,结果影响NZCV7.加法,C进位,有进位,C=1,无进位,C=08.减法,C借位,有借位,C=0,无借位,C=11-10累加和arm-linux-as -g -o sum.o sum.s arm-linux-ld -e _start -o sum sum.oqemu-arm -g 1234 sumarm-linux-gdb sum最大公约数的求解20=5X412=3X4= 2X4R0=20R1=12R0==R1?20!=12R0=R0-R1=20-12=8R1=R1-R0=12-8=4R0=R0-R1=8-4=4while(R0 != R1){if(R0 >= R1){R0 = R0 – R1;}else{R1 = R1 – R0;}}跳转指令数据处理指令(传送,加法,减法,位运算,比较测试)mov r1, #0x56从存储器中获得,怎么办?加载指令:将数据从存储器中读到寄存器存储指令:将处理完毕的数据(寄存器)存储回存储器实现了寄存器与存储器之间的数据交互单寄存器多寄存器单寄存器字和无符号字节的加载,存储指令单寄存器的字加载指令LDR{cond} Rd, <地址模式> 功能:将指定地址单元<地址模式>的字数据读入Rd中。

单寄存器的无符号字节加载指令LDR{cond}B Rd, <地址模式> 功能:将指定<地址模式>地址单元中的字节数据读入Rd中,字节数据放在Rd的低8位,高24bit用0填充<地址模式>:数据来源Rd:目标寄存器示例LDR R1, [R2]R2=0x20008000R1是0x20008000地址中的数据LDR PC, [R0, #8]LDRB R1, [R2], #1R2=0x20008000 0x56R1=0x56R2=R2+1=0x20008001LDR R1, [PC, R3]LDR R1,[R2, R3, LSL #2]LDREQB R1,[R2, R3]LDR R0, [R0, #8]! @×基址与目标寄存器不一样单寄存器字和无符号字节存储指令语法格式STR{cond} Rd, <地址模式>功能:将Rd寄存器的字数据存储到由<地址模式>指定的地址中STR{<cond>}B Rd, <地址模式>功能:将寄存器中一个字节数据保存到<地址模式>指定的地址中Rd:源寄存器<地址模式>:数据需要存储到的目标地址示例STR R1, [R2]STR R1, [R2], #1STR R1, [R2, R3]STRB R0, [R1, R2, ASR #2]STREQB R0, [R1, R2, LSL #2]STR PC, [R0, #8] [PC, #8] 单元内容STR R0, [R0, #8]! @×1 .零偏移LDR R0, [R1] //将R1指定的地址中的数据加载到R0R0=0xe92d48002. [<Rn>, #+/-<offset_12>] 偏移量为立即数(12bit)LDR R0, [R1,#0x8] ;R0<-[R1+0 x8]LDR R0, [R1, #-0x20] ; R0<- [R1 –0x20]R0=0xe59f30603. [<Rn>, +/-<Rm>] 偏移量为寄存器LDR R0,[R1, R2] ;R0<-[R1+R 2]LDRR0,[R1,-R2] ;R0 <-[R1-R2]4. [<Rn>, +/-<Rm>, <shift> #<shift_imm>] 偏移量为寄存器移位LDR R0,[R1 ,R2,LSL#2] ;R0<-[R1+R2*4]5. [<Rn>, #+/-<offset_12>]!LDR R0,[R1, #0x8]! ;R0<-[R1+0x8] R1=R1+81.先加载数据2.改变基址6. [<Rn>, +/-<Rm>]!LDRR0,[R1,R2] ! ;R0<-[R1+R2] R1=R1+R27. [<Rn>, +/-<Rm>, <shift> #<shift_imm>]!LDR R0,[R1,R2,LSL #2] !;R0<-[R 1+R2*4] R1=R1+R2*48. [<Rn>], #+/-<offset_12>LDR R0, [R1], #0x20 ;R0=<-[R1] R1=R1+0x201.现将基址指定的数据加载到R02.改变基址9. [<Rn>], +/-<Rm>LDR R0, [R1], R2 ;R0=<-[R1] R1=R1+R210. [<Rn>], +/-<Rm>, <shift> #<shift_imm>LDR R0, [R1], R2, LSL #2;R0=<-[R1] R1=R1+R2*4地址模式:10:1.无偏移量,将指定基址的数据加载到寄存器,基址不变2.将基址+偏移量指定地址的数据加载到寄存器,基址不变1.立即数2.寄存器3.寄存器移位3.将基址+偏移量指定地址的数据加载到寄存器,基址=基址+偏移量1.立即数2.寄存器3.寄存器移位4.将基址表示的加载到寄存器,基址=基址+偏移量1.立即数2.寄存器3.寄存器移位单寄存器字和无符号字节的加载,存储指令单寄存器半字和有符号字节的加载,存储指令加载指令语法格式LDR{cond}H Rd, <地址模式> 功能:Rd<- <地址模式>,高16bit 用0填充LDR{cond}SH Rd, <地址模式> 功能:Rd<- <地址模式>,高16bit 用符号位填充LDR{cond}SB Rd, <地址模式> 功能:Rd<- <地址模式>,高24bit 用符号位填充使用示例LDRH R1, [R0]R0=0x20008000R1=0x4800LDRSH R8, [R3, #2] LDREQH R12, [R13, #-6] LDRSB R7, [R6, #-1]!LDRH R3, [R9], #2LDRSB R1, [R2], R3LDRH PC, [R0] @×LDRH R0, [R0], #4 @×LDRSB PC, [R0]@×LDRSB R0, [R0], #4 @×不要以PC作为目标寄存器用在加载半字和字节的加载指令中在基址要发生变化的指令中,基址寄存器和目标寄存器不要相同的语法格式STR{cond}H Rd,<地址模式>使用示例STRH R1, [R0]STRH R8, [R3, #2] STREQH R12, [R13, #-6] STRH R7, [R6, #-2]!STRH R3, [R9], #2STRH R1, [R2], R3STRH PC, [R0] @×STRH R0, [R0], #4 @×STRH R7, [R6, #-1] @ ?半字读写时,指定的地址必须半字对齐,地址整除2基址+偏移量偏移量:立即数(由8bit来表示),寄存器1 .零偏移LDRSH R0, [R1]R0<-[R1]的低16bit R0的高16bit用符号位填充2. [<Rn>, #+/-<offset_8>] LDRH R0, [R1, #0x04]3. [<Rn>, +/-<Rm>]LDRSB R0, [R1, R2]4. [<Rn>, #+/-<offset_8>]! LDRH R0, [R1, #0x08]!5. [<Rn>, +/-<Rm>]!LDRSB R0, [R1, R2]!6. [<Rn>], #+/-<offset_8> LDRSH R0, [R1], #0x47. [<Rn>], +/-<Rm> LDRSH R0, [R1], R2单寄存器字和无符号字节存储加载指令地址模式:基址+偏移量立即数(12bit)寄存器寄存器移位单寄存器半字和有符号字节存储加载指令地址模式:基址+偏移量立即数(8bit)寄存器多寄存器存储加载指令多寄存器加载指令LDMLDM{cond}{addressing_mode} Rb{!}, < Reglist >{^}功能:将Rb基址中数据加载到Reglist表示的寄存器列表中LDMIA / STMIA 后增加LDMIB / STMIB 先增加LDMDA / STMDA 后减小LDMDB / STMDB 先减小多寄存器存储指令STMSTM{cond} {addressing_mode} Rb{!}, < Reglist >{^}cond : 条件域addressing_modeLDMIA / STMIA Increment After(先操作,后增加)LDMIB / STMIB Increment Before(先增加,后操作)LDMDA / STMDA Decrement After (先操作,后递减)LDMDB / STMDB Decrement Before (先递减,后操作)Rb : 基址寄存器! : 更新基址寄存器Reglist: 源/目标寄存器列表(可以是16个寄存器的任何子集)^ : 1.寄存器列表中没有PC寄存器:特权模式下使用用户模式下的寄存器2.寄存器列表中有PC寄存器,CPSR=SPSR,异常返回R10:基址寄存器{R0,R1,R4}:源操作的寄存器STMDA R10!,{R0,R1,R4}LDMIA R10,{R0,R1,R4}R0=0x20008000 IB地址先增加,然后再加载数据[0x20008000]=1[0x20008004]=2[0x20008008]=3[0x2000800C]=4[0x20008010]=5LDMIB R0! , {R1,R2,R3,R4}R1=2R2=3R3=4R4=5R0=0x20008010R0=0x20008000 IA地址后增加,先加载数据[0x20008000]=1[0x20008004]=2[0x20008008]=3[0x2000800C]=4[0x20008010]=5LDMIA R0!, {R1, R2, R3,R4}R1=1R2=2R3=3R4=4R0=0x20008010LDMIA R0!, {R1-R3} LDMIB R0, {R1-R3, R7}^ @ x usr/sysLDMDB SP!, {R1-R3, PC}^ @ x usr/sysLDMDB R0, {R0-R2} LDMDA R15, {R1} @xLDMDB R0!, {R0-R2} @x Rn值LDM{cond}{addressing_mode} Rb{!}, < Reglist >{^}功能:将Rb基址中数据加载到Reglist表示的寄存器列表中多寄存器存储指令STMSTM{cond} {addressing_mode}Rb{!}, < Reglist >{^}IA 先存储或加载数据,地址后增加IB 地址先增加,后存储或加载数据DA 先存储或加载数据,地址后减小DB 地址先减小,后存储或加载数据多寄存器存储加载,只操作字数据大编号寄存器存放在高地址,小编号寄存器存放在低地址!:基址要更新^:1.寄存器列表中包括PC,CPSR=SPSR(异常模式下使用)2.寄存器列表中不包括PC,特权模式下使用用户模式寄存器PC不做为基址寄存器若要更新基址,基址和目标寄存器不使用相同的寄存器STMIA R0!, {R1-R3} STMIA SP!, {R1-R3, LR} STMIB R0, {R1-R3, R9}^ @x usr/sys STMDB R0, {R0-R2} STMDB R0!, {R0-R2}STMDA R15, {R1} @ x栈的种类:Descending stacks (减栈)栈向内存地址减小的方向变化Ascending stacks (加栈)栈向内存地址增加的方向变化Full stacks (满栈)栈指针指向的栈顶保存有效元素Empty stacks (空栈)栈指针指向的栈顶未保存有效元素综合以上两种特点,有以下4种栈FD(Full Descending)满减栈ED(Empty Descending)空间栈FA(Full Ascending)满加栈EA(Empty Ascending)空加栈STMFD (Push) [多寄存器存储- STMDB]LDMFD (Pop) [多寄存器加载- LDMIA]STMDB 入栈LDMIA 出栈…….MOV R0, #0MOV R1,#1BL loop CPU自动将ADD指令地址存放LRADD R3,R4loop:STMFD sp!, {r4-r7, lr}SUB R4, #1…..LDMFD sp!, {r4-r7, pc}STMFD(STMDB\Push):入栈根据满减栈原则,先减地址,后入栈,高地址存大编号寄存器的原则,依次入栈,栈顶指针永远指向有效元素。

相关文档
最新文档