Hello ! I have a some quetions. I my project i write some math(on Assembler) library for using in C and Assembler. I have some function, in C this function can be defined:
extern signed long add32(signed long var1, signed long var2)
of course, this mean I have to respectively describe the function in assembler:
;---------- Object name --------------- NAME ADD32 ; Obj. name ;---------- Segment declaration ------- ?PR?_add32?ADD32 SEGMENT CODE ; Segment defenition ?DT?_add32?ADD32 SEGMENT DATA OVERLAYABLE ; Segment defenition for long var's. ;---------- Public symbols ------------ PUBLIC ?_add32?BYTE ; Public symbol for long var's PUBLIC _add32 ; Public function symbol ;---------- Vars defenition ----------- RSEG ?DT?_add32?ADD32 ?_add32?BYTE: ORG 04H OP_BYTE: ds 04H ; Second operand memory allocate ;---------- Function code ------------ RSEG ?PR?_add32?ADD32 _add32: clr C ; clr Carry mov A,R7 ; load ACC with LSB first op. ADD A,OP_BYTE +03H ; ADD LSB second op. mov R7,A ; save result to R7 mov A,R6 ; load ACC with next byte first op. ADDC A,OP_BYTE +02H ; ADD next byte second op. + Carry mov R6,A ; save result to R7 mov A,R5 ; load ACC with next byte first op. ADDC A,OP_BYTE +01H ; ADD next byte second op. + Carry mov R5,A ; save result to R7 mov A,R4 ; load ACC with MSB first op. ADDC A,OP_BYTE +00H ; ADDC MSB second op. + Carry mov R4,A ; save result to R6 end_add32: ret ;-------------------------------------- END
and
;---------- Segment declaration ------- ... ?DT?_add32?ADD32 SEGMENT DATA OVERLAYABLE ... ;---------- Public symbols ------------ PUBLIC ?_add32?BYTE ; Public symbol for long var's ... ;---------- Vars defenition ----------- RSEG ?DT?_add32?ADD32 ?_add32?BYTE: ORG 04H OP_BYTE: ds 04H ; Second operand memory allocate
this segment must be declared for passing variable in function with type long.
When i define ,example:
#pragma REGPARMS
this function working normaly, first long var placed to R4& R5& R6& R7, second lond var placed direc to memory segment ?DT?_add32?ADD32 with offset four bytes. BUT when I want to like don't use register and pass all parametrs in memory, if i define
#pragma NOREGPARMS
first long var placed to ?DT?_add32?ADD32 without offset , second lond var placed direc to memory segment ?DT?_add32?ADD32 with offset four bytes, and my function don't work.
Quetions: Possible to determine at compile time which #pragma directives are set, and on this corect source code.
This function only example, of course no need use this function in C.
Sorry for my english.:) With best regards Artem Gusev. Thanks for all.