主题 : 汇编如何产生类似数组一样的数据呢? 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 98591
精华: 0
发帖: 60
金钱: 300 两
威望: 60 点
综合积分: 120 分
注册时间: 2013-12-01
最后登录: 2018-07-12
楼主  发表于: 2013-12-03 23:18

 汇编如何产生类似数组一样的数据呢?

我在《嵌入式Linux应用开发完全手册》里面看到一个关于如何使用SDRAM的程序,它原本的程序是在linux下编译的,现在我想把这些代码在RVDS4.0下编译,然后在单步调试。
在linux下可以顺利编译的汇编代码,在RVDS4.0里出现了好多错误,经过我的修改,只剩下一些代码我不会修改了,在这里求助大家了
    INCLUDE     s3c6410.inc
    INCLUDE     image_cfg.inc
    IMPORT main
    AREA |C$$code|, CODE, READONLY
    EXPORT start
MEM_CTL_BASE    EQU      0x48000000
SDRAM_BASE        EQU      0x30000000
start
    bl  disable_watch_dog;
    bl  memsetup                        ; 设置存储控制器
    bl  copy_steppingstone_to_sdram     ; 复制代码到SDRAM中
    ldr pc, =on_sdram                   ; 跳到SDRAM中继续执行
on_sdram
    ldr sp, =0x34000000                 ; 设置堆栈
    bl  main
halt_loop
    b   halt_loop

disable_watch_dog
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      ; 返回

copy_steppingstone_to_sdram
; 将Steppingstone的4K数据全部复制到SDRAM中去
; Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
    
    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024;
a
    ldr r4, [r1],#4     ; 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     ; 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          ; 判断是否完成:源地址等于Steppingstone的未地址?
    bne a               ; 若没有复制完,继续
    mov pc,     lr      ; 返回

memsetup
    ; 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE       ; 存储控制器的13个寄存器的开始地址
    adrl    r2, mem_cfg_val         ; 这13个值的起始存储地址
    add r3,     r1, #52             ; 13*4 = 52
ab
    ldr r4,     [r2], #4            ; 读取设置值,并让r2加4
    str r4,     [r1], #4            ; 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  ; 判断是否设置完所有13个寄存器
    bne ab                          ; 若没有写成,继续
    mov pc,     lr                  ; 返回


    align 4
mem_cfg_val
    ; 存储控制器13个寄存器的设置值,在编译的时候从这儿发生错误
    .long   0x22011110      ; BWSCON
    .long   0x00000700      ; BANKCON0
    .long   0x00000700      ; BANKCON1
    .long   0x00000700      ; BANKCON2
    .long   0x00000700      ; BANKCON3  
    .long   0x00000700      ; BANKCON4
    .long   0x00000700      ; BANKCON5
    .long   0x00018005      ; BANKCON6
    .long   0x00018005      ; BANKCON7
    .long   0x008C07A3      ; REFRESH
    .long   0x000000B1      ; BANKSIZE
    .long   0x00000030      ; MRSRB6
    .long   0x00000030      ; MRSRB7

    
      END

错误就出现在最后的那些.long这些行
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2013-12-04 12:07
RVDS4.0可以支持调试gcc编译的汇编程序,你不需要任何改写。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 98591
精华: 0
发帖: 60
金钱: 300 两
威望: 60 点
综合积分: 120 分
注册时间: 2013-12-01
最后登录: 2018-07-12
2楼  发表于: 2013-12-05 14:07

 回 1楼(kasim) 的帖子

你说的是在Linux经过编译后的.bin文件,可以拿到RVDS4.0那儿进行调试?
我当初是把汇编文件添加到RVDS4.0的工程里进行编译,会发生很多错误
级别: 侠客
UID: 98591
精华: 0
发帖: 60
金钱: 300 两
威望: 60 点
综合积分: 120 分
注册时间: 2013-12-01
最后登录: 2018-07-12
3楼  发表于: 2013-12-05 14:09

 回 1楼(kasim) 的帖子

还是说只在linux编译的时候,只做预处理和编译,而不做汇编和链接?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2013-12-05 15:24
你说的是在Linux经过编译后的.bin文件,可以拿到RVDS4.0那儿进行调试?

是的。准确地说,.bin文件是用来下载到开发板上运行的. 调试需要的是生成的ELF格式的镜像,也就是经过像arm-elf-gcc这样的交叉编译器链接之后的输出。事实上.bin格式文件也是从这个镜像通过objcopy这样的东西生成的。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."