裸奔的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
。。。。。。。。。。。个人意见