免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3901 | 回复: 13
打印 上一主题 下一主题

再次球助,汇编问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-18 16:38 |只看该作者 |倒序浏览
10可用积分
POWERPC (32位)环境下编译,我试着编译了一下这个汇编源文件,好多错误, startup.s 文件内容如下:
.file "startup.s"
.text
.align 2

        .globl _start

_start:   

   addis    r1,r0,__SP_INIT@h  
   ori      r1,r1,__SP_INIT@l
   stwu  r0,-72(r1)      
                           
   bl      main

SPIN_HERE:

   nop
   b   SPIN_HERE

.extern ExtIntHandler

.globl ExtIntTable

.globl DecrementerInt


EXTERNAL_INTERRUPT_VECTOR: .equ 0x500   #   问题出在这里,在POWERPC 下,不允话这样的变量定义吗...
R0_OFFSET:           .equ         (0*4)
R1_OFFSET:           .equ         (1*4)
R2_OFFSET:           .equ         (2*4)
R3_OFFSET:           .equ         (3*4)
R4_OFFSET:           .equ         (4*4)
R5_OFFSET:           .equ         (5*4)
R6_OFFSET:           .equ         (6*4)
R7_OFFSET:           .equ         (7*4)
R8_OFFSET:           .equ         (8*4)
R9_OFFSET:           .equ         (9*4)
R10_OFFSET:        .equ         (10*4)
R11_OFFSET:        .equ         (11*4)
R12_OFFSET:        .equ         (12*4)         # R12 Stack Offset
SRR0_OFFSET:        .equ         (13*4)         # SRR0 Stack Offset
SRR1_OFFSET:        .equ         (14*4)         # SRR1 Stack Offset
LR_OFFSET:           .equ         (15*4)         # LR Stack Offset
CTR_OFFSET:        .equ         (16*4)         # CTR Stack Offset
XER_OFFSET:        .equ         (17*4)         # XER Stack Offset
CR_OFFSET:           .equ         (18*4)         # CR Stack Offset
STACK_SZ:           .equ         (20*4)   # Quad-Word Aligned Interrupt Stack Frame
C_FRAME_SZ:        .equ         (4*4)    # Quad-Word Aligned C Frame Size

SRR0:    .equ      26    # Save/Restore Register 0
SRR1:    .equ      27    # Save/Restore Register 1

.text
DecrementerInt:

    rfi

ExtIntTable:

    stwu        r0, -STACK_SZ+R0_OFFSET(r1)

    mfspr        r0, SRR0
    stw        r0, SRR0_OFFSET(r1)
    mfspr        r0, SRR1
    stw        r0, SRR1_OFFSET(r1)

    stw        r3,  R3_OFFSET(r1)    # Store r3
    stw        r4,  R4_OFFSET(r1)    # Store r4
    stw        r5,  R5_OFFSET(r1)    # Store r5
    stw        r6,  R6_OFFSET(r1)    # Store r6
    stw        r7,  R7_OFFSET(r1)    # Store r7
    stw        r8,  R8_OFFSET(r1)    # Store r8
    stw        r9,  R9_OFFSET(r1)    # Store r9
    stw        r10, R10_OFFSET(r1)   # Store r10
    stw        r11, R11_OFFSET(r1)   # Store r11
    stw        r12, R12_OFFSET(r1)   # Store r12

    mflr        r0
    stw        r0, LR_OFFSET(r1)

    mfctr   r0
    stw        r0, CTR_OFFSET(r1)

    mfxer   r0
    stw        r0, XER_OFFSET(r1)

    mfcr        r0
    stw        r0, CR_OFFSET(r1)

    subi        r1,r1,C_FRAME_SZ

    addi        r3,r0,EXTERNAL_INTERRUPT_VECTOR

    bla ExtIntHandler

    addi        r1,r1,C_FRAME_SZ

    lwz        r0, CR_OFFSET(r1)
    mtcrf        0xff,r0

    lwz        r0, XER_OFFSET(r1)
    mtxer   r0

    lwz        r0, CTR_OFFSET(r1)
    mtctr   r0

    lwz        r0, LR_OFFSET(r1)
    mtlr        r0

    lwz        r12, R12_OFFSET(r1)   # Store r12
    lwz        r11, R11_OFFSET(r1)   # Store r11
    lwz        r10, R10_OFFSET(r1)   # Store r10
    lwz        r9,  R9_OFFSET(r1)    # Store r9
    lwz        r8,  R8_OFFSET(r1)    # Store r8
    lwz        r7,  R7_OFFSET(r1)    # Store r7
    lwz        r6,  R6_OFFSET(r1)    # Store r6
    lwz        r5,  R5_OFFSET(r1)    # Store r5
    lwz        r4,  R4_OFFSET(r1)    # Store r4
    lwz        r3,  R3_OFFSET(r1)    # Store r3

    lwz        r0, SRR1_OFFSET(r1)
    mtspr        SRR1, r0

    lwz        r0, SRR0_OFFSET(r1)
    mtspr        SRR0, r0

    lwz        r0, R0_OFFSET(r1)
    addi        r1, r1, STACK_SZ        

    rfi

.word 64   # pad space

编译后出错信息如下:ppc-linux-as -o startup.o startup.s
startup.s: Assembler messages:
startup.s:28: Error: expected symbol name
startup.s:29: Error: expected symbol name
startup.s:30: Error: expected symbol name
startup.s:31: Error: expected symbol name
startup.s:32: Error: expected symbol name
startup.s:33: Error: expected symbol name
startup.s:34: Error: expected symbol name
startup.s:35: Error: expected symbol name
startup.s:36: Error: expected symbol name
startup.s:37: Error: expected symbol name
startup.s:38: Error: expected symbol name
startup.s:39: Error: expected symbol name
startup.s:40: Error: expected symbol name
startup.s:41: Error: expected symbol name
startup.s:42: Error: expected symbol name
startup.s:43: Error: expected symbol name
startup.s:44: Error: expected symbol name
startup.s:45: Error: expected symbol name
startup.s:46: Error: expected symbol name
startup.s:47: Error: expected symbol name
startup.s:48: Error: expected symbol name
startup.s:50: Error: expected symbol name

startup.s:28: Error: expected symbol name 这个地方对应的语句为: EXTERNAL_INTERRUPT_VECTOR: .equ 0x500
startup.s:29: Error: expected symbol name 对应的语句为: R0_OFFSET:           .equ         (0*4)
......................不允许这样定义吗? 要如何定义 .equ   EXTERNAL_INTERRUPT_VECTOR, 0x500

/****************************************************************************
*                     Linker file for aaa.lnx
*****************************************************************************/

MEMORY
{
   stack:   ORIGIN = 0x00003000,  LENGTH = 0x1000
   ram1:    ORIGIN = 0x00004000,  LENGTH = 0x8000
   ram_rest:ORIGIN = 0x0000c000,  LENGTH = 0x3F57FF
}

SECTIONS
{
   .data : {} > ram1
   .sdata (DATA) : {} > ram1
   .bss  : {} > ram1
   .sbss  : {} > ram1
   .text  : {} > ram_rest
}


__SP_INIT       = ADDR(stack)+SIZEOF(stack);      
__SP_END        = ADDR(stack);

上面这个文件怎么与  编译后startup.o 进行链接 ?

[ 本帖最后由 nflx 于 2009-5-19 09:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-18 19:01 |只看该作者
看了几条指令,是ppc的指令集里面的指令,可能是缺少头文件所以找不到定义,ppc的start.s里面通常会定义很多GOT_ENTRY(...)

论坛徽章:
0
3 [报告]
发表于 2009-05-19 04:57 |只看该作者
原帖由 garyv 于 2009-5-18 19:01 发表
看了几条指令,是ppc的指令集里面的指令,可能是缺少头文件所以找不到定义,ppc的start.s里面通常会定义很多GOT_ENTRY(...)

终于遇到高人了, 下面这个是头文件,但我不知道怎么把它和 startup.s 一起进行编译?
/****************************************************************************
*                     Linker file for aaa.lnx
*****************************************************************************/

MEMORY

{
   stack:   ORIGIN = 0x00003000,  LENGTH = 0x1000
   ram1:    ORIGIN = 0x00004000,  LENGTH = 0x8000
   ram_rest:ORIGIN = 0x0000c000,  LENGTH = 0x3F57FF
}

SECTIONS

{
   .data : {} > ram1
   .sdata (DATA) : {} > ram1
   .bss  : {} > ram1
   .sbss  : {} > ram1
   .text  : {} > ram_rest
}


__SP_INIT       = ADDR(stack)+SIZEOF(stack);      
__SP_END        = ADDR(stack);

论坛徽章:
0
4 [报告]
发表于 2009-05-19 09:36 |只看该作者

回复 #3 nflx 的帖子

我并非高人。
这个linker file是给LINKER用的,应该不是缺这些东西,如果找到了相关的标记定义文件的话,直接在最前面:
#include <xxx.h>
即可

论坛徽章:
0
5 [报告]
发表于 2009-05-19 11:18 |只看该作者
原帖由 garyv 于 2009-5-19 09:36 发表
我并非高人。
这个linker file是给LINKER用的,应该不是缺这些东西,如果找到了相关的标记定义文件的话,直接在最前面:
#include
即可

楼主谦虚了, 我想问一下的是,这个LINKER文件链接的时候, 如何链接?   我真的不知道怎么用这个链接文件, 用 ppc-linux-ld 如何链接?
我试着编译startup.s成功了(不用这个链接文件) ,但是运行时,提示找不到 __SP_INIT 这个函数, 哪是因为我没有用这个链接文件的原因吧?
我如何才能将这个链接文件在编译时使用起来.

[ 本帖最后由 nflx 于 2009-5-19 11:26 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-05-19 12:50 |只看该作者
这个很像是bootloader的上电起始代码,你找个uboot参考一下吧,这个link script到底怎么用我也不太清楚,当然不能独立编译这个文件了,这不是linux下的application

论坛徽章:
0
7 [报告]
发表于 2009-05-19 15:50 |只看该作者
__SP_INIT       应该是在哪个文件中有定义的标号,

这是定义的一个栈首地址啊, 应该是startup.s初始化栈那一段, 这个链接文件, 在对程序编译的时候会给程序分配内存地址控件

但是在你的startup.s里面没发现这个标号, ARM 里面的堆栈好像都是在 startup.s里面初始化的

[ 本帖最后由 star316 于 2009-5-19 15:55 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-05-19 21:06 |只看该作者
原帖由 star316 于 2009-5-19 15:50 发表
__SP_INIT       应该是在哪个文件中有定义的标号,

这是定义的一个栈首地址啊, 应该是startup.s初始化栈那一段, 这个链接文件, 在对程序编译的时候会给程序分配内存地址控件

但是在你的startup.s里面 ...

在我的第一贴的 aaa.lnx 里面有定义啊,  现在我要问的是,我如何在编译中用上这个 aaa.lnx  ?

论坛徽章:
0
9 [报告]
发表于 2009-05-19 23:23 |只看该作者
应该是使用 arm-linux-ld 这个工具吧

论坛徽章:
0
10 [报告]
发表于 2009-05-20 11:07 |只看该作者
原帖由 star316 于 2009-5-19 23:23 发表
应该是使用 arm-linux-ld 这个工具吧

不行啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP