2.2 问题
2.2.1
.data
Coeff .word 011h,022h,033h
.bss var1,1
.bss buffer,10
Ptr .word 0123
.text
Add: LAC 0FH
Aloop: SBLK 1
BLEZ aloop
SACL var1,0
.data
Ivals .word 0aah,0bbh
Var2 .usect “newvars”,1
Inbuf .usect “newvars”,7
.text
ADD #0FFH
.text 7(WORDS)
.data 5
.bss 11
.newvars 8(由.usect创建的段)
在两本书中看到这个例子,其中.data段都是5个字的目标码。
Ptr .word 0123不算是.data段吗?那是什么段?为什么没有计算进去,是书上写错了?
查看.map文件,可以看出.data 段是6个字的目标码,应该是书本错了。
2.2.2
编译连接都通过,为什么生成的.out文件无法下载,提示0x0地址数据错误。
查看Disassembly,8000h前面的数据全为FF,8000h~87ffh即SARAM区里有程序PRG_inti,8800H后的数据全和87FFH里的数据相同。
8000h~87ffh里的程序是否是用来清除、擦除、烧写FLASH用的?其只要打开CSS就存在。
答:SECTOINS段里的load指出的是LOAD PROGRAM与FLASH烧写时的共同地址。
所以如果LOAD PROGRAM时把load地址定到FLASH空间就会出现上面的错误。而FLASH烧写当然就不会了。
所以LOAD PROGRAM与FLASH烧写要写不同的CMD文件。
SECTOINS段里的run指出的是软件调试运行时的地址,如:
MEMORY
{
PAGE 0: VECS: origin=0h, length=40h /*中断向量表*/
FLASH: origin=100h, length=7000h /*;32Kflash*/
SARAM: origin=8000h, length=800h /*;当PON=1&&DON=0,*/
/*;SARAM映射为程序存储空间*/
PAGE 1: MMRS: origin=0h, length=60h /*;内部映射寄存器,或保留区间*/
B2: origin=60h, length=20h /*;32 WORDS DARAM*/
B0: origin=200h, length=100h /*;256 WORDS DARAM,CNF=0时*/
B1: origin=300h, length=100h /*;256 WORDS DARAM*/
}
SECTIONS
{
vectors: {} load=VECS, run=SARAM PAGE 0
.asminti: {} load=FLASH, run=SARAM PAGE 0/**/
.text: {} load=FLASH, run=SARAM PAGE 0
.data: {} >SARAM PAGE 0
.bss : {} >B2 PAGE 1
}
烧写完FLASH后,复位,地址定位到0000H。单步执行,跳转到主程序入口。.text段烧写在100H地址处开始,但程序却跳到了8043H处,这是关键字run映射的地址。把
vectors: {} load=VECS, run=SARAM PAGE 0
.asminti: {} load=FLASH, run=SARAM PAGE 0/**/
.text: {} load=FLASH, run=SARAM PAGE 0
改成
vectors: {} load=VECS PAGE 0
.asminti: {} load=FLASH PAGE 0/**/
.text: {} load=FLASH PAGE 0
从0000H执行后就跳到了100H。
从中可以看出run指定的只是软件仿真时程序段的映射地址。
|