ARM汇编指令学习笔记(一、二)【晚上BOOTLOAD了,速度】

href="file:///C:/Users/BJX/AppData/Local/Temp/msohtmlclip1/01/clip_filelist.xml" rel="File-List" /> href="file:///C:/Users/BJX/AppData/Local/Temp/msohtmlclip1/01/clip_editdata.mso" rel="Edit-Time-Data" /> href="file:///C:/Users/BJX/AppData/Local/Temp/msohtmlclip1/01/clip_themedata.thmx" rel="themeData" /> href="file:///C:/Users/BJX/AppData/Local/Temp/msohtmlclip1/01/clip_colorschememapping.xml" rel="colorSchemeMapping" />

ARM汇编指令学习笔记(一、二)

汇编真的需要自己学.网上的资料满天飞,又能有多少能让人看进去?

闲话少说,切入正题:ARM(单片机)汇编常用指令用法总结,纯属原创,如有谬误,还望指正.

【这里带“【】”的是笔者随笔,贻笑大方,还望见谅】

MOV

传送指令MOVMove)把一个字节、字或双字的操作数从源位置传送到目的位置,源操作数的内容不变。可以实现立即数到通用寄存器或主存的传送,通用寄存器与通用寄存器、主存或段寄存器之间的传送,主存与段寄存器之间的传送。该操作属于复制性质,不属于搬家性质。 例如: MOV EAX,050ah ;将十六进制数050a 传送到通用寄存器eax

注意:【感悟:猜想是程序出错的可能原因之一】

  1.目的操作数要与源操作数类型要一致

  2.目的操作数要和源操作数类型之一必须要有明确的类型

使用方法:

1.  累加器A为目的操作数的源操作数:#datadirectRn@Ri(指令中的Ri表示取值可以是R0或者R1Rn表示可以取R0R7Ri一般用于间接寻址。具体一个R0R1是用于Ri还是Rn要看这条指令是什么

2.  工作寄存器Rn为目的操作数的源操作数:Adirect#data【疑问:工作寄存器之间能不能MOV?

3.  直接地址direct为目的操作数的源操作数:A,Rn,@Ri,direct2,#data

4.  寄存器间接地址@Ri为目的操作数的源操作数:A,direct#data

5.  除此之外还有涉及到DPTR,MOVX,MOVC的指令,在总结寻址时会提及。

应用:

ARM的两种跳转方式之一:MOV PC,地址;向程序计数器直接写跳转地址,能在4G连续空间内任意跳转。此外还可通过B,BL,BLX,BX在前后32MB范围内跳转,详见后文相关笔记。

ADD

没找到资料,简而言之:ADD A,Rn就是把Rn里的数加入A

应用:

1.  目的操作数必为A,源操作数可为:Rn@Ridirect#data

2.  此外,ADD课替换为ADDC,带上了Cy(进位标志位)

SUBB

SUBB【全称没找到,但地球人都知道这是减】。

应用:

         1.和ADD同,目的操作数必为A,源操作数可为:Rn@Ridirect#data【这也在一定程度上证明了SUBBADD本质是相同的】

B/BL

BARM最简单的跳转指令,但注意跳转的是相对当前PC值的偏移量【就像单片机的SJMPBL很常用。它在跳转之前会在寄存器LRR14)中保存PC的当前内容。BL经典用法如下:

bl NEXT;跳转到NEXT

……

NEXT:……

……

Mov pc,lr;从子程序中返回

【附:单片机中跳转的用法:(addr :代表8位地址 addr16:代表16位地址)

长转移指令:         LJMP addr16    ;addr16~0PC

短转移指令:         AJMP addr11   ;PC+2PC,addr10~0PC10~0

相对转移指令:     SJMP rel            ;PC+2PC,PC+relPC

间接转移指令:     JMP @A+DPTR;A+DPTRPC

LDR

LDR【具体全称也没查到L估计是LOAD,R估计是ROM或者RAM】就是把数据总存储器传到寄存器。

注意:

         有个伪指令也用LDRLDR Rn,=expr;作用是装载一个32bit地址或者常量到寄存器Rn。比如:ldr   r2,=0x55aa;其实MOV R2,#OX55AA也可以做到,但是LDR是伪指令,也就是说编译时编译器会处理它的:如果该数字常量在MOV指令范围内,汇编器会把这个指令作为MOV;如果不在MOV范围内,汇编器把该常量放在程序后面,用LDR来读取,PC和该常量的偏移量不能超过4KB【大致可以明白了】

应用

LDR R0,=0X12345678;伪指令,但这点MOV就做不到,MOV限制立即数长度为8位,即小于25628次方【一定注意是8次方】)!

STR

STR 字数据存储指令 【注意方向和MOV等相反是Rdaddr
格式:STR{<cond>} <Rd>,<addr>;
功能:把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。 地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。 寻址方式同LDR指令。
例如:
STR R0,[R1],#5;
R0中的字数据保存到以R1+5为地址的内存中,然后R1R1+5(如果是[人,#5]的话R1不变)

LDMFD/STMFD

表示出栈和进栈【记法:LDMFDLDLOADSTMFDSTSTORE】例如:

STMFD SP! {R1~R7,LR};入栈,R1,R2一直到R7,最后是LR

LDMFD SP! { R1~R7,LR };出栈,由于SP后面加了!,此时指向栈中LR的数据,出栈顺序和入栈相反。

MRS/MSR

貌似是和MOV相同的用法,但是在ARM处理器中,只有MRS【记法:Mov RdpSr 】指令能对状态寄存器CPSRSPSR进行读操作。读CPSR可以了解当前处理器的工作状态,读SPSR寄存器可以了解进入异常前的处理器状态。其格式:MRS{cond} Rdpsr。同时,只有MSR可以对状态寄存器CPSRSPSR进行写操作。二者配合,可以实现对CPSRSPSR寄存器的读--写操作。

SWI

SWI指令用于产生中断,从而实现从用户模式变换到管理模式【这个概念很重要】,并且将CPSR保存在管理模式的SPSR中,然后程序跳转到SWI异常入口。在其他模式下也可使用SWI指令,处理器同样地切换到管理模式。

参数传递方法:

         1  指令中的24位立即数指定了用户请求的服务类型,参数通过通用寄存器传递:

MOV R0,#34    ;设置子功能号为34

                   SWI 12               ;调用12号软中断

         2  指令中的24位立即数被忽略,用户请求的服务类型由寄存器RO的值决定,参数通过其他通过用寄存器传递:

MOV R0,#12    ;调用12号软中断

                  MOV R1,#34    ;设置功能号为34

                   SWI 0                 ;

取出SWI指令中立即数的步骤:

MRC/MCR

如果需要在ARM处理器中的寄存器与协处理器中的寄存器之间进行数据传送,那么可以使用MRC/MCR指令。MCR指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器。MRC则相反【汇编的一个特点:两个宾语一般是倒置的,像MRC是从CR!唯一一个例外就是STR】。若协处理器不能成功执行该操作,将产生未定义指令异常中断。

格式:

MCR{cond}       coprocopcode1RdCRnCRm{opcode2};【MRC的只需替换MCR即可】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值