|
|
View previous topic :: View next topic |
Author |
Message |
young
Joined: 24 Jun 2004 Posts: 285
|
Assemble language subroutin with parameters? |
Posted: Mon Apr 04, 2005 2:19 pm |
|
|
I know it is not right to ask this question here, and I should be able to find it somewhere in the web, however, I just want to communicate with you guys and make me understand it deeply and fast.
My question is how to define a subroutine in assemble language with parameter? such as the following code, How to understand it, what is the parameters, and how do I call it in a program? I did not have background on assemble, any help will be appreicated!
Code: |
;--- procedure compact_C_F_cf_write_byte ---
compact_C_F_cf_write_byte:
0039 BCF STATUS,RP1
003A BCF STATUS,RP0
003B MOVF compact_C_F_cf_write_byte_param_dataport,W
003C MOVWF FSR
003D MOVF compact_C_F_cf_write_byte_param_bdata,W
003E MOVWF INDF
003F L_compact_C_F_5:
003F MOVF compact_C_F_cf_write_byte_param_ctrlport,W
0040 MOVWF FSR
0041 CLRF STACK_0
0042 BTFSC INDF,7
0043 INCF STACK_0,F
0044 COMF STACK_0,W
0045 MOVWF STACK_0
0046 MOVLW 255
0047 SUBWF STACK_0,W
0048 BTFSS STATUS,Z
0049 GOTO L_compact_C_F_6
004A L_compact_C_F_4:
004A nop
004B GOTO L_compact_C_F_5
004C L_compact_C_F_6:
004C CALL delays_delay_1us
004D BCF STATUS,RP1
004E BCF STATUS,RP0
004F BCF INDF,6
0050 CALL delays_delay_1us
0051 BCF STATUS,RP1
0052 BCF STATUS,RP0
0053 BSF INDF,6
0054 CALL delays_delay_1us
0055 RETURN
;---endproc--- |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
DragonPIC
Joined: 11 Nov 2003 Posts: 118
|
|
Posted: Mon Apr 04, 2005 2:59 pm |
|
|
See pic datasheet. It lists all instructions.
You need to use CALL to call a subroutine.
CALL 039 //should call this routine
although, if you are not on the same page, extra coding is required. _________________ -Matt |
|
|
Guest
|
|
Posted: Mon Apr 04, 2005 3:26 pm |
|
|
ThnK YOU PCM:
So in order to call the function, I have to define a function as the following:
Code: |
void cf-write_byte(Byte Dataport, Byte ControlPort, Byte bdata)
{
byte compact_C_F_cf_write_byte_param_dataport;
byte compact_C_F_cf_write_byte_param_bdata;
byte compact_C_F_cf_write_byte_param_ctrlport;
compact_C_F_cf_write_byte_param_dataport=Dataport
ompact_C_F_cf_write_byte_param_bdata=bdata;
compact_C_F_cf_write_byte_param_ctrlport=ControlPort;
#asm
0039 BCF STATUS,RP1
003A BCF STATUS,RP0
003B MOVF compact_C_F_cf_write_byte_param_dataport,W
003C MOVWF FSR
003D MOVF compact_C_F_cf_write_byte_param_bdata,W
003E MOVWF INDF
003F L_compact_C_F_5:
003F MOVF compact_C_F_cf_write_byte_param_ctrlport,W
0040 MOVWF FSR
0041 CLRF STACK_0
0042 BTFSC INDF,7
0043 INCF STACK_0,F
0044 COMF STACK_0,W
0045 MOVWF STACK_0
0046 MOVLW 255
0047 SUBWF STACK_0,W
0048 BTFSS STATUS,Z
0049 GOTO L_compact_C_F_6
004A L_compact_C_F_4:
004A nop
004B GOTO L_compact_C_F_5
004C L_compact_C_F_6:
004C CALL delays_delay_1us
004D BCF STATUS,RP1
004E BCF STATUS,RP0
004F BCF INDF,6
0050 CALL delays_delay_1us
0051 BCF STATUS,RP1
0052 BCF STATUS,RP0
0053 BSF INDF,6
0054 CALL delays_delay_1us
0055 RETURN
#endasm
}
or just define the three data byte compact_C_F_cf_write_byte_param_dataport;
byte compact_C_F_cf_write_byte_param_bdata;
byte compact_C_F_cf_write_byte_param_ctrlport;
defined in main program, right? |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Apr 04, 2005 4:37 pm |
|
|
The variables that are in the function parameter list should be
used within the ASM code. You don't need to create another
group of variables and copy the parameters to them, as you
are doing.
I was sort of hoping that you would figure everything out
by yourself, once I pointed you to the sample code.
There are a few other things that have to be done to make
the code work. You should take out all the bank select code.
The compiler will insert its own bank select code, to access
the variables. You should take out the Return statement
at the end. The compiler will handle returning from the function.
The truth is, the code in that function is so simple that it could,
and should, be re-written in C. There's no reason for it to be
in assembly language. But I don't want to do that for you.
You should do it. |
|
|
Guest
|
|
Posted: Tue Apr 05, 2005 6:53 am |
|
|
Thank you PCM:
I am trying to learn the skill by you suggestion.
In the code, How Stack_0 was defined. |
|
|
Guest
|
|
Posted: Tue Apr 05, 2005 8:12 am |
|
|
Hi PCM:
From my question, you might already how I am lack of the knowlwdge of Assembly, and how hard it would be for me to start working on it, If you could kindly help me with this for both writing it in assembly and c, I will be much more appreciated.
I have many other subroutins like this, I just hope I could learn this one and do the others by my self |
|
|
young
Joined: 24 Jun 2004 Posts: 285
|
|
Posted: Wed Apr 06, 2005 9:04 am |
|
|
Hi:
After struggling and asking questions from other forums, I am able to understand assembly language. I believe I will be able to transfer them to any other language including c. I will continuously fight with the code and find the pleasure after digging it out, certainly with you guys help! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|