1.MOV r0, #0x3FFFC0 这句指令有错误吗?为什么?如果有错请提出修改意见。
2.请解释 ORR r0, r0, r1, LSR #16 的含义,并指出这句指令中的LSR #16会不会带来额外的开销。
3. 解释下面的指令:
<1> MLA r0, r1, r2
<2> SMULL r0, r1, r2, r3
<3> BL Label
4. 把下面的指令翻译成C代码,并说出MOVLT与MOV的执行效率是否相同?
asm volatile ( "CMP r8, #0" : : );
asm volatile ( "MOVLT r8, #0" : : : "r8" );
asm volatile ( "MOVGE r8, %0" : : "r"(val) : "r8" );
5. ARM寄存器一共有哪些?其中哪些可以放心使用,哪些应该小心使用甚至不使用?
6. 常见的ARM指令集中不包括除法指令,那么对于程序中出现的除法,你认为应该如何处理?(请分为内存紧张与不紧张两种情况讨论)
7. 目前大部分手机采用的ARM的芯片,都没有浮点数协处理器,然而几乎所有的3D应用程序都需要小数类型的支持,对此有什么解决方案?
23 个解决方案
#1
#2
大家加油啊!
#3
路过 略知
#4
1、ARM里的指令长度为32,其中MOV指令的第12~15们是第一操作数Rn,即寄存器编号,第0~11位是第二操作数<shifter_operand>,即立即数。
这样的立即数必需满足是由一个8位的常数循环右移偶数位得到,其中循环右移的位数由一个4位的二进制数的两倍表示,这样就用了12位的第二操作数。
0x3fffc0不能满足上述条件,所以错误,应改成伪指令: ldr r0, =0x3fffc0
这样的立即数必需满足是由一个8位的常数循环右移偶数位得到,其中循环右移的位数由一个4位的二进制数的两倍表示,这样就用了12位的第二操作数。
0x3fffc0不能满足上述条件,所以错误,应改成伪指令: ldr r0, =0x3fffc0
#5
mark,,等大大解答~
#6
等大大解答~
#7
6.内存紧张---除法替换成移位和/或乘法运算
内存不紧张---查表
7.用定点格式来代替浮点格式
许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化
,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才
能更好的处理运算。
Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的
一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度
内存不紧张---查表
7.用定点格式来代替浮点格式
许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化
,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才
能更好的处理运算。
Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的
一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度
#8
2.r1逻辑右移16位,再与r0逻辑或,结果放入r0中
3.MLA{<cond>}{S} Rd,Rm,Rs,Rn 乘累加 Rd = (Rm * Rs) + Rn
SMULL有符号乘法 r1,r0:=r2*r3 r1中放结果高32位
BL带链接跳转,带链接分支跳转(BL)指令将原来的PC值写入到当前组的链接寄存器(R14)中。考虑到预取,还应调整写
入到R14 的PC 的值,包含分支和链接跳转指令后的指令地址。注意未保存CPSR,总是清除PC和 R14[1:0]。
3.MLA{<cond>}{S} Rd,Rm,Rs,Rn 乘累加 Rd = (Rm * Rs) + Rn
SMULL有符号乘法 r1,r0:=r2*r3 r1中放结果高32位
BL带链接跳转,带链接分支跳转(BL)指令将原来的PC值写入到当前组的链接寄存器(R14)中。考虑到预取,还应调整写
入到R14 的PC 的值,包含分支和链接跳转指令后的指令地址。注意未保存CPSR,总是清除PC和 R14[1:0]。
#9
4 LT表示小于 GE大于或等于
5.通用寄存器、分组寄存器、状态寄存器,sp-R13 LR-R14 pc-R15 cpsr-R16
5.通用寄存器、分组寄存器、状态寄存器,sp-R13 LR-R14 pc-R15 cpsr-R16
#10
.....大家继续加油啊!
#11
#12
搞了半天嵌入式ARM不懂ARM架构的汗颜飘过。。。。。
#13
很好,加油
#14
好好看看ARM汇编方面最基础的书吧
#15
.......大家继续啊!!
#16
arm 汇编还没接触过。
#17
#18
不错的帖子,MARK
汇编也高了一段时间,不过真没有那么深入
汇编也高了一段时间,不过真没有那么深入
#19
#20
都用c在写,不懂arm汇编的mark一个
#21
看了之后很伤心啊!继续努力吧!
#22
#23
觉嵌入式有时间了,,
还真不懂ARM汇编,,,也很少用ARM 啊,,
还真不懂ARM汇编,,,也很少用ARM 啊,,
#1
#2
大家加油啊!
#3
路过 略知
#4
1、ARM里的指令长度为32,其中MOV指令的第12~15们是第一操作数Rn,即寄存器编号,第0~11位是第二操作数<shifter_operand>,即立即数。
这样的立即数必需满足是由一个8位的常数循环右移偶数位得到,其中循环右移的位数由一个4位的二进制数的两倍表示,这样就用了12位的第二操作数。
0x3fffc0不能满足上述条件,所以错误,应改成伪指令: ldr r0, =0x3fffc0
这样的立即数必需满足是由一个8位的常数循环右移偶数位得到,其中循环右移的位数由一个4位的二进制数的两倍表示,这样就用了12位的第二操作数。
0x3fffc0不能满足上述条件,所以错误,应改成伪指令: ldr r0, =0x3fffc0
#5
mark,,等大大解答~
#6
等大大解答~
#7
6.内存紧张---除法替换成移位和/或乘法运算
内存不紧张---查表
7.用定点格式来代替浮点格式
许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化
,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才
能更好的处理运算。
Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的
一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度
内存不紧张---查表
7.用定点格式来代替浮点格式
许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化
,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才
能更好的处理运算。
Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的
一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度
#8
2.r1逻辑右移16位,再与r0逻辑或,结果放入r0中
3.MLA{<cond>}{S} Rd,Rm,Rs,Rn 乘累加 Rd = (Rm * Rs) + Rn
SMULL有符号乘法 r1,r0:=r2*r3 r1中放结果高32位
BL带链接跳转,带链接分支跳转(BL)指令将原来的PC值写入到当前组的链接寄存器(R14)中。考虑到预取,还应调整写
入到R14 的PC 的值,包含分支和链接跳转指令后的指令地址。注意未保存CPSR,总是清除PC和 R14[1:0]。
3.MLA{<cond>}{S} Rd,Rm,Rs,Rn 乘累加 Rd = (Rm * Rs) + Rn
SMULL有符号乘法 r1,r0:=r2*r3 r1中放结果高32位
BL带链接跳转,带链接分支跳转(BL)指令将原来的PC值写入到当前组的链接寄存器(R14)中。考虑到预取,还应调整写
入到R14 的PC 的值,包含分支和链接跳转指令后的指令地址。注意未保存CPSR,总是清除PC和 R14[1:0]。
#9
4 LT表示小于 GE大于或等于
5.通用寄存器、分组寄存器、状态寄存器,sp-R13 LR-R14 pc-R15 cpsr-R16
5.通用寄存器、分组寄存器、状态寄存器,sp-R13 LR-R14 pc-R15 cpsr-R16
#10
.....大家继续加油啊!
#11
#12
搞了半天嵌入式ARM不懂ARM架构的汗颜飘过。。。。。
#13
很好,加油
#14
好好看看ARM汇编方面最基础的书吧
#15
.......大家继续啊!!
#16
arm 汇编还没接触过。
#17
#18
不错的帖子,MARK
汇编也高了一段时间,不过真没有那么深入
汇编也高了一段时间,不过真没有那么深入
#19
#20
都用c在写,不懂arm汇编的mark一个
#21
看了之后很伤心啊!继续努力吧!
#22
#23
觉嵌入式有时间了,,
还真不懂ARM汇编,,,也很少用ARM 啊,,
还真不懂ARM汇编,,,也很少用ARM 啊,,