关键词:
在上节课中我们介绍CPU有两种工作状态,一种ARM状态,一种Thumb状态。
本节课主要介绍Thumb状态及Thumb指令集。
在012_relocate的程序基础上修改,创建013_thumb_014_003程序,并打开start.S和Makefile代码。
1. 对Makefile文件进行如下修改。
1 all: led_on2.o uart.o init.o main.o start.o 2 3 #arm-linux-ld -Ttext 0 -Tdata 0x3000000 start.o led_on2.o uart.o init.o main.o -o sdram.elf 4 arm-linux-ld -T sdram.lds start.o led_on2.o uart.o init.o main.o -o sdram.elf 5 arm-linux-objcopy -O binary -S sdram.elf sdram.bin 6 arm-linux-objdump -D sdram.elf > sdram.dis 7 8 %.o : %.c 9 arm-linux-gcc -mthumb -c -o $@ $< 10 %.o : %.S 11 arm-linux-gcc -c -o $@ $< # 在汇编文件中不需要做-mthumb的指定,在代码里边进行指定 12 13 .PHONY: clean 14 15 clean: 16 rm *.bin *.o *.elf *.dis
2. 对start.S文件进行如下修改。
1 .text 2 .global _start 3 .code 32 /* 表示后续指令使用ARM指令集 */ 4 5 _start: 6 7 ... 8 9 /* 怎么从 ARM_State 切换到 Thumb_State ? */ 10 adr r0, thumb_func /* 得到thumb_func标号的地址 */ 11 add r0, r0, #1 /* 为什么 +1 ?bit0 = 1 时, bx就会切换CPU State到thumb State https://blog.csdn.net/u011449588/article/details/44634977 */ 12 bx r0 /* bx 命令后边那个值如果最低位为1的话,它会跳转到Thumb指令 */ 13 14 .code 16 15 thumb_func: 16 17 bl sdram_init /* */ 18 //bl sdram_init2 /* 用到有初始值的数组,不是位置无关码 */ 19 20 ... 21 22 /* 调用main函数 */ 23 //bl main /* 使用BL命令相对跳转,程序仍然在NOR/片内SRAM上运行 */ 24 /*ldr pc, =main*/ /* 绝对跳转,跳到SDRAM */ 25 26 ldr r0, =main 27 mov pc, r0 28 29 halt: 30 b halt
其中,(1) 最后不再允许使用ldr pc, =main直接对PC进行赋值,而改用 ldr r0, =main, mov pc, r0 进行间接赋值。否则出现如下错误:
(2) 其中 adr r0, thumb_func、add r0, r0, #1
首先得到thumb_func 标号的地址,并且对其进行+1操作(∵32位处理器指令总是以4字节为单位进行存放,PC每次移动也是进行+4,一般最后一位bit0=0),这里进行+1后,使r0最后一位bit0=1。
执行到bx r0时,若rm的bit0为1,则跳转时自动将CPSR中的标志T置位,即把目标地址的代码解释为Thumb代码,如果为bit0位为0的话,则跳转时自动将CPSR中的标志T复位,即把目标地址的代码解释为ARM代码。
(3)再次进行编译后,出现如下错误:
显示“memcpy”的错误,原因是出在init.c文件中的sdram_init2函数上。
3. 打开init.c文件
找到init_init2函数后,进行如下修改:
1 void sdram_init2(void) /* 没有任何输出,推断这里应该是位置无关的 */ /* 这个函数并不会修改这个数组,它只是把这些值拷贝到寄存器里边去,∴可以加一个const*/ 2 3 const static unsigned int arr[] = // 使用static静态变量,静态变量就会放在数据段里,最终重定位时, 4 0x22000000, //BWSCON 会把值从数据段中拷贝到arr[]数组多对应的地址去 5 0x00000700, //BANKCON0 6 0x00000700, //BANKCON1 7 0x00000700, //BANKCON2 在学习Thumb指令时,编译器用到memcpy函数导致make出错,原因是∵这些值肯定是保存在代码里边的,为了构造这个数组, 8 0x00000700, //BANKCON3 编译器把这些代码段里值拷贝到arr[]这个局部变量里。 9 0x00000700, //BANKCON4 10 0x00000700, //BANKCON5 11 0x18001, //BANKCON6 12 0x18001, //BANKCON7 13 0x8404f5, //REFRESH, HCLK=12MHZz: 0x008e07a3, HCLK=100MHz: 14 0xb1, //BANKSIZE 15 0x20, //MRSRB6 16 0x20, //MRSRB7 17 ; 18 volatile unsigned int *p = (volatile unsigned int *)0x48000000; 19 int i; 20 21 for ( i=0; i<13; i ++ ) 22 23 *p = arr[i]; 24 p ++; 25 26 27
最后,通过ls -l进行查看生成的.bin文件的大小。
使用Thumb指令后,
4. 看反汇编代码
前边地址仍然是4字节相加,
其他指令除bl仍为4字节外,其他指令均变为2字节增长。
总结:
如果Flash空间比较小的话,可以使用Thumb指令集,但对于ARM系统、Linux系统,Flash 空间一般以M为单位,不需要省那么点空间。所以后续使用很少。
arm指令集thumb指令集thumb-2指令集
MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集:编代码全部是32bits的,每条指令能承载更多的信息,因此使用最少的指令完成功能,所以在相同频率下运行速度也是最快的,但也因为... 查看详情
thumb指令集与arm指令集的差别
Thumb指令集 Thumb指令能够看做是ARM指令压缩形式的子集。是针对代码密度【1】的问题而提出的。它具有16为的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序仅仅运行Thumb指令而不支持ARM指令集... 查看详情
为啥要使用thumb模式,与arm相比较,thumb代码的两大优势是啥?
...16位,在代码精简的同时,性能上并没有减少多少。Thumb指令集不是完整的指令集,它是ARM指令集的子集。但是Thumb指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。所以,Thumb指令集... 查看详情
什么时候需要 GAS ELF 指令 .type、.thumb、.size 和 .section?
】什么时候需要GASELF指令.type、.thumb、.size和.section?【英文标题】:WhenareGASELFthedirectives.type,.thumb,.sizeand.sectionneeded?【发布时间】:2011-05-2407:39:44【问题描述】:我正在使用GNU作为基于ARMCortex-M3的微控制器(Thumb2指令集)的汇编... 查看详情
thumb和arm指令不能切换问题(error:unsupportedinterworkingcall(thumb->arm))(代码片段)
...败。首先要知道ARM架构的CPU分ARM态和Thumb态,执行ARM指令的时候是ARM态, 查看详情
arm汇编基础上(代码片段)
ARM是一个精简指令集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU... 查看详情
arm汇编语言基础(代码片段)
...:ARM状态为R11,Thumb状态为FP其他对应关系一一相同ARM与Thumb指令集指令格式:其中opcode为助记符cond为条件S指定其是否影响 查看详情
arm指令和thumb指令有啥区别
Thumb指令集与ARM指令的区别一般有如下几点: 跳转指令 程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。 数据处理指令 数据处理指令是对通用寄... 查看详情
基于arm的微机原理-cortex-m3处理器
...非特权对有些资源的访问受到限制或不允许访问。如部分指令(设置FAULTMASK和PRIMASK的CPS指令)对系统控制空间(SCS)的大部分寄存器的访问。访问级别:特权级和用户级出于安全考虑,防止意外、恶意访问破坏重要数据。工作模式:... 查看详情
基于arm的微机原理-cortex-m3处理器
...非特权对有些资源的访问受到限制或不允许访问。如部分指令(设置FAULTMASK和PRIMASK的CPS指令)对系统控制空间(SCS)的大部分寄存器的访问。访问级别:特权级和用户级出于安全考虑,防止意外、恶意访问破坏重要数据。工作模式:... 查看详情
汇编程序基本指令集(代码片段)
指令概述指令指令是CPU操作的基本单位,每条指令执行一个特定的操作。可以理解为:指令通知CPU执行某种操作的“命令”。CPU全部指令的集合,称为指令集指令分类机器指令:二进制格式编码的序列(一串0,1代码书写)。注意:硬件只... 查看详情
arm处理器架构的thumb指令集中关于it指令的使用
在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了IT指令,进一步增强了代码的紧凑性。Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含... 查看详情
第四周学习总结(代码片段)
第四周学习总结Y86-64指令集体系结构可见状态:程序寄存器、条件码、程序状态、程序计数器和内存比如条件码ZF——零标志,SF——符号,OF——有符号Y86-64指令整数操作指令:addq、subq、andq、xorq跳转指令:jmp、jle、jl、je、jne、... 查看详情
latex绘图示例集一(代码片段)
...境:Ubuntu16.0464位桌面版工具:TeXstudio 1.非常简单的一个程序结构图 完整代码如下:%51CTO陆巍的博客documentclass[oneside,AutoFakeBold]articleusepackagegeometry%用于页面设置%设置为A 查看详情
强制 LDR 指令将值放入 THUMB 程序集中的文字池中
】强制LDR指令将值放入THUMB程序集中的文字池中【英文标题】:ForceLDRinstructiontoplacevalueinliteralpoolinTHUMBassembly【发布时间】:2021-04-2515:27:04【问题描述】:我正在尝试使用devkitpro创建匹配的GBA反汇编,但在使用THUMB指令LDRR1,=0x3FF时... 查看详情
精简指令集和复杂指令集及指令格式(代码片段)
5.1介绍CISC:复杂指令集RISC:精简指令集5.1.1CPU模型复杂指令集和精简指令集取决于CPU中的控制器的NN=111(8051)复杂指令集N=34(ARM)精简指令集SWAP(1)<--->MOV(3)2/8定律5.1.2编程语言编程语言分为编译型和解释行编译型:... 查看详情
android逆向之--------常见davlik字节码解释(代码片段)
破解流程破解流程相关知识寄存器复杂指令集和精简指令集jvm和davlik的一些区别常见Davlik字节码解释破解程序分析修改smail文件重新签名破解流程破解Android程序流程:反编译—>分析–>修改–>回编译–>签名,这... 查看详情
cpu指令集不同导致的core分析(代码片段)
...ore信息汇总如下,可以看出是由于测试机不支持编译后的指令导致的问题:Programterminatedwithsignal4,Illegalinstruction.0x00007fad269ac973<+435>:add$0x4,%rdx0x00007fad269ac977& 查看详情