ARM STM32 嵌入式 汇编指令LDMIA用法
LDM是多寄存器存取的意思,IA表示数据传输后地址增加(increase after);(IB:increase before, DA: decrease after, DB: decrease before)
后面参数以“,”分隔,第一个参数是首地址;第二个参数是寄存器列表,并以“{}”括起来。
具体的例子:
LDMIA R0!, {R1-R4}
R0表示要操作的存储空间首地址,要操作的数据个数由寄存器列表决定,现在是R1到R4,共4个数据(每个数据是32bits的)
具体:地址为R0的存储空间中的数据赋值给R1
地址为R0+4的存储空间中的数据赋值给R2
地址为R0+8的存储空间中的数据赋值给R3
地址为R0+12的存储空间中的数据赋值给R4
所有的示例指令执行前的存储空间和寄存器情况:
mem32[0x1000C] = 0x04
mem32[0x10008] = 0x03
mem32[0x10004] = 0x02
mem32[0x10000] = 0x01
r0 = 0x00010000
r1 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
执行后存储空间不变,寄存器变化:
r0 = 0x00010010
r1 = 0x01
r2 = 0x02
r3 = 0x03
r4 = 0x04
谁能把以下C语言 转换成stm32里面的汇编语言? 注意是stm32里的 因为有需求简短运行时间 急需!!!!
keil的反汇编其实非常简单,只需要下面步骤:
打开 options for target
点Debug,选择 Use Simaulator
点OK
打开菜单:debug
start debug
找到这段代码光标指向它
上面的反汇编窗口,会自动显示出它的汇编语言代码。
以上对所有keil支持的芯片都合适,不仅限于stm32.
对于stm32,MDK下C和汇编如何混合编程
1.最简单的方法:
public static String reverse1(String str)
{
return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{
char[] array = s.toCharArray();
String reverse = “”; //注意这是空串,不是null
for (int i = array.length – 1; i = 0; i–)
reverse += array[i];
return reverse;
}
3.常用方法的变形:
public static String reverse2(String s)
{
int length = s.length();
String reverse = “”; //注意这是空串,不是null
for (int i = 0; i length; i++)
reverse = s.charAt(i) + reverse;//在字符串前面连接, 而非常见的后面
return reverse;
}
4.C语言中常用的方法:
public static String reverse5(String orig)
{
char[] s = orig.toCharArray();
int n = s.length – 1;
int halfLength = n / 2;
for (int i = 0; i = halfLength; i++) {
char temp = s[i];
s[i] = s[n – i];
s[n – i] = temp;
}
return new String(s); //知道 char数组和String相互转化
}
STM32有多少条汇编指令,都是什么怎么用?
1、arm都是精简指令集,所有的指令(除stm、ldm外)都是单周期指令。
2、汇编语言输出只需要1条指令,但需要输出的数据通常要先存到特殊功能寄存器中
3、c语言在编译的时候,有可能将一条语句反汇编成多条汇编指令。根据复杂不同,生成的汇编数量也不同。无法统计。
学习STM32一定要用到汇编语言吗?我只会C语言怎么办?
学stm32汇编不是必须会用的,但是如果懂汇编,会使你写的c程序有更好的执行效率。
内容拓展:
一、在嵌入式开发中C语言和汇编两种语言相比。汇编作为低级语言,是仅次于机器语言和硬件联系最紧密的语言;而C语言,严格的说也只能算是半个高级语言,相对于其他高级语言来说。
二、这两者比较直观的差异是:汇编语言的实时性非常好,但可读性差,可移植性不强;相反,C语言的可读性强,可移植性高,但实时性相对汇编比较差。
三、利用C语言编写单片机程序,不用考虑程序的初始化地址,不用考虑ACC,PSW以及工作寄存器的保护,不用考虑溢出进位CY。而汇编这些都需要考虑到。
四、当然c语言的简单与方便这是汇编不能比的,个人觉得把单片机c语言和汇编语言结合来编成是最好的。在需要很精确的地方就嵌套一个汇编的子程序,其他就用c语言。
需要stm32的c语言设计程序
没学过单片机,有c语言基础,是能直接学习stm32的。因为STM32是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-0内核而设计的,属于高级单片机,其可以使用汇编语言编写程序,也可使用c语言编写程序,而且很多使用stm32单片机的人都是使用c语言编写程序,所以通过一本详细讲解stm32的书籍直接学习是完全可行的。