We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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?!
So,how can i write a reentranted function that uses some registers to pass parameters?!