您的位置:首页 > 职场人生

同学面试笔记

2013-08-01 11:08 204 查看
ARM的四种跳转指令:

1、B跳转指令

格式:B{<COND>}<ADDR>;

功能:PC=PC+addr左移两位

由于arm是32为存储(即4个字节),PC的最低两位一直为0,所以PC不保留地址的最低两位。PC即为寄存器R15。

addr值一个24位的有符号数,他代表的是一个偏移地址,实际地址的值由汇编器来计算。

addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。

跳转范围为-32MB~+32MB

2.带返回的跳转指令BL

格式:BL {<COND>} <ADDR>;

功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。

该指令用于实现子程序调用,程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现。

例如:

BL func ;调用子程序func,保存PC到LR

。。。。 func

。。。。

MOV R15,R14 ; 子程序返回

执行:k pc-8

译码:k+1 pc-4

取消:k+2 pc

arm处理器能保证保存的指令是要执行的指令;

3.BLX带返回和状态切换的跳转指令

格式:BLX<ADDR>;或BL X <RN>;

功能:除过可以实现BL的指令外,还可以实现如下功能:

如果目标地址为TBumb指令,则程序装填从ARM状态切换为Tbumb状态。

该程序用于子程序调用和状态的切换。

4.BX带状态切换的跳转指令

格式:BX <RN>;

功能:处理器跳转到目标地址处,从那里继续执行;

目标地址为寄存器RN的值和0xFFFFFFFE(最后一位自动清零)作与操作的结果。

目标地址处的指令可以是ARM指令,也可以是Thumb指令。

RN的最低位存到CPSR的t位,此位决定了指令时ARM还是THUBM状态。为0表明是ARM指令,为1表明是THUMB指令。

在arm中是按照pc取指令的。32位可以寻址32G

thumb指令中取值是按照偶地址实现的。

ARM7的三级流水线:取值,译码,执行

用shell编程:判断一文件是不是字符设备文件,如果是将其拷贝到/dev目录下:

myfile=/path/filename # 换成你实际的文件全路径

fd=`ls -l myfile` # 获取文件详细信息

fp=${fd:0:1} # 截取第一个属性值

[ "$fp" = "c" ] && cp myfile /dev # 如果该属性值为c,则为字符设备文件,拷贝到/dev目录

嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

对这个问题有三种基本的反应 :

1). 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。

2). 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。

3). 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1<<3)

static int a;

void set_bit3(void)

{ a |= BIT3; }

void clear_bit3(void)

{ a &= ~BIT3; }

嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。 这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

一个较晦涩的方法是: *(int * const)(0x67a9) = 0xaa55; 即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: