01 02 03 04 05 06 07 08 09 10 11 12 |
#include <xc.h> // test.c #include "common.h" __attribute__((address( 0x80005000 ))) void test_main (void); void test_main(){ int count=0xffff;//ローカルのauto変数 for(count = 0; count < 3; count++){ __asm__ ("NOP"); _send_string("hello\r\n");//USBへ文字列送出 __asm__ ("NOP"); } } |
#include <xc.h> // test.c #include "common.h" __attribute__((address( 0x80005000 ))) void test_main (void); int count=0xffff;// グローバル変数 void test_main(){ for(count = 0; count < 3; count++){ __asm__ ("NOP"); _send_string("hello\r\n");//USBへ文字列送出 __asm__ ("NOP"); } } | |
上記のローカル変数利用のアセンブリコードが下記コード | 上記のグローバル変数利用のアセンブリコードが下記コード | ||
左右とも、繰り返しを制御の構造は同じで、制御変数を初期化後10行目で、繰り返し判定用のL2に移動している。 繰り返し判定で繰り返しを続ける場合は、30行目で戻るジャンプを行っている。 左右の違いは制御変数の取り扱いで、左のautoローカル変数はスタック、右のグローバル変数はメモリを利用している。 | |||
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 52 53 54 |
Disassembly of section _0620b64064179b48: 80005000 |
Disassembly of section _0626364064186f27: 80005000 |
|
スタックにローカル変数を作るため、 04行のスタックの確保量が右より多く-32にしている。 そして、s8にspを設定してs8を介して スタック上の変数をアクセスしている。 それにより、autoのcount変数は、 16(s8)でアクセスしてる。 09行の「sw v0,16(s8)」がcount=v0です。(v0に0xffff) 11行の「sw zero,16(s8)」がcount=0です。 "hello"文字列は、.LC0のラベル位置にあり、 そのアドレス:80005080番地の設定を、上位と下位に分けて、 16行で、v0の上位16bitに0x8000を設定し、 18行で、v0の下位6bitに0x5080(10進の20608)を addiuによる加算で設定しすることで、 v0に80005080番地を設定しています。 (この手法は、右上も同じです) 下記の実行可能のリンクでは、このhello文字列のラベル名を .L_STR_HELLOにしています。 |
ローカル変数を使わないため、スタック確保は 04行の-24で、左より少ない。 11行の「sw zero,-32768(v0)」がcount=0です。 v0に0x8001が記憶されているので、 アクセス対象番地は、(0x8001<<16)+(-32768)で得られ、 0x80008000番地のcount変数をゼロにしています。 そして0x80008000は、[UMEHOSI ITA]において、 ユーザプログラムのRAM領域になっています。 count=00xffffの初期設定は、 利用されていないためか、その初期化コードは、 存在していませんでした。 .dinitのセクションが存在しています。 .dinitは、スタートアップ コードによって RAM 変数にコピーされる初期値を保持するために、 存在するものですが、[UMEHOSHI ITA]で使う ユーザプログラムでは、使っていません。 (余計な、コードになっています。) 下記の実行可能のリンクでは、 .dinitの生成をしません。 また、count=00xffffの初期化は、 次のように行わせています。 .section SEC01,address(0x80008000),code count: .word 0x0000ffff |
||
上記コードを実際にアッセンブルするリンク | 上記コードを実際にアッセンブルするリンク |