This is a function that i wrote using assembly:
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;NAME: clearXdataNBytes ;FUNCTION: ; This functioin clear n bytes in the external ;space starting with the address specified ;PARAMETERS: ; B(unsigned byte)---the numbers of bytes to ;be cleared! ; DPTR(unsigned word)---the starting address ;RETURNS: None! ;PROLOGUE BY CALLING: ; PUSH DPL,PUSH ;DPH,PUSH B,MOV DPTR,#startAddr,MOV ;B,#nbytes! ;EPILOG BY CALLING:NONE! ;NOTES: The MAX number of bytes to be cleared is 255!And,we use A as temporary variables!There is no check if the external space pointed by DPTR is legal! ;EXAMPLES: ; ... ; //Prologue: ; PUSH DPL ; PUSH DPH ; PUSH B ; //Move the parameters ; MOV DPTR,#startAddr ; MOV B,#200 ; //Call this function ; LCALL clearXdataNBytes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; clearXdataNBytes: PUSH ACC CLR A clearXdataNBytes_LOOP: MOVX @DPTR,A INC DPTR DJNZ B,LOOP POP ACC POP B POP DPH POP DPL RET
well,about PUSH ACC CLR A ... POP ACC POP B POP DPH POP DPL
if i call this function in a loop,it seems that these codes are executed repeatedly,and it seems that it's an overhead in my system?Is that possible or is there some wrong thinking?How can i solve it?!
I think it's ok that using the registers to realize reentrant function,I am confused because of the POPs in the "reentrant function", i placed them at the end of it,so i can reduce the code space,because these codes are scattered all over if this function called all over.