在stm32f103ze芯片调试一段字符拷贝汇编程序时,在数据段中用DCB定义一个字符串,如果数据段与代码段不是同一个地址空间,对应地址的内存值为0,不是字符串值。经过调试发现,DCB定义的字符串的值是与代码一起保存在代码段中,特以此文记之。
代码调试是在keil uvision5仿真器上完成的,代码如下:
1、引导文件汇编代码:
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
__Vectors DCD 0
DCD Reset_Handler ; Reset Handler
export __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
IMPORT StrCopy_start
export Reset_Handler ;export variant
LDR SP, =0x20000000+0x10000
BL StrCopy_start
ENDP
END
字符串拷贝文件汇编代码:
AREA StrCopy, code, readonly
;ENTRY
cpnum EQU 12
StrCopy_start
ldr r0, =srcstr
ldr r1, =dststr
mov r2, #cpnum
bl strcopy
EXPORT StrCopy_start
stop
mov r0, #0x18
ldr r1, =0x20026
svc #0xAB
strcopy
LDRB r3, [r0], #1
STRB r3, [r1], #1
sub r2, #1
cmp r2, #0
bne strcopy
bx lr
;AREA StrData, DATA, NOINIT, READWRITE, ALIGN=2
;AREA StrData, DATA, READWRITE, ALIGN=2
AREA StrData, DATA, READONLY, ALIGN=2
srcstr
DCB 0x32,0x33,0x34,0x35,0x36,0x37,0x38,0
dststr
DCB "Second string-destination",0
END
当伪指令 DCB 定义 srcstr 的 AREA 定义如下时,srcstr 指向的内存数据为字符串值:
AREA StrData, DATA, READONLY, ALIGN=2
利用调试器可知 srcstr 地址为 0x080003C8
查看内存数据是正常的,如下图所示:
但伪指令 DCB 定义 srcstr 的 AREA 定义如下时,srcstr 指向的内存数据为0:
AREA StrData, DATA, READWRITE, ALIGN=2
利用调试器可知 srcstr 地址为 0x20000000
查看 0x20000000 内存数据,发现数据是0,如下图所示:
这时,再看 0x080003C8 地址数据,发现该地址内存值正是字符串值,如下图所示:
从以上调试结果来看,说明当DCB定义数据在数据段,与代码段不在一个地址空间,字符数据与代码数据一起保存在代码段中。