XC8アセンブラ理解/アセンブリコードを表示する方法
方法1. 逆アセンブルにより表示する方法
https://gyazo.com/a5deb1e8f1a2b3206394a907bee1176b
準備として、プロジェクトプロパティのConf > Loadingで「Load symbols ...」を選択
その後、ビルドしてWindows > Debugging > Output > Disassembly Listing Fileを選択
こんな感じのアセンブリコードを得られる
code:listing.disasm
Disassembly Listing for xc8compiler-test
Generated From:
C:/Users/uchan/work/xc8compiler-test.X/dist/default/production/xc8compiler-test.X.production.elf
May 15, 2023 4:57:13 PM
--- C:/Users/uchan/work/xc8compiler-test.X/main.c -----------------------------------------------------
2:
3: uint16_t get_uint16_value();
4:
5: uint8_t add_uint8_values(uint8_t a, uint8_t b) {
07E2 00F1 MOVWF a
6: return a + b;
07E3 0871 MOVF a, W
07E4 0770 ADDWF __pcstackCOMMON, W
7: }
07E5 0008 RETURN
8:
9: void main(void) {
この方法では、ローカル変数がメモリ上のどこに割り当てられているかなどの情報が明には表示されていない。
機械語に精通していれば、MOVF a, Wが0871になっていることから、aが0x71に配置されていることが分かる。
方法2. コンパイラにアセンブリコードを出力させる
https://gyazo.com/397c0931f1f4d8ee53d1bb2191b6b172
準備として、プロジェクトプロパティのConf > XC8 Global Options > XC8 Compilerで「Generate the ASDM listing file」を選択
https://gyazo.com/d9db409549e949c8422eeec6586c6e08
dist/default/production/プロジェクト名.production.lstにアセンブリコードが出力される
code:xd8compiler-test.X.production.lst
《中略》
1620 0070 add_uint8_values@b:
1621 ; 2 bytes @ 0x0
1622
1623
1624 ; 1 bytes @ 0x0
1625 0070 ds 1
1626 0071 ??_add_uint8_values:
1627 0071 add_uint8_values@a:
1628 ; 1 bytes @ 0x1
1629
1630
1631 ; 1 bytes @ 0x1
1632 0071 ds 1
《中略》
1784
1785 ;psect for function _add_uint8_values
1786 07E2 _add_uint8_values:
1787
1788 ;incstack = 0
1790 ;add_uint8_values@a stored from wreg
1791 07E2 00F1 movwf add_uint8_values@a
1792 07E3 l641:
1793
1794 ;main.c: 6: return a + b;
1795 07E3 0871 movf add_uint8_values@a,w
1796 07E4 0770 addwf add_uint8_values@b,w
1797 07E5 l9:
1798 07E5 0008 return
1799 07E6 __end_of_add_uint8_values:
1800 007E btemp set 126 ;btemp
1801 007E wtemp0 set 126
方法1と異なり、ローカル変数の割り当てなども詳細に表示される。
ds unitsはunits分のメモリを確保するAssembler Directiveだそう。