基礎実験1 UNIX・アセンブラ実習 第8

200752日(水)

 


課題 下記のプログラムは,256バイトの大きさを持つキューを作り,それに1バイトずつデータを書き込むプログラムである.このプログラムについて,以下の設問に答えよ.

(1)プログラムのフローチャートを作成せよ.

(2)プログラム中の(あ)〜(う)の箇所の処理内容(意味)を説明せよ.

(3)プログラム中の(え)には,レジスタ復帰の処理が必要である.完成させよ.

(4)このプログラムをemacsで入力し,ステップ実行で動作を確認せよ.

 

 


1  .org    0x0000

2  .dc.l   0x5000

3  .dc.l   Start

4  .org    0x0400

******************************   

** メインルーチン

** a0:書き込むデータのアドレス

** d4:書き込み回数

******************************

5  Start:

6          jsr     Init_Q /* キューの初期化処理 */

7          lea.l   Data_to_Que, %a0

8          move.l  #257, %d4

9  Loop1:         

10         subq.w  #1, %d4

11         bcs     End_program

12         jsr     In_Q /* 書き込み処理 */

13         bra     Loop1

14 End_program:   

15         .dc.w   0x4848 /* プログラムの終了 */

16         stop    #0

**********************   

** キューの初期化処理

**********************

17 .section .text

18 .even

19 Init_Q:

20         lea.l   BF_START, %a2

21         move.l  %a2, PUT_PTR

22         move.l  %a2, GET_PTR

23         move.b  #0xff, PUT_FLG

24         move.b  #0x00, GET_FLG

25         rts

***********************************

** In_Q キューへのデータ書き込み

** a0:     書き込むデータのアドレス      

** d0:     結果(00:失敗, 00以外:成功)

***********************************

26 .section .text

27 .even

28 In_Q:

29         jsr PUT_BUF /* キューへの書き込み */

30         rts

****************************************

** PUT_BUF

** a0:     書き込むデータのアドレス

** d0:     結果(00:失敗, 00以外:成功)

****************************************

31 .section .text

32 .even

33 PUT_BUF:

34         movem.l %d2/%a1-%a3,-(%sp)

35         move.b  PUT_FLG, %d2

36         cmp.b   #0x00, %d2

37         beq     PUT_BUF_Finish

38         movea.l PUT_PTR, %a1

39         move.b  (%a0),(%a1)+

(あ)

 
40         lea.l   BF_END, %a3

41         cmpa.l  %a3, %a1

42         bls     PUT_BUF_STEP1

43         lea.l   BF_START, %a2

44         movea.l %a2,%a1

45 PUT_BUF_STEP1:

(い)

 
46         move.l  %a1,PUT_PTR

47         cmpa.l  GET_PTR,%a1

48         bne     PUT_BUF_STEP2

49         move.b  #0x00,PUT_FLG  

50 PUT_BUF_STEP2: 

51         move.b  #0xff, GET_FLG

52         move.b  PUT_FLG, %d0

(え)

 
53 PUT_BUF_Finish:

54 movem.l (%sp)+, %d2/%a1-%a3

55         rts            

******************************

** キュー用のメモリ領域確保

******************************

56 .section .data

57 .even

58         .equ    B_SIZE, 256

59 BF_START:

(う)

 
60         ds.b    B_SIZE-1

61 BF_END:

62         ds.b    1

63 PUT_PTR:

64         ds.l    1

65 GET_PTR:

66         ds.l    1

67 PUT_FLG:

68         ds.b    1

69 GET_FLG:

70         ds.b    1

******************************   

** 書き込むデータ(サンプル)

******************************

71 .section .data

72 .even

73 Data_to_Que:

74 .ascii  "ABC"

 

今日の実習はここで終りです.

 

参考Webページ: http://www.db.is.kyushu-u.ac.jp/kaneko/as/index.html