ARM学习2

ARM学习2
13.汇编1)位运算逻辑右移LSR最高位补0不需要考虑数值的符号位无符号数算术右移ASR最高位补符号位考虑数值的符号位有符号数循环右移ROR循环将每次移出的最低位补到最高位1011 0010 (lsr) 1 : 0101 10011011 0010 (asr) 1 : 1101 10011011 0010 (ror) 10101 1001 1010 1100立即数定义立即数Immediate 是 ARM 汇编中直接写在指令里的常数不需要从内存或寄存器读取。判断条件如果某个数的数值范围是0~0xFF之间那么这个数一定是立即数把某个数展开成2进制这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位包括最高位、最低位这个数的二进制序列凑够8位之后的的右边必须为偶数个连续的 0b、bl、bx区别函数调用b: 在函数跳转前无法将函数返回地址装入到lr寄存器bl在函数跳转前可以将返回地址装入到lr寄存器bxbx后面加寄存器可以将寄存器中的地址恢复给pc栈有四种类型空减栈、 空增栈、 满减栈、 满增栈增栈入栈时sp指针往上走减栈入栈时sp指针往下走空栈先写数据再挪指针 *sp *sp--满栈先挪指针再写数据 *sp *--spARM采用的满减栈ldr和str指令ldr向寄存器中加载一个非立即数 将RAM中的数据加载到通用寄存器str将通用寄存器中值写入到RAM空间ldmfd和stmfd指令ldmfd将寄存器的值从栈区取出出栈stmfd将寄存器的值保存到栈区入栈bic和orr指令bic指令将操作数中为bit1的位清0清0的结果写回到通用寄存器中orr指令将操作数中为bit1的位置1置1的结果写回到通用寄存器中mrs和msr指令mrs读取某个特殊寄存器(cpsr)值到通用寄存器msr将通用寄存器的值写入到特殊寄存器(cpsr)汇编向C传参需要注意的点在汇编调C函数首先在汇编开头需要加入伪指令PRESERVE8然后在汇编中导入C函数import指令最后进行参数的传递通过通用寄存器传参将C语言函数返回值保存到R0寄存器。 如果参数个数小于等于4个时可以通过通用寄存器R0 - R3传参 如果参数个数超过4个时必须通过栈进行传参入栈出栈在C语言调汇编函数首先在汇编开头需要加入伪指令PRESERVE8然后导出汇编函数export指令在C语言中声明汇编函数在main函数中调用汇编函数并传参。汇编函数将C语言传递的参数保存到通用寄存器中汇编程序结果通过R0寄存器返回LED0 是GPIO一组的第三个引脚一省略了14.烧录问题如果烧录后速度时而达到MB有问题时而KB正常但是代码没有问题记得重启虚拟机重新烧录程序到SD卡15.GPIO点灯需要配置的寄存器1IOMUXC1. IOMUXC_SW_MUX_CTL_PAD_: 配置引脚复用功能2. IOMUXC_SW_PAD_CTL_PAD_配置电气属性2GPIO1. GPIO1_DR: GPIO数据寄存器2. GPIO1_GDIR: GPIO输入输出模式配置寄存器3CCM1. CCM_CCGR0 - CCM_CCGR6: 0xFFFFFFFF 将所有外设时钟全部打开16.ARM工具链中gcc、ld、objcopy、objdump工具的作用1)使用arm-linux-gnueabihf-gcc编译文件命令为arm-linux-gnueabihf-gcc -g -c led.S -o led.o进行预处理-》编译-》汇编将.c/.S文件变成.o目标文件“-g”选项是产生调试信息GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源 文件但是不链接。“-o”选项是指定编译产生的文件名字这里我们指定 led.s 编译完成以后的文件名字为 led.o2)使用arm-linux-gnueabihf-ld链接文件命令 arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf将所有 .o 文件整合成一个 elf 可执行文件并在整合时通过链接脚本.lds配置各段的内存地址-Ttext 就是指定链接地址“-o”选项指定链接生成的 elf 文件名这里我们命名为 led.elf。3用arm-linux-gnueabihf-objcopy格式转换去除源文件中多余的符号表和调试信息生成可以直接烧录的.bin文件4使用arm-linux-gnueabihf-objdump 反汇编辅助性的调试步骤。它的作用是将 elf 文件反向翻译成人们更容易理解的汇编代码生成一个 .dis 反汇编文件。17.四个段的区别1.bss段用于存放未初始化静态变量或初始化为0的全局变量在运行时会被自动清零2.COMMON段用于存放未初始化的全局变量3.data段用于存放初始化不为0的全局变量和静态变量4.rodata段- 存放程序的只读数据- 运行时受保护不可修改- 包含的数据类型1. 字符串常量2. const修饰的全局变量3. 全局只读数组4. switch跳转表5. 浮点数常量