thumb指令集程序示例(代码片段)

家门Jm 家门Jm     2022-11-02     634

关键词:

在上节课中我们介绍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& 查看详情