主题 : 关于mini2440程序历程中的错误代码 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 70806
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2012-05-25
最后登录: 2016-02-01
楼主  发表于: 2013-10-01 19:31

 关于mini2440程序历程中的错误代码

裸奔的keil程序中 asm调用汇编代码的过程中,source code :
;#*********************************************************************************************
;# File:    asmcode.s
;# Author:    Hanson    
;# 嵌入式家园   www.embedclub.com
;# 上海嵌入式家园-开发板商城   http://embedclub.taobao.com
;# Desc: 汇编程序调用C程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i的和
;本程序使用5个参数,分别使用寄存器R0存储第一个参数,R1、R2、R3分别存储第二、三、四个参数,第五个参数利用堆栈传送
;函数返回值保持在R0中        
;# History:
;#*********************************************************************************************


Stack_Size  EQU     0x00000400     ;指定栈的大小

    AREA    STACK, DATA, NOINIT, READWRITE, ALIGN=3    ;声明一个数据段,初始化为0
Stack_Mem    SPACE   Stack_Size ;分配一片内存单元用作栈空间

    PRESERVE8 ;声明8字节对齐    
    
    AREA CAsm_Test2, CODE, READONLY
    ENTRY
    CODE32
start
;初始化栈。注意栈只能先分配栈空间,并初始化后,才能使用SP指针
    LDR     R0, =Stack_Mem    
;  set its Stack Pointer
    MOV     SP, R0           ;设置栈指定SP,指向Stack_Mem地址空间
    SUB     SL, SP, #Stack_Size

    BL call_g
    B stop

call_g    
    IMPORT g              ;使用伪操作IMPORT声明C程序g()
    MOV R0, #0x1
    STR LR, [SP, #-4]!    ;保存返回地址

    ADD R1, R0, R0        ;假设进入程序f时,r0中值为i,r1值设为2*i
    ADD R2, R1, R0        ;r2值设为3*i
    ADD R3, R1, R2        ;r3值设为5*i
    STR R3, [SP, #-4]!    ;第五个参数5*i通过数据栈传递
    ADD R3, R1, R1        ;r3值设为4*i

    BL  g                 ;调用C程序g()
    NOP

    ADD SP, SP, #4        ;调整数据栈指针,准备返回
    LDR PC, [SP], #4      ;返回

stop
    B stop

    END

其中的初始化堆栈部分
start
;初始化栈。注意栈只能先分配栈空间,并初始化后,才能使用SP指针
    LDR     R0, =Stack_Mem    
;  set its Stack Pointer
    MOV     SP, R0           ;设置栈指定SP,指向Stack_Mem地址空间
    SUB     SL, SP, #Stack_Size
sp指向的是栈顶,明显栈顶应该是stack_mem + Stack_size
栈底是stack_mem
原来的代码运行程序是没有问题的,但是显然和分配的那部分堆栈空间并没有被使用到,而是消耗了
该空间以下的Stack_size  ram空间

为了确认这种错误,我贴出S3C2440A.S中的栈地址
Stack_Mem       SPACE   Stack_Size

Stack_Top       EQU     Stack_Mem + Stack_Size

。。。。。。。。。。。个人意见