网站大量收购独家精品文档,联系QQ:2885784924

实验二ARM指令系统试验.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二ARM指令系统试验

实验二 ARM指令系统试验 讲师:杨行 【实验目的】 1、了解ARM汇编语言 2、掌握简单C语言嵌套ARM汇编语言编程; 3、了解APCS规范; 【实验原理】 一、介绍 APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。 APCS 定义了: 对寄存器使用的限制。 使用栈的惯例。 在函数调用之间传递/返回参数。 可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。 APCS 不一个单一的给定标准,而是一系列类似但在特定条件下有所区别的标准。例如,APCS-R (用于 RISC OS)规定在函数进入时设置的标志必须在函数退出时复位。在 32 位标准下,并不是总能知道进入标志的(没有 USR_CPSR),所以你不需要恢复它们。如你所预料的那样,在不同版本间没有相容性。希望恢复标志的代码在它们未被恢复的时候可能会表现失常... 如果你开发一个基于 ARM 的系统,不要求你去实现 APCS。但建议你实现它,因为它不难实现,且可以使你获得各种利益。但是,如果要写用来与编译后的 C 连接的汇编代码,则必须使用 APCS。编译器期望特定的条件,在你的加入(add-in)代码中必须得到满足。一个好例子是 APCS 定义 a1 到 a4 可以被破坏,而 v1 到 v6 必须被保护。 二、 C语言嵌套ARM汇编语言 int (*my_printf)(const char *format, ...); int main(void) { int n = 5; int m = 1; int ret; my_printf = (void *)0x33f963a8; // 1 + 2 * 3 - 5 __asm__ __volatile__( /*汇编程序*/ mov r0, %1\n mov r1, %2\n sub r2, r0, r1\n mov %0, r2\n :=r(ret) /*输出部,=代表输出*/ :r(n),r(m) /*输入部,r代表和寄存器相关联*/ :r0,r1,r2 /*保护部*/ ); my_printf([ ret = %d]\n, ret); return 0; } 三、 汇编语言编程 .text .global _start _start: @这个是裸板程序的入口函数 @lr寄存器是程序链接寄存器,是pc的备份 stmfd sp!,{r0-r12,lr} @函数跳转的时候,保存现场 bl main ldmfd sp!,{r0-r12,pc} @函数跳转的时候,恢复现场 【实验仪器】 1、装有Linux操作系统的PC机一台; 2、mini2440实验开发平台一套 【实验内容】 1、 在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的和,通过串口输出; 以下是输入两个个位数然后计算其和; int (*my_getc)(); int (*my_printf)(const char *format,...); int _start() { char ch; int a,b,c; my_getc=(void *)0x33f965f0; my_printf=(void *)0x33f963a8; ch=my_getc(); my_printf(a= %c\n,ch); a=ch-48; ch=my_getc(); my_printf(b= %c\n,ch); b=ch-48; __asm__ __volatile__( mov r0,%1\n mov r1,%2\n add r2,r1,r0\n mov %0,r2\n :=r(c) :r(a),r(b) :r0,r2,r3); my_printf(%d+%d=%d\n,a,b,c); return 0; } 2、 在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的积,通过串口输出; 以下是计算两个个位数积的源程序 int (*my_getc)(); int (*my_printf)(const char *format,...); int _start() { char ch; int a,b,c; my_getc=(void *)0x33f965f0; my_

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档