最近工作要用ARM体系结构和汇编指令,在此边学边写。希望对同样有需求的人有所帮助。
先列出我的学习资料路径,供大家一起学习:
《ARM入门》
https://www.bilibili.com/video/av22389159/?p=2 系列课程,共37讲
《ARM体系结构和汇编》
https://www.bilibili.com/video/av28646164/?spm_id_from=333.788.videocard.5
说明,这个系列的视频在汇编方面讲的很详细,推荐学习
https://www.bilibili.com/video/av53306639?from=search&seid=15588178575541602823
说明,上面这是视频是个老外讲的,纯视频,无字幕,看着累。自己选择是否学习吧。
下面我们来一一学习ARM体系的汇编指令吧。
假设R0-R7寄存器初始值都是0。
MOV,比如MOV R0,#0X1 ;即把#0X1的值赋值给R0寄存器。其中分号是汇编语言的注释。此时R0寄存器的值就是0X00000001。
ADD,比如ADD R2,R0,R1 ;R0+R1=>R2,即1+0=1。此时R2寄存器的值就是1。
ADDS、ADC,这两个也代表加法,与ADD的不同是,这两个符号代表带进位的加法。即带CPRS进位的。
SUB,比如SUB R3,R2,R1 ;R2-R1=>R3,即1-0=1。此时R3寄存器的值就是1。
SUBS,这各也代表减法,与SUB不同的是,这代表带进位的减法。
MVN,比如MVN R0,#0X0 ;把值1取反,即0XFFFFFFFF。此时R0计算器的值就是0XFFFFFFFF。
B,代表打断点,比如B . ;代表在当前位置打断点,用于逐步调试。
AND,比如AND R3,R2,R1 ;R1与R2=>R3,即R1寄存器的值与R2寄存器的值做位与运算后,把值赋给R3寄存器。
ORR,比如R6,R1,R2 ;R1或R2=>R6,即R1寄存器的值与R2寄存器的值做位或运算后,把值赋给R6寄存器。
CMP,比如CMP R3,R1 ;比较R3和R1寄存器(实际执行R3-R1)的值,并把值赋给CPRS标志位。
BIC,比如BIC R0,R0,#0X1 ;把R0寄存器的最低位置位0,并把结果保存在R0寄存器。比如R0寄存器中原来保存的数值为3,即0011,则把低位置位0,即0010,把0010保存到R0,即2。
STR,比如
MVN R5,#0X0 ;此时R5寄存器的值是0XFFFFFFFF
MOV R6,#0X9000
STR R5,[R6] ;STR是用来把寄存器的值写入内存地址(寄存器-->内存)。比如这里的,R6寄存器存储的是地址0X9000,比如此时内存地址0X9000的地址的值是00 00 00 00,那执行这句汇编指令后,会把R5寄存器的值0XFFFFFFFF存入内存地址0X9000地址当中,即内存地址0X9000这个位置存入FF FF FF FF。
LDR R7, [R6] ;LDR是用来把内存地址内的值调入寄存器(内存-->寄存器)。比如这里的,把内存地址0X9000的值FF FF FF FF写入寄存器R7,执行这条指令之后,寄存器R7的值就由0X00000000变为了0XFFFFFFFF。
最后贴上ARM架构下CPU内部结构图,希望更清晰的理解。
ARM体系结构和汇编指令最后推荐一款好用的ARM开发工具,ads1.2,这是一个32位的工具,安装的时候请注意不要安装在默认的(X64目录)。
祝你学习顺利。
程序员是一种时时刻刻需要学习的职业,不学习何以自称“程序媛”呢。
哈哈,边学边写,写出来证明自己学懂了,不然我很喜欢自欺欺人。
我在007不出局践行写作,写7年。你敢来吗?
ARM体系结构和汇编指令
网友评论