Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
計算機アーキテクチャ
2014年 7月28日
電気情報工学科 田島 孝治
第15回 計算機アーキテクチャ 1
第15回 PCSpimの使い方
授業スケジュール(前期)
※5/5はこどもの日、7/21は海の日のため休講
※授業変更:6/23 1時限→6/20 3時限
2
第15回 計算機アーキテクチャ
回 日付 タイトル
1 4/7 コンピュータ技術の歴史と コンピュータアーキテクチャ
2 4/14 ノイマン型コンピュータ
3 4/21 コンピュータのハードウェア
4 4/28 数と文字の表現
5 5/12 固定小数点数と浮動小数点表現
6 5/19 計算アーキテクチャ(ARU)
7 5/26 計算装置のハードウェア実装
8 6/2 文字コード
9 6/11 中間試験(9:00-9:50)
回 日付 タイトル
10 6/16 主記憶装置とレジスタ
11 6/20 命令実行の流れ
12 6/30 命令形式とアセンブリ言語
13 7/7 命令セットとアドレッシング
14 7/14 サブルーチンの実現
15 7/28 PCSpimによるアセンブリ言語プログラム
8/4 期末試験(日程は確定)
16 9/29? フォローアップ(日程は仮)
今日の授業の目的
メモリ管理のための特殊なコマンドについて知る
文字や数字を画面に出力する方法について学ぶ
第15回 計算機アーキテクチャ
3
PCSpimによるプログラムの基礎を学ぶ メモリの扱いとシステムコールを使ってみる
PCSpimの画面の意味
第15回 計算機アーキテクチャ
4
レジスタの状態
メモリの状態
システムメッセージ
プログラム領域でないメモリは?
上側は通常のDATA領域
ラベルを付けて自由に使うことができる
初期状態ではすべて0の値が入っている
下側はスタック領域
スタックポインタで管理しながら自由に使うことができる
第15回 計算機アーキテクチャ
5
メモリの確保とデータの入力
次のプログラムを入力しPCSpimで実行してみよう
第15回 計算機アーキテクチャ
6
# Data segment .data a: .word 5 # Text segment .text .globl main main: la $t0, a lw $s0, 0($t0) addi $s1,$s0,10 sw $s1, 0($t0) jr $ra
プログラムを読み込んだ後の状態
0x10010000番地からデータ領域が作られる
5があらかじめ入力されている
実行すると・・・
値の書き換えが行われる
第15回 計算機アーキテクチャ
7
メモリ上の値の取り方
.word以外にもいくつか設定方法がある
第15回 計算機アーキテクチャ
8
コマンド 使い方 例
.word ワード単位でデータを格納する領域を作成し、同時に値を代入する。 カンマで区切り複数の値を代入できる。
.word 5,2,34,53
.space バイト単位でデータを格納する領域を作成する。値の代入はできない。
.space 64
.asciiz 文字列を記述する。メモリの最後にnull文字が追加される。
.asciiz "hello world"
.double 倍精度の小数を記述する。カンマ区切りで複数の値を記述可能。
.double 3.14,2.71
複数の値を記述してみよう
次のプログラムを記入し実行
メモリの様子に注目すること
第15回 計算機アーキテクチャ
9
# Data segment .data value: .word 1,2,4,8,0 # Text segment .text .globl main main: la $t0, value lw $s0, 0($t0) lw $s1, 4($t0) lw $s2, 8($t0)
lw $s3, 12($t0) add $t1,$s0,$s1 add $t2,$s2,$s3 add $s4,$t1,$t2 sw $s4, 16($t0) jr $ra
(重要・復習)lw,swの使い方
メモリアドレスは1バイト単位で割り当てられている
1word = 4バイト
ベース相対アドレッシングの場合offsetは4バイトづつ増やす
第15回 計算機アーキテクチャ
10
番地 データ
0x10010000 0x00
0x10010001 0x00
0x10010002 0x00
0x10010003 0x01
0x10010004 0x00
0x10010005 0x00
0x10010006 0x00
0x10010007 0x02
Offset = 0 の示すデータ
0x00000001
Offset = 4 の示すデータ
0x00000002
文字列の扱い方
定義は先のルールに従うだけ
どうやって文字を出力するの?
文字の出力はCPUとメモリで終わる処理ではない
外部ハードウェアへのアクセスが必要
OSを経由して外部装置にアクセスする必要がある
システムコールで出来ること
コンソールへの文字、数字の出力
キーボードからの文字、数字の入力
第15回 計算機アーキテクチャ
11
このような処理をシステムコールと呼びます
文字列を出力してみよう
次のプログラムを入力して実行
第15回 計算機アーキテクチャ
12
# Data segment .data hello: .asciiz "hello world¥n" # Text segment .text .globl main main: la $s2, hello # copy the address from s2 to a0 addi $a0,$s2,0 # v0 = 4 : output text li $v0, 4 syscall jr $ra
システムコール(syscall)の使い方
動作の種類をv0レジスタに設定
引数をa0レジスタ等に設定
動作によって微妙に使うレジスタが変わる
詳細は下記の表のとおり
第15回 計算機アーキテクチャ
13
動作の種類 v0 その他引数
整数の出力 1 $a0 = number
文字列の出力 4 $a0 = address
少数の出力 3 $f12 = number
整数の入力 5 Number in $v0
文字列の入力 8 String in $a0 $a1 = read size
サブルーチンを作ろう
Print用のサブルーチンを作る
$s0に値をいれてから呼び出す
第15回 計算機アーキテクチャ
14
printt: addi $a0,$s0,0 li $v0, 4 #print text syscall # jr $ra printi: addi $a0,$s0,0 li $v0, 1 #print int value syscall # jr $ra
サブルーチンの呼び出し方法
第15回 計算機アーキテクチャ
15
# Data segment .data a: .word 10 hello: .asciiz "hello world" nl: .asciiz "¥n" # Text segment .text .globl main main: la $t0, a lw $s0, 0($t0) la $s2, hello la $s3, nl
サブルーチンの呼び出し方法
第15回 計算機アーキテクチャ
16
#Push addi $sp, $sp, -8 # Decrement stack pointer by 8 sw $ra, 0($sp) # Save $ra to stack sw $s0, 4($sp) #Call sub function addi $s0,$s2,0 jal printt addi $s0,$t1,0 jal printi addi $s0,$s3,0 jal printt #Pop lw $s0, 4($sp) lw $ra, 0($sp) addi $sp, $sp, 8 # Increment stack pointer by 8 end: jr $ra # end of program
期末試験について
模擬問題を配布しています
範囲はこれまでにやった部分全てです
用語問題などもでます
データシートは配布予定です
プログラム制作の問題は穴埋め問題です
細かなミスで加点できないので注意してください
第15回 計算機アーキテクチャ
17