2022年编译器对RW和ZI的处理 .pdf

上传人:Q****o 文档编号:27942833 上传时间:2022-07-26 格式:PDF 页数:5 大小:125.95KB
返回 下载 相关 举报
2022年编译器对RW和ZI的处理 .pdf_第1页
第1页 / 共5页
2022年编译器对RW和ZI的处理 .pdf_第2页
第2页 / 共5页
点击查看更多>>
资源描述

《2022年编译器对RW和ZI的处理 .pdf》由会员分享,可在线阅读,更多相关《2022年编译器对RW和ZI的处理 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课题名称:编译器对 RW 和 ZI 的处理姓名:安钢学号: 103229 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 一、 实验目的:C编译器在编译连接C程序时,一般是将程序分成代码段,初始化数据段,未初始化数据段, 这三个段通常是在存储器中分开放置,但又有一些规律, 即代码段放在一个位置, 未初始化数据段是紧接着初始化数据段之后。本实验的目的主要就是为了验证编译器的这种处理方式。二、 实验步骤2.1 实验程序设计为了研究程

2、序在储存器中存储位置的规律,设计了一个简单的函数如下,函数有如下特点,(1)为了便于跟踪反汇编,以说明问题更深层次的方面,main函数里使用了内嵌汇编, (2)对编译器设置了code 地址和数据地址,具体设置如下图( 3)设置了几个简单变量,例子简单但能够更深入的分析问题的本质。以上特点都是为了说清楚反汇编的处理。上图重点在 RO BASE=0X8000 RW BASE=0X10000 后面将会看到此设置的意义。实验程序如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共

3、 5 页 - - - - - - - - - #include int SPACE , WI , LO=15 , WI1=6 , WI2=10 ; void main(void) _asm add WI,WI1,WI2 mul SPACE,LO,WI / return(SPACE); 如示,设置了未定义的SPACE , WI 和定义了的LO=15 , WI1=6 , WI2=10 后面的反汇编将说明每一个变量在存储器中应存放的精确地址。2.2 反汇编的处理为了方便说明,主要分析放在代码的注释部分,结论性的分析将放在代码后面,; 编译器自动的预先处理;注意 此处是从0 x00008000 开始执

4、行对照上面所作设置。 。 。_main 0 xe28f8090 add r8,pc,#0 x90 ; #0 x8098 ; 跳到_region_table ;那里放了4 个编译器系统设置的4 个常量00008004 0 xe898000f ldmia r8,r0-r3 ; 将 4 个量放入 R0-R3, 00008008 0 xe0800008 add r0,r0,r8 0000800c 0 xe0811008 add r1,r1,r8 00008010 0 xe0822008 add r2,r2,r8 00008014 0 xe0833008 add r3,r3,r8 00008018 0

5、xe240b001 sub r11,r0,#1 ;R11=R0-1 0000801c 0 xe242c001 sub r12,r2,#1 ;R12=R2-1 _move_region 0 xe1500001 cmp r0,r1 00008024 0 x0a00000e beq _zero_region ;R0=R1 时跳到 _zero_region 00008028 0 xe8b00070 ldmia r0!,r4-r6 ;若 R0! =R1 将 R0 指向的内容放入;r4-r6 同时 R0 指针更新0000802c 0 xe1540005 cmp r4,r5 ;若 R4=R5,跳回到_mov

6、e_region 00008030 0 x0afffffa beq _move_region 00008034 0 xe3140001 tst r4,#1 ;测试 R4 第 0 位是否为1 00008038 0 x1084400b addne r4,r4,r11 ;若不为 1 则 R4=R4+R11 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 0000803c 0 xe3150001 tst r5,#1 ;测试 R5 第 0

7、 位是否为1 00008040 0 x1085500b addne r5,r5,r11 ;若不为 1 则 R5=R5+R11 00008044 0 xe3150002 tst r5,#2 ;测试 R5 第 1 位是否为1 00008048 0 x10855009 addne r5,r5,r9 ;若不为 1 则 R5=R5+R9 0000804c 0 xe3c55003 bic r5,r5,#3 ;清除 R5 的第 0,1 位的 1 _move_loop 0 xe2566004 subs r6,r6,#4 ;R6=R6-4 00008054 0 x24947004 ldrcs r7,r4,#4

8、;大于等于00008058 0 x24857004 strcs r7,r5,#4 0000805c 0 x8afffffb bhi _move_loop ;大于00008060 0 xeaffffee b _move_region _zero_region 0 xe1520003 cmp r2,r3 ;R2=R3 时跳到_rt_entry /*注 此处添加_rt_entry 后面的部分代码。 。 。 。 。 。 。_rt_entry 0 xeb00004d bl _rt_stackheap_init ;由函数名知是堆栈初始化000080e4 0 xeb00000d bl _rt_lib_ini

9、t ;由函数名知是关于库的初始化000080e8 0 xebffffee bl main ;初始化完成后, 即进程环境初始化后,跳到 main 处;BL 表示 main 完后还会跳回来000080ec 0 xea000005 b exit ;MAIN 执行完,执行exit / UNIX 系统中, main 进程执行前G 编译器要进行例行处理,以获得命令行参数和环境表,执行完 main 后自动执行exit 以关闭 I/O 流,释放进程的资源其调用形式形如EXIT(main (argc,argv)); 可见 ADS 的编译器与UNIX 大同小异*/* /此处以分析过main 执行完的处理,故后面将

10、略去相关分析。 。 。/ 接_zero_region 0 xe1520003 cmp r2,r3 00008068 0 x0b00001c bleq _rt_entry 0000806c 0 xe3a07000 mov r7,#0 ;R2!=R3 时00008070 0 xe8b20030 ldmia r2!,r4,r5 ;基本同上分析00008074 0 xe3140001 tst r4,#1 00008078 0 x1084400c addne r4,r4,r12 0000807c 0 xe3140002 tst r4,#2 00008080 0 x10844009 addne r4,r4

11、,r9 00008084 0 xe3c44003 bic r4,r4,#3 _zero_loop 0 xe2555004 subs r5,r5,#4 0000808c 0 x24847004 strcs r7,r4,#4 00008090 0 x8afffffc bhi _zero_loop 00008094 0 xeafffff2 b _zero_region ;跳回到 _zero_region _region_table 0 x00000310 dcd 0 x00000310 . 0000809c 0 x00000334 dcd 0 x00000334 4. 000080a0 0 x000

12、00334 dcd 0 x00000334 4. 000080a4 0 x0000034c dcd 0 x0000034c L. ;可见以上 4 个常量就是说明编译器如何存放代码和数据段的;下面的分析将更加直观名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - ;程序主流程从这里开始;与前面的设置对应可以很清晰的看到初始化了的变量存放在#0 x00010000 处, 和设置的一样! ! !Main 0 xe59f1020 * ldr

13、 r1,0 x000080d0 ; = #0 x00010000 ;R1=初始化数据区000080ac 0 xe9910005 ldmib r1,r0,r2 ;初始化数据区前两个数取出来&R1+8 000080b0 0 xe0800002 add r0,r0,r2 ;相加WI1+WI2=R0 R1 指向 LO 000080b4 0 xe59f2018 ldr r2,0 x000080d4 ; = #0 x0001000c ;指针到第13 字节000080b8 0 xe5820004 str r0,r2,#4 ; R0 存入第 17 字节处即 WI 处;完成了 add WI,WI1,WI2 ;此

14、时R1 指向 LO r2,指向 SPACE ;R0=WI 000080bc 0 xe5911000 ldr r1,r1,#0 ;将初始化数据区中的LO 取出000080c0 0 xe0000091 mul r0,r1,r0 ;MUL WI,LO,WI 000080c4 0 xe5820000 str r0,r2,#0 ;将 WI 存入未初始化变量区的SPACE ;至此 程序主流程已完成;这前后大都是编译器自动的处理,前面已有简单的分析,故略去。3 实验结论C编译器在编译连接C程序时, 一般是将程序分成代码段, 初始化数据段,未初始化数据段, 这三个段通常是在存储器中分开放置,但又有一些规律, 即代码段放在一个位置, 未初始化数据段是紧接着初始化数据段之后。本实验主要验证了编译器的这种处理方式。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁