历史上的今天
今天是:2025年02月22日(星期六)
2020年02月22日 | ARM指令集——数据处理指令
2020-02-22 来源:eefocus
ARM汇编指令集
ARM汇编文件的组成
指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作
伪指令:在编译时替换成能被识别的ARM指令
伪操作:知道编译器进行编译,编译完成后不生成指令,也不占用内存空间。
ARM汇编指令类型
数据处理指令
跳转指令:实现程序执行过程中的跳转
Load/Store指令:CPU与内存数据之间的操作指令
状态寄存器存送指令:对状态寄存器操作(只能使用这些指令对状态寄存器操作)
协处理器指令:对协处理器进行操作
异常产生指令:产生异常(软中断),实现模式切换
数据处理指令 mov,add,adds,adc,sub,subs,sbc,rsb,mul,and,orr,eor,bic,cmp,tst,teq,lsl,lsr,asr,rorv
数据处理指令语法
<操作{ <操作码> <目标寄存器Rd> <第一操作寄存器Rn> <第二操作数Operand2> ;第一个位置必须是寄存器,第二操作数可以是寄存器,也可以是立即数 数据传送指令 MOV mov r1, #0x1 ;r1 = 0x1 0x1 是立即数 mov r2, r1 ;r2 = r1 mvn r3, r2 ;r3 = ~r2 mov r1, 0xffffff00 ;0xffffff00 不是立即数,只是编译器在编译阶段对其进行了替换 mvn r1, 0x000000ff ;替换的指令 ;一条数据传送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留给立即数使用,因此立即数自包含2^12个 ;一个立即数由 bits[8:0]循环右移 2 * bits[11:9]得到。(一个八位的数循环右移偶数次得到) ;立即数的本质是包含于指令中的数,占用指令本身的空间 加法指令 ADD ;加法指令执行时,若没有进位 CPSR 'C' 位置 0 mov r0, #1 mov r1, #1 add r2, r1, r0 ;r2 = r1 + r0 add r2, r1, #2 ;r2 = r1 + 2 数据操作对CPSR的影响 ;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。 mov r1, #0mov r2, #-1 adds r3, r1, r2 带进位的加法指令 ADC ;两个64位数相加,第一个64位的低32位放在 r0,高位放到 r1,第二个64位数的低32位放在 r2 高32位放在 r3 ;编写代码实现两个64位数的和,结果的低32位放在 r4 高32位放在 r5 mov r0, #0xfffffffe ;第一个数的低32位 mov r1, #1 ;第一个数的高32位 mov r2, #0x5 ;第二个数的低32位 mov r3, #1 ;第二个数的高32位 adds r4, r0, r2 adc r5, r1, r3 ; adc运算的实质是 r5 = r1 + r3 + 'C' 'C'位 CPSR 进位标志 减法指令 SUB ;减法指令执行时,没有借位时 CPSR 'C' 位置 1 mov r0, #5 mov r1, #3 sub r2, r0, r1 ;r2 = r0 - r1 带借位的减法指令 SBC mov r0, #1 ;第一个数的低32位 mov r1, #3 ;第一个数的高32位 mov r2, #3 ;第二个数的低32位 mov r3, #1 ;第二个输的高32位 subs r4, r0, r2 sbc r5, r1, r3 逆向减法指令 RSB mov r0, #3 rsb r1, r0, #5 ;r1 = 5 - r0 乘法指令 MUL ;为了提高效率,任何乘法指令不可以使用立即数 mov r0, #3 mov r1, #5 mov r2, r0, r1 ;r2 = r0 * r1 乘——累加指令 MLA mla r3 ,r0, r1, r2 ;r3 = (r0 * r1) + r2 逻辑与指令 AND mov r0, #0xf0 mov r1, #0x0f and r2, r0, r1 ;r2 = r0 & r1 逻辑或指令 ORR mov r0, #0xf0 mov r1, #0x0f orr r2, r0, r1 ;r2 = r0 | r1 逻辑异或运算指令 EOR mov r0, #0xf0 mov r1, #0x0f eor r2, r0, r1 ;r2 = r0 ^ r1 位清零指令 BIC mov r0, #0xff bic r0, r0, #0xf ;第二个操作数的每一位为 1 就把第一个操作数对应的位清零 比较指令 CMP ;实质是一条减法指令 ;没有目标register,用来比较两个数是否相等,结果放到 CPSR 的 'Z' 位判断 mov r0, #2 mov r1, #1 cmp r0, r1 位测试指令 TST ;实质是与运算 常用于用来测试某一位或某几位是 0 还是 1,结果通过 CPSR 的 'Z' 位判断 tst r0, #0x3 相等测试指令 TEQ ;实质是异或运算,测试两个数是否相等,两个数相等时异或结果位 0,通过 CPSR 的 'Z' 位判断 teq r0, r1 移位指令 LSL、LSR、ASR、ROR ;需要与mov配合,不能够单独使用 mov r0, #0xff mov r1, r0, lsl #4 ;将 r0 逻辑左移 4 位放入 r1 中 ;LSL 逻辑左移:高位移出,低位补零 ;LSR 逻辑右移:低位移出,高位补零 ;ASR 算是右移:低位移出,高位补符号位 ;ROR 循环右移:低位移出,高位补低位移出位
下一篇:ARM体系结构_DAY2
史海拾趣
|
有这么一个小程序,就是当数据库有数据的时候,会弹出一个对话框,在弹出对话框的同时,我想加上一段提示音,但是试了好几种方法,都不行,哪位高手能指教下啊,小弟感激不敬!!… 查看全部问答> |
|
这样的是: 在PC上我跑IAR, 和 ADS 的两个工程文件,都没有问题, 用自己做的调试板+H-JTAG,都能正常 而换到本本上,在H-JTAG时,检测硬件都没问题,但调试时,分别出了问题: 1 在ADS 上, 按F5后,跑不到,MAIN() 函数那,发现死在 PLL初 ...… 查看全部问答> |
|
请教一下,一个驱动程序程序中,可不可以同时存在SPI中断和DMA中断?还是只能用一个中断? 当驱动程序使用了DMA中断后,SPI中断是否起作用?… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:11 编辑 设计电路,在模电书上看到信号放大的电路,是三个运放,有没有两个运放的还有就是单电源运放放大的 … 查看全部问答> |
|
采用Ti SensorTag,安卓手机 , 能实时连续采集病人/老人的身体状况,比如体温脉搏,心率,皮肤电阻等信息,实实传到具有蓝牙设备的手持安卓终端上(手机),来进行监测,分析,并给病人/老人提醒,建议。危险或异常情况下可以通过监测端短信给监护 ...… 查看全部问答> |




