xbcoastline 发表于 2010-7-16 13:47:44

关于GCC ARM汇编

下面是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, !
61   .save {lr}
62   .pad #12
63   sub sp, sp, #12
64   mov r3, #508
65   add r3, r3, #2
66   str r3,
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   blone
74   add sp, sp, #12
75   ldr lr, , #4
76   bxlr
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赋值

dr2001 发表于 2010-7-16 13:55:41

ARM在ARM指令集中,向REG内丢立即数有限制。必须是8Bit立即数,移动偶数位方可。
Thumb指令集限制更多一些。

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

xbcoastline 发表于 2010-7-16 14:07:21

回复【1楼】dr2001
-----------------------------------------------------------------------

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

dr2001 发表于 2010-7-16 14:29:14

8Bit立即数,移动偶数位。127 << 2 = 508.

xbcoastline 发表于 2010-7-16 14:34:02

回复【3楼】dr2001
-----------------------------------------------------------------------

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

carvencao 发表于 2010-10-13 22:14:46

3楼正解~~~~
arm中#508的508是十进制数,换成二进制就是:11 1111 1100,刚好是8位立即数:1111 1111 左移两位得到。mov 的操作立即数必须是8位立即数左或右移若干位得到~~~
楼主说508是九位,是把508看成十六进制了哈~~~ 0101 0000 1000~~~
页: [1]
查看完整版本: 关于GCC ARM汇编