实验二:ARM指令

实验器材

硬件

  • 树莓派板子一块;
  • 5V/1A电源一个;
  • microUSB线一根;
  • USB-TTL串口线一根(FT232RL芯片或PL2303芯片)。
  • PC(Windows/MacOS/Linux)一台;
  • 以太网线一根;
  • 路由器一台

软件

  • PC上的USB-TTL串口线配套的驱动程序;
  • PC上的串口终端软件putty

实验步骤

给出各项测试所用的C代码和产生的汇编代码情况,并解释汇编代码

(1)生成了Thumb
指令还是 ARM 指令:如何通过编译参数改变,相同的程序,ARM和Thumb编译的结果有何不同, 如指令本身和整体目标代码的大小等;

a.
编写c代码

b.
编译

结果如下:

指令程度为32位,gcc默认使用arm指令集

c.
使用Thumb编译

结果如下:

指令长度是16

(2)对于ARM
指令,能否产生条件执行的指令;

a.
编写c代码

b.
编译

查看结果:

可以看到有ble等条件分支指令的出现,即ARM支持条件执行指令。

(3)设计 C
的代码场景,观察是否产生了寄存器移位寻址;

a.
编写c代码

b.
编译

查看结果:

可以看到左移指令lsl,所以ARM支持寄存器移位寻址

(4)设计 C
的代码场景,观察一个复杂的 32 位数是如何装载到寄存器的;

a.
编写c代码

b.
编译

查看结果:

可以看到ARM指令将大数字存在命令段,通过ldr指令去加载,而非MIPS等指令集使用lui和ori来实现32位大数字的实现。

(5)写一个 C的多重函数调用的程序,观察和分析:
a. 调用时的返回地址在哪里? b. 传入的参数在哪里? c.
本地变量的堆栈分配是如何做的? d. 寄存器是 caller
保存还是 callee 保存?是全体保存还是部分保存?

a.
编写c程序

b.
编译

查看结果:

调用时的返回地址在LR中。

传入的参数在R0 R1 R2 R3四个寄存器中,多余的参数放在堆栈中。

本地变量存放在堆栈高地址,传进来的参数存放在堆栈低地址。

R0到R3由caller保存,R4以上由callee保存。全体保存。

(6)MLA
是带累加的乘法,尝试要如何写 C
的表达式能编译得到MLA 指令。

a.
编写c程序

b.
编译

查看结果:

可以看出,优化后的代码使用了MLA命令。

(7)BIC是对某一个比特清零的指令,尝试要如何写 C
的表达式能编译得到 BIC 指令。

a.
编写c程序

b.
编译

查看结果:

(8)编写一个汇编函数,接受一个整数和一个指针做为输入,指针所指应为一个字符串,该汇编函数调用C语言的
printf()函数输出这个字符串的前n个字符,n即为那个整数。在C语言写的main()函数中调用并传递参数给这个汇编函数 来得到输出。

汇编程序:

00000000 <f>:

0:  e92d4800        push    {fp, lr}

4:  e28db004        add     fp, sp, #4

8:  e24dd010        sub     sp, sp, #16

c:  e50b0010        str     r0, [fp, #-16]

10:  e50b1014        str     r1, [fp, #-20]

14:  e3a03000        mov     r3, #0

18:  e50b3008        str     r3, [fp, #-8]

1c:  ea000008        b       44 <f+0x44>

20:  e51b3008        ldr    r3, [fp, #-8]

24:  e51b2014        ldr     r2, [fp, #-20]

28:  e0823003        add     r3, r2, r3

2c:  e5d33000        ldrb    r3, [r3]

30:  e1a00003        mov     r0, r3

34:  ebfffffe        bl      0 <putchar>

38:  e51b3008        ldr    r3, [fp, #-8]

3c:  e2833001        add     r3, r3, #1

40:  e50b3008        str     r3, [fp, #-8]

44:  e51b2008        ldr     r2, [fp, #-8]

48:  e51b3010        ldr     r3, [fp, #-16]

4c:  e1520003        cmp     r2, r3

50:   bafffff2        blt    20 <f+0x20>

54:  e3a0000a        mov     r0, #10

58:  ebfffffe        bl      0 <putchar>

5c:  e24bd004        sub     sp, fp, #4

60:  e8bd8800        pop     {fp, pc}

C程序:

时间: 2024-07-31 18:24:47

实验二:ARM指令的相关文章

汇编实验二 用机器指令和汇编指令编程

实验二  用机器指令和汇编指令编程 任务一: (1)用E命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H. (2)用A命令输入汇编指令: (3)用T命令单步执行: 在用T命令执行MOV SS,AX时,它的下一条指令MOV  SP,0100同时执行. (4)填写书上内容: 任务二: 观察如图实验过程,分析为什么2000:0~2000:f中的内容会发生改变. 任意时刻,SS:SP指向栈顶元素,初始时栈为空.初始时,栈顶为0B

20145221高其&amp;20145326蔡馨熠《信息安全系统设计基础》实验二 固件设计

20145221高其&20145326蔡馨熠<信息安全系统设计基础>实验二 固件设计 实验目的与要求 了解多线程程序设计的基本原理,学习 pthread 库函数的使用. 了解在 linux 环境下串行程序设计的基本方法. 掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用.学习使用多线程来完成串口的收发处理. 熟悉linux开发环境,学会基于S3C2410的linux开发环境的配置和使用.使用linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的

信息安全系统设计基础 实验二固体设计 20135327郭皓 20135329 李海空

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础                         班级:1353 姓名:郭皓 李海空 学号:20135327  20135329 成绩:             指导教师:娄嘉鹏        实验日期:2015.11.10 实验密级:         预习程度:         实验时间:15:30~18:00 仪器组次:          必修/选修:            实验序号:1 实验名称: 

20145317 《信息安全系统设计基础》实验二 固件设计

北京电子科技学院(BESTI) 实     验    报     告 课程: 密码系统设计基础                                                               班级: 1453班 姓名:彭垚                                                                               学号:20145317 成绩:                              

ARM指令分类及其寻址方式

ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: •异常中断产生指令: 二.ARM指令的一般编码格式 ARM指令字长为固定的32位.一条典型的ARM指令语法格式及编码格式如下: 语法格式: <opcode>{<cond>}{s}   <Rd>,<Rn>,<shifter_operand> •<

“Linux内核分析”实验二报告

张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内容总结 1.计算机工作“三大法宝” 首先,计算机工作原理最重要的三个内容就是:存储程序计算机工作模型.中断机制和函数调用堆栈. 存储程序计算机工作模型是计算机系统最最基础性的逻辑结构: 中断机制是多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序: 函数调用堆栈是高级语言得以

实验二(固件设计)问题总结

实验二问题总结 问题链接:20145202.20145225.20145234 <信息安全系统设计基础>实验二 固件设计 (1)超级终端问题及解决方案 问题:打开超级终端后,arm机的信息始终没有显示在超级终端的窗口中. 解决:找到了原因,是串口线接错了位置,不应该接1,改为接0后,超级终端就显示正常了. (2)IP问题及解决方案 问题:需要把实验箱.虚拟机Redhat.WinXP的IP设置为同一网段. 解决:首先查看实验箱的IP地址,设置另外两个的地址使其处于同一网段,注意这里设置完后需重启

FPGA与simulink联合实时环路系列——实验二LED

实验二LED 实验内容 ????在实验一的基础上,将simulink产生的测试信号输出到FPGA开发板上的LED灯进行显示,这里要在生成的硬件模型上进行修改,将传送到FPGA的信号输出到8个LED灯上,并且对信号进行分配引脚. 创建模型 ????在Matlab的指令窗口输入以下指令,hdlsetuptoolpath('ToolName','Altera Quartus II','ToolPath','C:\altera\11.0\quartus\bin\quartus.exe(修改为软件安装的路

实验二-固件设计 20135211李行之 20135216刘蔚然

北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础                               班级:1352                                                   姓名:(按贡献大小排名)李行之 刘蔚然 学号:(按贡献大小排名)20135211 20135216                   成绩:                     指导教师:娄嘉鹏                 实验日期