搜索
bottom↓
回复: 5

关于GCC ARM汇编

[复制链接]

出0入0汤圆

发表于 2010-7-16 13:47:44 | 显示全部楼层 |阅读模式
下面是C程序
  1 #include <stdio.h>
  2
  3 int two(int a,int b,int c);
  4
  5 int one(int a,int b,int c,int d,int e)
  6 {
  7     int temp=two(c,d,e);
  8     int f=a+b+temp;
  9     return f;
10 }
11
12 int two(int a,int b,int c)
13 {
14     int d=a+b+c;
15     return d;
16 }
17
18 int main(void)
19 {
20     int test=one(110,210,310,410,510);
21     return test;
22 }

下面是汇编之后的汇编代码
main:
55     .fnstart
56 .LFB13:
57     @ Function supports interworking.
58     @ args = 0, pretend = 0, frame = 0
59     @ frame_needed = 0, uses_anonymous_args = 0
60     str lr, [sp, #-3]!
61     .save {lr}
62     .pad #12
63     sub sp, sp, #12
64     mov r3, #508
65     add r3, r3, #2
66     str r3, [sp, #0]
67     mov r0, #110
68     mov r1, #210
69     mov r2, #308
70     add r2, r2, #2
71     mov r3, #408
72     add r3, r3, #2
73     bl  one
74     add sp, sp, #12
75     ldr lr, [sp], #4
76     bx  lr
77     .fnend
78     .size   main, .-main
79     .ident  "GCC: (Sourcery G++ Lite 2010q1-202) 4.4.1"
80     .section    .note.GNU-stack,"",%progbits

汇编命令是:arm-none-linux-gnueabi-gcc -o helloworld_simpleO1.S -S -O1 -mcpu=arm7tdmi -Wall helloworld.c

大家注意汇编代码的第64行,我想问为什么加载C函数参数的时候为什么不直接用MOV r3,#510,而是要用MOV r3,#508;add r3,r3,#2两条语句来完成为r3赋值

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-7-16 13:55:41 | 显示全部楼层
ARM在ARM指令集中,向REG内丢立即数有限制。必须是8Bit立即数,移动偶数位方可。
Thumb指令集限制更多一些。

鉴于是7TDMI内核,详情请查阅ARM DDI0100文档。

出0入0汤圆

 楼主| 发表于 2010-7-16 14:07:21 | 显示全部楼层
回复【1楼】dr2001  
-----------------------------------------------------------------------

但是508已经是9位了,但还是用的MOV指令,楼上能详细点吗?
那个文档我搜不到啊,你能发我一份吗?
xbcoastline@gmail.com

出0入0汤圆

发表于 2010-7-16 14:29:14 | 显示全部楼层
8Bit立即数,移动偶数位。127 << 2 = 508.

出0入0汤圆

 楼主| 发表于 2010-7-16 14:34:02 | 显示全部楼层
回复【3楼】dr2001  
-----------------------------------------------------------------------

你那有这方面的资料吗?发我一份,我入手44B0没几天啊,希望大侠能指点一下啊

出0入0汤圆

发表于 2010-10-13 22:14:46 | 显示全部楼层
3楼正解~~~~
arm中#508的508是十进制数,换成二进制就是:11 1111 1100,刚好是8位立即数:1111 1111 左移两位得到。mov 的操作立即数必须是8位立即数左或右移若干位得到~~~
楼主说508是九位,是把508看成十六进制了哈~~~ 0101 0000 1000~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 03:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表