??? 08/17/08 08:37 Read: times |
#157527 - Assembly to C and then back again Responding to: ???'s previous message |
Hi Cuong, hi Jan,
taking Jan's code I did some modifications so the generated assembly looks even more close to that you started with. --------8<---------------------------------- #pragma callee_saves DspSelect /* be careful with this pragma */ extern void DspSelect(); xdata unsigned char at 0x5000 ADspTab ; #define EndDspTab 16 void foo() { unsigned char DspTabCount = 0; unsigned char xdata * DspTabPoint; DspTabPoint = &ADspTab; do { if (*DspTabPoint == 0) break; DspTabPoint++; DspSelect(); } while ( ++DspTabCount != EndDspTab); // return DspTabCount; } -------->8---------------------------------- (converted for loop to while loop, added a dangerous pragma, changed * xdata to xdata *, packed into a function) using SDCC (sorry not Keil) this compiles to: --------8<---------------------------------- 0000 101 _foo: 0000 7A 00 112 mov r2,#_ADspTab 0002 7B 50 113 mov r3,#(_ADspTab >> 8) 0004 7C 00 114 mov r4,#0x00 0006 115 00103$: 0006 8A 82 117 mov dpl,r2 0008 8B 83 118 mov dph,r3 000A E0 119 movx a,@dptr 000B 60 0C 120 jz 00106$ 000D 0A 122 inc r2 000E BA 00 01 123 cjne r2,#0x00,00112$ 0011 0B 124 inc r3 0012 125 00112$: 0012 12s00r00 127 lcall _DspSelect 0015 0C 129 inc r4 0016 BC 10 ED 130 cjne r4,#0x10,00103$ 0019 131 00106$: 0019 22 132 ret -------->8---------------------------------- and just for reference, this is the code you started with: --------8<---------------------------------- ADspTab Equ 05000h EndDspTab Equ 16 DspTabPointH Data 12h DspTabPointL Data 11h DspTabCount Data 10h LoopMain: Mov DspTabPointH,#High(ADspTab) Mov DspTabPointL,#Low(ADspTab) Mov DspTabCount,#0 LoopDspTab: Mov Dph,DspTabPointH Mov DpL,DspTabPointL Movx A,@Dptr Jz LoopMain Inc Dptr Mov DspTabPointH,Dph Mov DspTabPointL,Dpl Lcall DspSelect Inc DspTabCount Mov A,DspTabCount Cjne A,#EndDspTab,LoopDspTab Ajmp LoopMain -------->8---------------------------------- Greetings, Frieder |
Topic | Author | Date |
Convert Assembly routine to C using Keil. | 01/01/70 00:00 | |
no guarantee this will fit your purpose... | 01/01/70 00:00 | |
Assembly to C and then back again | 01/01/70 00:00 | |
Double loop | 01/01/70 00:00 | |
yes, you are right | 01/01/70 00:00 | |
Target processor name. | 01/01/70 00:00 | |
Microprocessor name. | 01/01/70 00:00 | |
initializing global variable to zero | 01/01/70 00:00 | |
Are you sure you want it outside of the loop?![]() | 01/01/70 00:00 | |
What is the target processor name.?? | 01/01/70 00:00 |