在学习改写 Keil 字符串操作函数库(原型在 STRING.H 中)过程中, 发现原库 memmove 程序, 有一个 bug, 在将 code (或 xdata) 中内容 拷贝到 xdata中, 正向移动没问题, 反向移动时, 没有保护 指针返回的高位地址, 引起返回指针错误.
另外, 在将 code 中内容 拷贝到 xdata中, 程序中对移动地址作了判断, 决定采用正向移动还是反向移动, Keil 这段程序是多余的, 完全没必要, 因为51的CODE 和 XDATA 地址空间, 永远不会重叠, 这判断及反向移动, 我给优化了, 以精简代码提升执行速度.
MOVE_CODE_XDATA:
/* SETB C // Keil 这段程序是多余的, 因为C51的CODE和XDATA地址空间, 永远不会重叠
MOV A,R1
SUBB A,R0
MOV A,R2
SUBB A,R4
JNC MOVE_013
MOV A,R1
ADD A,R7
MOV DPL,A
MOV A,R2
ADDC A,R3
MOV DPH,A
MOV A,R0
ADD A,R7
MOV R0,A
MOV A,R4
ADDC A,R3
XCH A,R4 // Keil的BUG, 反向传送时, s1指针高位地址未保护, 现已修正
MOV R2,A // R4 -->R2
MOVE_010: INC DPL
DJNZ DPL,MOVE_011
DEC DPH
MOVE_011: DEC DPL
CLR A
MOVC A,@A+DPTR
XCH A,R0
XCH A,DPL
XCH A,R0
XCH A,R4
XCH A,DPH
XCH A,R4
INC DPL
DJNZ DPL,MOVE_012
DEC DPH
MOVE_012: DEC DPL
MOVX @DPTR,A
XCH A,R0
XCH A,DPL
XCH A,R0
XCH A,R4
XCH A,DPH
XCH A,R4
DJNZ R7,MOVE_010
DJNZ R6,MOVE_010
SJMP MOVE_END3 */
MOVE_013: MOV DPL,R1
MOV DPH,R2
MOV A,R4
MOV R2,A
MOVE_014: CLR A
MOVC A,@A+DPTR
下面为修正后的 memmove 程序, 可挂在 c51项目中编译, 以替代有错误的 memmove 库程序.
MEMMOVE.rar
(1.5 KB)
|