On XC8 it seems you can't do the asm directive
like on X86 Visual C:
unsigned char in_val = 255;
char digits[3];
digits[0] = digits[1] = digits [2] = '0';
_asm {
mov bl,in_val
loop_100:
cmp bl,100
jb exit_loop_100
inc digits[2]
sub bl,100
jmp loop_100
exit_loop_100:
loop_10:
cmp bl,10
jb exit_loop_10
inc digits[1]
sub bl,10
jmp loop_10
exit_loop_10:
add digits[0],bl
}
The most I've been able to achieve is this but I have to use the registers directly no moving things back from C variables to assembly registers and viceversa, but there has to be a way and I only tried for a couple of hours one day.
asm("MOVLW 0xFF");
asm("MOVWF 0x74");
asm("MOVF 0x74, W");
asm("MOVWF 0x78"); // in_val
asm("MOVLW 0x30");
asm("MOVWF 0x77");
asm("MOVWF 0x76");
asm("MOVWF 0x74");
asm("MOVF 0x74, W");
asm("MOVWF 0x75"); // digits
asm("Loop1:");
asm("MOVLW 0x64");
asm("SUBWF 0x78, W"); //in_val
asm("BTFSS STATUS, 0x0");
asm("GOTO Skip1");
// asm("MOVLW 0x1");
// asm("MOVWF 0x74");
// asm("MOVF 0x74, W");
// asm("ADDWF 0x77, F");
asm("INCF 0X77,F");
asm("MOVLW 0x64");
asm("SUBWF 0x78, F"); //in_val
asm("GOTO Loop1");
asm("Loop2:");
// asm("MOVLW 0x1");
// asm("MOVWF 0x74");
// asm("MOVF 0x74, W");
// asm("ADDWF 0x76, F");
asm("INCF 0X76,F");
asm("MOVLW 0xA");
asm("SUBWF 0x78, F"); //in_val
asm("Skip1:");
asm("MOVLW 0xA");
asm("SUBWF 0x78, W"); //in_val
asm("MOVLW 0xA");
asm("SUBWF 0x78, W"); //in_val
asm("BTFSC STATUS, 0x0");
asm("GOTO Loop2");
asm("MOVF 0x78, W"); //in_val
asm("MOVWF 0x74");
asm("MOVF 0x74, W");
asm("ADDWF 0x75, F"); // digits
The generated code is one to one:
39: asm("MOVLW 0xFF");
0012 30FF MOVLW 0xFF
40: asm("MOVWF 0x74");
0013 00F4 MOVWF 0x74
41: asm("MOVF 0x74, W");
0014 0874 MOVF 0x74, W
42: asm("MOVWF 0x78"); // in_val
0015 00F8 MOVWF 0x78
43:
44: asm("MOVLW 0x30");
0016 3030 MOVLW 0x30
45: asm("MOVWF 0x77");
0017 00F7 MOVWF 0x77
46: asm("MOVWF 0x76");
0018 00F6 MOVWF 0x76
47: asm("MOVWF 0x74");
0019 00F4 MOVWF 0x74
48: asm("MOVF 0x74, W");
001A 0874 MOVF 0x74, W
49: asm("MOVWF 0x75"); // digits
001B 00F5 MOVWF 0x75
50: asm("Loop1:");
51: asm("MOVLW 0x64");
001C 3064 MOVLW 0x64
52: asm("SUBWF 0x78, W"); //in_val
001D 0278 SUBWF 0x78, W
53: asm("BTFSS STATUS, 0x0");
001E 1C03 BTFSS STATUS, 0x0
54: asm("GOTO Skip1");
001F 2827 GOTO 0x27
55:
56: // asm("MOVLW 0x1");
57: // asm("MOVWF 0x74");
58: // asm("MOVF 0x74, W");
59: // asm("ADDWF 0x77, F");
60: asm("INCF 0X77,F");
0020 0AF7 INCF 0x77, F
61:
62: asm("MOVLW 0x64");
0021 3064 MOVLW 0x64
63: asm("SUBWF 0x78, F"); //in_val
0022 02F8 SUBWF 0x78, F
64: asm("GOTO Loop1");
0023 281C GOTO 0x1C
65: asm("Loop2:");
66: // asm("MOVLW 0x1");
67: // asm("MOVWF 0x74");
68: // asm("MOVF 0x74, W");
69: // asm("ADDWF 0x76, F");
70: asm("INCF 0X76,F");
0024 0AF6 INCF 0x76, F
71:
72: asm("MOVLW 0xA");
0025 300A MOVLW 0xA
73: asm("SUBWF 0x78, F"); //in_val
0026 02F8 SUBWF 0x78, F
74: asm("Skip1:");
75: asm("MOVLW 0xA");
0027 300A MOVLW 0xA
76: asm("SUBWF 0x78, W"); //in_val
0028 0278 SUBWF 0x78, W
77:
78: asm("MOVLW 0xA");
0029 300A MOVLW 0xA
79: asm("SUBWF 0x78, W"); //in_val
002A 0278 SUBWF 0x78, W
80: asm("BTFSC STATUS, 0x0");
002B 1803 BTFSC STATUS, 0x0
81: asm("GOTO Loop2");
002C 2824 GOTO 0x24
82:
83: asm("MOVF 0x78, W"); //in_val
002D 0878 MOVF 0x78, W
84: asm("MOVWF 0x74");
002E 00F4 MOVWF 0x74
85: asm("MOVF 0x74, W");
002F 0874 MOVF 0x74, W
86: asm("ADDWF 0x75, F"); // digits
0030 07F5 ADDWF 0x75, F