SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
(C)2021 TOMISAWA Masaki
第10回 計算機構成
前回の内容
■ 2.8 コンピュータ・ハードウェア内での手続
きのサポート
‣入再帰型手続きのコンパイル
■ トレース課題
■ 末尾呼出し(tail call)
■ 2.9 人との情報交換
■ 2.10 32ビットの即値およびアドレスに対す
るMIPSのアドレシング方式
■ 擬似直接アドレッシング
■ PC相対アドレッシング
今回の内容
■ トレース課題のQtSPIM
■ QtSPIMでのPC相対アドレッシング
■ 例題 マシン・コードの復号(p.115)
■ ソフトウェアによるオーバーフローの検出
QtSPIMでの
PC相対アドレッシング(beq/bne)
の扱い
重要
バイト転送命令と文字列コピー手続き
■ バイト転送命令
lb $t0,0($s0)
sb $t0,0($s0)
■ 文字列コピー
void strcpy( char x[], char y[])
{
int i; // $s0
i = 0;
while( (x[i]=y[i]) != 0 )
i = i + 1;
}
■ MIPSコード
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
L1:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
beq $t2,$zero,L2
add $s0,$s0,1
j L1
L2:lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
"ABCD"
41 42 43 44 0
効率の良いMIPSコード
■MIPSコード
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
L1:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
beq $t2,$zero,L2
add $s0,$s0,1
j L1
L2:lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
■ 効率の良いMIPSコード
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
PC相対アドレッシング
■ 効率の良いMIPSコード ■ beq $zero,$zero,L2
‣ L2の値はいくつか? 
■ bne $t2,$zero,L1
‣ L1の値はいくつか?
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
PC相対アドレッシング
■ 効率の良いMIPSコード ■ beq $zero,$zero,L2
‣ L2の値はいくつか? 1
■ bne $t2,$zero,L1
‣ L1の値はいくつか? ­6
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
-1 beq $zero,$zero,L2
0 L1:add $s0,$s0,1
1 L2:add $t1,$a1,$s0
-6 L1:add $s0,$s0,1
-5 L2:add $t1,$a1,$s0
-4 lb $t2,0($t1)
-3 add $t3,$a0,$s0
-2 sb $t2,0($t3)
-1 bne $t2,$zero,L1
0 lw $s0,4($sp)
QtSPIM:擬似命令の解説
■ strcpyを呼び出すためのmain関数 ■ 擬似命令
‣ .asciiz "ABCD"
- 文字列の最後にナル文字が入る.
- C言語の文字列と同じ.
‣ .byte 0xff,0x88,0x55
- バイト単位で数値を確保する
‣ .space 5
- 指定した数だけバイト領域を確保する
重要
.data
y: .asciiz "ABCD" # char y[5]
.byte 0xff,0x88,0x55
x: .space 5 # char x[5]
.globl main
.text
main:
la $a0,x
la $a1,y
jal strcpy
break 2
QtSPIM:データセグメント,リトルエンディアン
■ strcpyを呼び出すためのmain関数
■ QtSPIMでのデータセグメント(実行前)
■ QtSPIMでのデータセグメント(実行後)
重要
.data
y: .asciiz "ABCD" # char y[5]
.byte 0xff,0x88,0x55
x: .space 5 # char x[5]
User data segment [10000000]..[10040000]
[10000000]..[1000ffff] 00000000
[10010000] 44434241 5588ff00 00000000 00000000 A B C D . . . . . . . . . . . .
[10010010]..[1003ffff] 00000000
User data segment [10000000]..[10040000]
[10000000]..[1000ffff] 00000000
[10010000] 44434241 5588ff00 44434241 00000000 A B C D . . . A B C D . . . . .
[10010010]..[1003ffff] 00000000
41 42 43 44 0 ff 88 55
アドレス
ビッグ
エンディアン
リトル
エンディアン
10010000 41 44
10010001 42 43
10010002 43 42
10010003 44 41
10010004 0 55
10010005 ff 88
10010006 88 ff
10010007 55 0
41 42 43 44 0 ff 88 55
QtSPIM:PC相対アドレッシング
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
値が違う!
1と2,­6と­5
+1だけずれてる
原因はEnable Delayed Branchesの設定の違い
Enable Delayed Branches
原因はEnable Delayed Branchesの設定の違い
Enable Delayed Branches
Enable Delayed Branchesをチェックすると,
別の問題が発生します.
原因はEnable Delayed Branchesの設定の違い
Enable Delayed Branches
Enable Delayed Branchesをチェックすると,
別の問題が発生します.
なので,
QtSPIMでのPC相対アドレスは+1ずれている
ということを覚えておいてください.
QtSPIM:PC相対アドレッシング
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
レポートや試験では,
左側を正解,右側を不正解
とします.
○
QtSPIM:PC相対アドレッシング
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
アセンブラの表記
beq $zero,$zero,8
beq $zero,$zero,2
アセンブラの表記
beq $zero,$zero,4
beq $zero,$zero,1
QtSPIM:PC相対アドレッシング
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
アセンブラの表記
beq $zero,$zero,8
beq $zero,$zero,2
アセンブラの表記
beq $zero,$zero,4
beq $zero,$zero,1
4分の1の値を書くのか?    4倍の値を書くのか?
QtSPIM:PC相対アドレッシング
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
レポートや試験では,
左側の4分の1の値を書くのかを正解,
右側の4倍の値を書くを不正解
とします.
○
○
QtSPIMを使う上での注意事項
■ PC相対アドレス ■ QtSPIMでのテキストセグメント
strcpy:
addi $sp,$sp,-4
sw $s0,4($sp)
add $s0,$zero,$zero
beq $zero,$zero,L2(1)
L1:add $s0,$s0,1
L2:add $t1,$a1,$s0
lb $t2,0($t1)
add $t3,$a0,$s0
sb $t2,0($t3)
bne $t2,$zero,L1(-6)
lw $s0,4($sp)
addi $sp,$sp,4
jr $ra
重要
User Text Segment [00400000]..[00440000]
[00400000] 3c011001  lui $1, 4097 [x]

[00400004] 34240008  ori $4, $1, 8 [x]

[00400008] 3c051001  lui $5, 4097 [y]

[0040000c] 0c100005  jal 0x00400014 [strcpy]

[00400010] 0000000d  break

[00400014] 23bdfffc  addi $29, $29, -4

[00400018] afb00004  sw $16, 4($29)

[0040001c] 00008020  add $16, $0, $0

[00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]

[00400024] 22100001  addi $16, $16, 1

[00400028] 00b04820  add $9, $5, $16

[0040002c] 812a0000  lb $10, 0($9)

[00400030] 00905820  add $11, $4, $16

[00400034] a16a0000  sb $10, 0($11)

[00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]

[0040003c] 8fb00004  lw $16, 4($29)

[00400040] 23bd0004  addi $29, $29, 4

[00400044] 03e00008  jr $31

Kernel Text Segment [80000000]..[80010000]
beq/bneのアドレスフィールドは+1ずれている.
アセンブラでは4分の1の値を書く.
マシン・コードの復号
■ 次の機械語の命令に相当するアセンブリ言語の命令は何か?
00af802016
■ 16進数から2進数に変換する
■ OPコード(6ビット)を調べる
‣ 00000なのでR形式である
■ funcコードを調べる
‣ 10 0000なのでAdd命令である
■ add命令
‣add $16,$5,$15
‣add $s0,$a1,$t7
0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
機械語命令復号表(p.116)の使い方
■ 次の機械語の命令に相当するアセンブリ言語の命令は何か?
00af802016
0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
R-format add
ソフトウェアによるオーバーフローの検出
■ add命令とaddu命令の違いは何か?
‣ 演算結果は同じである.
■ オーバーフロー例外(overflow exception)が発生するかしないかの違い.
■ オーバーフローをソフトウェアで検出する方法はあるか?
‣ 符号付整数と符号なし整数の理解を深める
‣ 多倍長の計算に使える.例)2倍長(64ビット)の符号付整数の加算.
コア命令セット OPCODE
名前 略号 形式 操作
- / FUNCT
(Hex)
Add add R R[rd] = R[rs] + R[rt] (1) 0 / 20hex
Add Immediate addi I R[rt] = R[rs] + SignExtImm (1,2) 8hex
Add Imm. Unsigned addiu I R[rt] = R[rs] + SignExtImm (2) 9hex
Add Unsigned addu R R[rd] = R[rs] + R[rt] 0 / 21hex
And and R R[rd] = R[rs] & R[rt] 0 / 24hex
And Immediate andi I R[rt] = R[rs] & ZeroExtImm (3) chex
Branch On Equal beq I
if(R[rs]==R[rt])
PC=PC+4+BranchAddr (4)
4hex
Branch On Not Equalbne I
if(R[rs]!=R[rt])
PC=PC+4+BranchAddr (4)
5hex
Jump j J PC=JumpAddr (5) 2hex
Jump And Link jal J R[31]=PC+4;PC=JumpAddr (5) 3hex
0 / 08
コア命令セット OPCODE
名前 略号 形式 操作
- / FUNCT
(Hex)
Add add R R[rd] = R[rs] + R[rt] (1) 0 / 20hex
Add Immediate addi I R[rt] = R[rs] + SignExtImm (1,2) 8hex
Add Imm. Unsigned addiu I R[rt] = R[rs] + SignExtImm (2) 9hex
Add Unsigned addu R R[rd] = R[rs] + R[rt] 0 / 21hex
And and R R[rd] = R[rs] & R[rt] 0 / 24hex
And Immediate andi I R[rt] = R[rs] & ZeroExtImm (3) chex
Branch On Equal beq I
if(R[rs]==R[rt])
PC=PC+4+BranchAddr (4)
4hex
Branch On Not Equalbne I
if(R[rs]!=R[rt])
PC=PC+4+BranchAddr (4)
5hex
Jump j J PC=JumpAddr (5) 2hex
Jump And Link jal J R[31]=PC+4;PC=JumpAddr (5) 3hex
Jump Register jr R PC=R[rs] 0 / 08hex
基本命令形式
Set Less Than Unsig. sltu R R[rd] = (R[rs] < R[rt]) ? 1
Shift Left Logical sll R R[rd] = R[rt] << shamt
Shift Right Logical srl R R[rd] = R[rt] >> shamt
Subtract sub R R[rd] = R[rs] - R[rt]
Subtract Unsigned subu R R[rd] = R[rs] - R[rt]
(1) May cause overflow exception
(2) SignExtImm = { 16{immediate[15]
(3) ZeroExtImm = { 16{1b’0}, immedi
(5) JumpAddr = { PC+4[31:28], addr
(7) Atomic test&set pair; R[rt] = 1 if pa
R opcode rs rt rd s
31 26 25 21 20 16 15 11 10
I opcode rs rt im
31 26 25 21 20 16 15
(4) BranchAddr = { 14{immediate[15]
(6) Operands considered unsigned num
Store Word sw I M[R[rs]+SignExtImm] =
オーバーフローの検出(176頁)
■ 符号付き加算でのオーバーフロー
addu $t0,$t1,$t2
xor $t3,$t1,$t2
slt $t3,$t3,$zero
bne $t3,$zero,NoOV
xor $t3,$t0,$t1
slt $t3,$t3,$zero
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV: //オーバーフロー処理
■ 符号無し加算でのオーバーフロー
addu $t0,$t1,$2
nor $t3,$t1,$zero
sltu $t3,$t3,$t2
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV://オーバーフロー処理
オーバフロー例外を発生させないため
加算は全て,add ではなくて adduを使う.
オーバーフロー 4ビット符号付き整数同士の加算
■ 異符号同士の加算では
発生しない
■ 同符号同士の加算でし
か発生しない.
‣ 正+正=負
‣ 負+負=正
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111
-8 1000 OV OV OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111
-7 1001 OV OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000
-6 1010 OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001
-5 1011 OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010
-4 1100 OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011
-3 1101 OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100
-2 1110 OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101
-1 1111 OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110
0 0000 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111
1 0001 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV
2 0010 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV
3 0011 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV
4 0100 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV
5 0101 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV
6 0110 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV OV
7 0111 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV OV OV
排他的論理和 XOR
■ 排他的論理和 eXclusive OR,XOR,EORと表記する.論理記号は であり,X Yと書く.
■ 包含的論理和 inclusive OR,ORと表記する.論理記号は+であり,X+Yと書く.
X Y
OR XOR AND
X+Y X Y X・Y
0 0 0 0 0
0 1 1 1 0
1 0 1 1 0
1 1 1 0 1
OR XOR AND
S 0000000000000000000000000000000
$t1 S1
xor $t2 S2
$t3 S3
符号付き加算におけるオーバーフローの検出
■ 符号付き加算でのオーバーフロー
addu $t0,$t1,$t2
xor $t3,$t1,$t2
slt $t3,$t3,$zero
bne $t3,$zero,NoOV
xor $t3,$t0,$t1
slt $t3,$t3,$zero
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV: //オーバーフロー処理
■ $t1と$t2が異符号ならばオーバーフローしない
■ xorで同符号か異符号かを調べることができる
‣ $t1と$t2が同符号ならば
S3=0となり,$t3 0である
‣ $t1と$t2が異符号ならば
S3=1となり,$t3<0,負数,である
■ $t1と$t2が同符号ならば,加算結果$t0と$t1($t2)
の符号が異なればオーバーフローが発生している.
X Y XOR
0 0 0
0 1 1
1 0 1
1 1 0
オーバーフロー 4ビット符号無し整数同士の加算
■ 加算の結果が15(1111)2を
超えるとき
■ 1011+0110=10001
‣ 11+06=17>15
■ 検出条件
‣ X+Y>1111
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
0000000100100011010001010110011110001001101010111100110111101111
00 0000 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
01 0001 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV
02 0010 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV
03 0011 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV
04 0100 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV
05 0101 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV
06 0110 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV
07 0111 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV
08 1000 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV
09 1001 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV
10 1010 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV
11 1011 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV
12 1100 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV
13 1101 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV
14 1110 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV OV
15 1111 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV OV OV
符号無し加算におけるオーバーフローの検出
■ 符号無し加算でのオーバーフロー
addu $t0,$t1,$2
nor $t3,$t1,$zero
sltu $t3,$t3,$t2
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV://オーバーフロー処理
■ ビット反転(NOT)はnor命令で計算できる
nor $t3,$t1,$zero # $t3= NOT $t1
■ ビット反転した値は,次のように表すことができる
$t3= NOT $t1 = 232-1 - $t1
■ sltu $t3,$t3,$t2の意味は次の通り.
$t3 < $t2
232-1 - $t1 < $t2
232-1 < $t2+$t1
■ 次の条件が成立すれば,オーバーフローが発生している
232-1 < $t2+$t1
符号無し加算におけるオーバーフローの検出
■ 符号無し加算でのオーバーフロー
addu $t0,$t1,$2
nor $t3,$t1,$zero
sltu $t3,$t3,$t2
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV://オーバーフロー処理
■ ビット反転(NOT)はnor命令で計算できる
nor $t3,$t1,$zero # $t3= NOT $t1
■ ビット反転した値は,次のように表すことができる
$t3= NOT $t1 = 232-1 - $t1
■ sltu $t3,$t3,$t2の意味は次の通り.
$t3 < $t2
232-1 - $t1 < $t2
232-1 < $t2+$t1
■ 次の条件が成立すれば,オーバーフローが発生している
232-1 < $t2+$t1
norとnot
■ 否定notは単項演算子である. C言語では !x ですね.
■ $s0= not $s1 は,nor $s0,$zero,$s1 あるいは nor $s0,$s1,$zero で求められる.
X Y
OR NOR
X+Y X+Y
0 0 0 1
0 1 1 0
1 0 1 0
1 1 1 0
OR
XOR AND
NOT
NOR
X NOT X
0 1
1 0
符号無し加算におけるオーバーフローの検出
■ 符号無し加算でのオーバーフロー
addu $t0,$t1,$2
nor $t3,$t1,$zero
sltu $t3,$t3,$t2
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV://オーバーフロー処理
■ ビット反転(NOT)はnor命令で計算できる
nor $t3,$t1,$zero # $t3= NOT $t1
■ ビット反転した値は,次のように表すことができる
$t3= NOT $t1 = 232-1 - $t1
■ sltu $t3,$t3,$t2の意味は次の通り.
$t3 < $t2
232-1 - $t1 < $t2
232-1 < $t2+$t1
■ 次の条件が成立すれば,オーバーフローが発生している
232-1 < $t2+$t1
232は(100000000) なので,232 ‒1は,(FFFFFFFF)であり,
32ビット の最大値であり,すべて1の値である.
すべて1の値から,ある数を引くことは反転と同じである.
例)1111-0010=1101
32ビットの最大値
符号無し加算におけるオーバーフローの検出
■ 符号無し加算でのオーバーフロー
addu $t0,$t1,$2
nor $t3,$t1,$zero
sltu $t3,$t3,$t2
bne $t3,$zero,OV
NoOV: //オーバーフローなし
OV://オーバーフロー処理
■ ビット反転(NOT)はnor命令で計算できる
nor $t3,$t1,$zero # $t3= NOT $t1
■ ビット反転した値は,次のように表すことができる
$t3= NOT $t1 = 232-1 - $t1
■ sltu $t3,$t3,$t2の意味は次の通り.
$t3 < $t2
232-1 - $t1 < $t2
232-1 < $t2+$t1
■ 次の条件が成立すれば,オーバーフローが発生している
232-1 < $t2+$t1
2倍長の加算 dadd.s
■ 64ビット同士の加算をする
■ 上位32ビットと下位32ビットに分けて考える
‣ 下位32ビットは符号無し加算で,オーバーフロー
を検出する
‣ 上位32ビットは符号付き加算で,下位32ビット
の加算からオーバーフローがあれば加算結果に1
を加える.
.text
.globl __start
__start:
add $a0,$zero,0x40000000
add $a1,$zero,0x00001234
add $a2,$zero,0x3FFFFFFF
add $a3,$zero,0x0
jal dadd
break 2
dadd: add $v1,$zero,$zero
addu $v0,$a0,$a2
nor $t1,$a0,$zero
sltu $t1,$t1,$a2
beq $t1,$zero,No_OV
add $v1,$v1,1
No_OV:add $v1,$v1,$a1
add $v1,$v1,$a3
jr $ra
OV
$a1 $a0
+ $a3 $a2
$v1 $v0

Weitere ähnliche Inhalte

Was ist angesagt?

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイするTakayuki Itoh
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門Kawamoto_Kazuhiko
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paiza
 
Wilson score intervalを使った信頼区間の応用
Wilson score intervalを使った信頼区間の応用Wilson score intervalを使った信頼区間の応用
Wilson score intervalを使った信頼区間の応用智文 中野
 
情報検索における評価指標の最新動向と新たな提案
情報検索における評価指標の最新動向と新たな提案情報検索における評価指標の最新動向と新たな提案
情報検索における評価指標の最新動向と新たな提案Mitsuo Yamamoto
 
[DL輪読会]Deep Face Recognition: A Survey
[DL輪読会]Deep Face Recognition: A Survey[DL輪読会]Deep Face Recognition: A Survey
[DL輪読会]Deep Face Recognition: A SurveyDeep Learning JP
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Kazumi IWANAGA
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうTakuya Ueda
 
汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索uedayou
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使うAtsushi Hayakawa
 
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜 [DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜 Deep Learning JP
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案Masanori Kado
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)Kentaro Minami
 
研究発表を準備する
研究発表を準備する研究発表を準備する
研究発表を準備するTakayuki Itoh
 

Was ist angesagt? (20)

Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
Wilson score intervalを使った信頼区間の応用
Wilson score intervalを使った信頼区間の応用Wilson score intervalを使った信頼区間の応用
Wilson score intervalを使った信頼区間の応用
 
情報検索における評価指標の最新動向と新たな提案
情報検索における評価指標の最新動向と新たな提案情報検索における評価指標の最新動向と新たな提案
情報検索における評価指標の最新動向と新たな提案
 
[DL輪読会]Deep Face Recognition: A Survey
[DL輪読会]Deep Face Recognition: A Survey[DL輪読会]Deep Face Recognition: A Survey
[DL輪読会]Deep Face Recognition: A Survey
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろう
 
汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索汎用Web API“SPARQL”でオープンデータ検索
汎用Web API“SPARQL”でオープンデータ検索
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使う
 
研究効率化Tips Ver.2
研究効率化Tips Ver.2研究効率化Tips Ver.2
研究効率化Tips Ver.2
 
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜 [DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜
[DL輪読会]マルチエージェント強化学習と⼼の理論 〜Hanabiゲームにおけるベイズ推論を⽤いたマルチエージェント 強化学習⼿法〜
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案優れた研究論文の書き方―7つの提案
優れた研究論文の書き方―7つの提案
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)
 
研究発表を準備する
研究発表を準備する研究発表を準備する
研究発表を準備する
 

Ähnlich wie 第10回 計算機構成

ネイティブコードを語る
ネイティブコードを語るネイティブコードを語る
ネイティブコードを語るKenji Imasaki
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法LINE Corporation
 
md5のアルゴリズム
md5のアルゴリズムmd5のアルゴリズム
md5のアルゴリズムaomori ringo
 
ただのリンカを書いた話.pdf
ただのリンカを書いた話.pdfただのリンカを書いた話.pdf
ただのリンカを書いた話.pdfsimotin13 Miyazaki
 
kagami_comput2015_6
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6swkagami
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介Takehiko YOSHIDA
 
Capture the flag write up q13,q20,q21 for ss
Capture the flag write up q13,q20,q21 for ssCapture the flag write up q13,q20,q21 for ss
Capture the flag write up q13,q20,q21 for ssMasahiro Fukuda
 
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)masayukitakagi
 
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10Muneyoshi Suzuki
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Shinichi Hirauchi
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806swkagami
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, WorldNaohiro Aota
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10Muneyoshi Suzuki
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07swkagami
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707swkagami
 
Aw svs trifortクラウド選びのポイント
Aw svs trifortクラウド選びのポイントAw svs trifortクラウド選びのポイント
Aw svs trifortクラウド選びのポイントTaimei Omata
 
バイナリ駄洒落コンテスト
バイナリ駄洒落コンテストバイナリ駄洒落コンテスト
バイナリ駄洒落コンテストkozossakai
 

Ähnlich wie 第10回 計算機構成 (20)

ネイティブコードを語る
ネイティブコードを語るネイティブコードを語る
ネイティブコードを語る
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
md5のアルゴリズム
md5のアルゴリズムmd5のアルゴリズム
md5のアルゴリズム
 
ただのリンカを書いた話.pdf
ただのリンカを書いた話.pdfただのリンカを書いた話.pdf
ただのリンカを書いた話.pdf
 
kagami_comput2015_6
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6
 
Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介
 
Capture the flag write up q13,q20,q21 for ss
Capture the flag write up q13,q20,q21 for ssCapture the flag write up q13,q20,q21 for ss
Capture the flag write up q13,q20,q21 for ss
 
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
 
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
 
kagami_comput2016_07
kagami_comput2016_07kagami_comput2016_07
kagami_comput2016_07
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707
 
Aw svs trifortクラウド選びのポイント
Aw svs trifortクラウド選びのポイントAw svs trifortクラウド選びのポイント
Aw svs trifortクラウド選びのポイント
 
バイナリ駄洒落コンテスト
バイナリ駄洒落コンテストバイナリ駄洒落コンテスト
バイナリ駄洒落コンテスト
 
Gorinphp0928
Gorinphp0928Gorinphp0928
Gorinphp0928
 
Gorinphp0928
Gorinphp0928Gorinphp0928
Gorinphp0928
 

第10回 計算機構成

  • 1. (C)2021 TOMISAWA Masaki 第10回 計算機構成 前回の内容 ■ 2.8 コンピュータ・ハードウェア内での手続 きのサポート ‣入再帰型手続きのコンパイル ■ トレース課題 ■ 末尾呼出し(tail call) ■ 2.9 人との情報交換 ■ 2.10 32ビットの即値およびアドレスに対す るMIPSのアドレシング方式 ■ 擬似直接アドレッシング ■ PC相対アドレッシング 今回の内容 ■ トレース課題のQtSPIM ■ QtSPIMでのPC相対アドレッシング ■ 例題 マシン・コードの復号(p.115) ■ ソフトウェアによるオーバーフローの検出
  • 3. バイト転送命令と文字列コピー手続き ■ バイト転送命令 lb $t0,0($s0) sb $t0,0($s0) ■ 文字列コピー void strcpy( char x[], char y[]) { int i; // $s0 i = 0; while( (x[i]=y[i]) != 0 ) i = i + 1; } ■ MIPSコード strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero L1:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) beq $t2,$zero,L2 add $s0,$s0,1 j L1 L2:lw $s0,4($sp) addi $sp,$sp,4 jr $ra "ABCD" 41 42 43 44 0
  • 4. 効率の良いMIPSコード ■MIPSコード strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero L1:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) beq $t2,$zero,L2 add $s0,$s0,1 j L1 L2:lw $s0,4($sp) addi $sp,$sp,4 jr $ra ■ 効率の良いMIPSコード strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2 L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1 lw $s0,4($sp) addi $sp,$sp,4 jr $ra
  • 5. PC相対アドレッシング ■ 効率の良いMIPSコード ■ beq $zero,$zero,L2 ‣ L2の値はいくつか?  ■ bne $t2,$zero,L1 ‣ L1の値はいくつか? strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2 L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1 lw $s0,4($sp) addi $sp,$sp,4 jr $ra
  • 6. PC相対アドレッシング ■ 効率の良いMIPSコード ■ beq $zero,$zero,L2 ‣ L2の値はいくつか? 1 ■ bne $t2,$zero,L1 ‣ L1の値はいくつか? ­6 strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2 L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1 lw $s0,4($sp) addi $sp,$sp,4 jr $ra -1 beq $zero,$zero,L2 0 L1:add $s0,$s0,1 1 L2:add $t1,$a1,$s0 -6 L1:add $s0,$s0,1 -5 L2:add $t1,$a1,$s0 -4 lb $t2,0($t1) -3 add $t3,$a0,$s0 -2 sb $t2,0($t3) -1 bne $t2,$zero,L1 0 lw $s0,4($sp)
  • 7. QtSPIM:擬似命令の解説 ■ strcpyを呼び出すためのmain関数 ■ 擬似命令 ‣ .asciiz "ABCD" - 文字列の最後にナル文字が入る. - C言語の文字列と同じ. ‣ .byte 0xff,0x88,0x55 - バイト単位で数値を確保する ‣ .space 5 - 指定した数だけバイト領域を確保する 重要 .data y: .asciiz "ABCD" # char y[5] .byte 0xff,0x88,0x55 x: .space 5 # char x[5] .globl main .text main: la $a0,x la $a1,y jal strcpy break 2
  • 8. QtSPIM:データセグメント,リトルエンディアン ■ strcpyを呼び出すためのmain関数 ■ QtSPIMでのデータセグメント(実行前) ■ QtSPIMでのデータセグメント(実行後) 重要 .data y: .asciiz "ABCD" # char y[5] .byte 0xff,0x88,0x55 x: .space 5 # char x[5] User data segment [10000000]..[10040000] [10000000]..[1000ffff] 00000000 [10010000] 44434241 5588ff00 00000000 00000000 A B C D . . . . . . . . . . . . [10010010]..[1003ffff] 00000000 User data segment [10000000]..[10040000] [10000000]..[1000ffff] 00000000 [10010000] 44434241 5588ff00 44434241 00000000 A B C D . . . A B C D . . . . . [10010010]..[1003ffff] 00000000 41 42 43 44 0 ff 88 55 アドレス ビッグ エンディアン リトル エンディアン 10010000 41 44 10010001 42 43 10010002 43 42 10010003 44 41 10010004 0 55 10010005 ff 88 10010006 88 ff 10010007 55 0 41 42 43 44 0 ff 88 55
  • 9. QtSPIM:PC相対アドレッシング ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] 値が違う! 1と2,­6と­5 +1だけずれてる
  • 11. 原因はEnable Delayed Branchesの設定の違い Enable Delayed Branches Enable Delayed Branchesをチェックすると, 別の問題が発生します.
  • 12. 原因はEnable Delayed Branchesの設定の違い Enable Delayed Branches Enable Delayed Branchesをチェックすると, 別の問題が発生します. なので, QtSPIMでのPC相対アドレスは+1ずれている ということを覚えておいてください.
  • 13. QtSPIM:PC相対アドレッシング ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] レポートや試験では, 左側を正解,右側を不正解 とします. ○
  • 14. QtSPIM:PC相対アドレッシング ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] アセンブラの表記 beq $zero,$zero,8 beq $zero,$zero,2 アセンブラの表記 beq $zero,$zero,4 beq $zero,$zero,1
  • 15. QtSPIM:PC相対アドレッシング ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] アセンブラの表記 beq $zero,$zero,8 beq $zero,$zero,2 アセンブラの表記 beq $zero,$zero,4 beq $zero,$zero,1 4分の1の値を書くのか?    4倍の値を書くのか?
  • 16. QtSPIM:PC相対アドレッシング ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] レポートや試験では, 左側の4分の1の値を書くのかを正解, 右側の4倍の値を書くを不正解 とします. ○
  • 17. ○ QtSPIMを使う上での注意事項 ■ PC相対アドレス ■ QtSPIMでのテキストセグメント strcpy: addi $sp,$sp,-4 sw $s0,4($sp) add $s0,$zero,$zero beq $zero,$zero,L2(1) L1:add $s0,$s0,1 L2:add $t1,$a1,$s0 lb $t2,0($t1) add $t3,$a0,$s0 sb $t2,0($t3) bne $t2,$zero,L1(-6) lw $s0,4($sp) addi $sp,$sp,4 jr $ra 重要 User Text Segment [00400000]..[00440000] [00400000] 3c011001  lui $1, 4097 [x]
 [00400004] 34240008  ori $4, $1, 8 [x]
 [00400008] 3c051001  lui $5, 4097 [y]
 [0040000c] 0c100005  jal 0x00400014 [strcpy]
 [00400010] 0000000d  break
 [00400014] 23bdfffc  addi $29, $29, -4
 [00400018] afb00004  sw $16, 4($29)
 [0040001c] 00008020  add $16, $0, $0
 [00400020] 10000002  beq $0, $0, 8 [L2-0x00400020]
 [00400024] 22100001  addi $16, $16, 1
 [00400028] 00b04820  add $9, $5, $16
 [0040002c] 812a0000  lb $10, 0($9)
 [00400030] 00905820  add $11, $4, $16
 [00400034] a16a0000  sb $10, 0($11)
 [00400038] 1540fffb  bne $10, $0, -20 [L1-0x00400038]
 [0040003c] 8fb00004  lw $16, 4($29)
 [00400040] 23bd0004  addi $29, $29, 4
 [00400044] 03e00008  jr $31
 Kernel Text Segment [80000000]..[80010000] beq/bneのアドレスフィールドは+1ずれている. アセンブラでは4分の1の値を書く.
  • 18. マシン・コードの復号 ■ 次の機械語の命令に相当するアセンブリ言語の命令は何か? 00af802016 ■ 16進数から2進数に変換する ■ OPコード(6ビット)を調べる ‣ 00000なのでR形式である ■ funcコードを調べる ‣ 10 0000なのでAdd命令である ■ add命令 ‣add $16,$5,$15 ‣add $s0,$a1,$t7 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
  • 20. ソフトウェアによるオーバーフローの検出 ■ add命令とaddu命令の違いは何か? ‣ 演算結果は同じである. ■ オーバーフロー例外(overflow exception)が発生するかしないかの違い. ■ オーバーフローをソフトウェアで検出する方法はあるか? ‣ 符号付整数と符号なし整数の理解を深める ‣ 多倍長の計算に使える.例)2倍長(64ビット)の符号付整数の加算. コア命令セット OPCODE 名前 略号 形式 操作 - / FUNCT (Hex) Add add R R[rd] = R[rs] + R[rt] (1) 0 / 20hex Add Immediate addi I R[rt] = R[rs] + SignExtImm (1,2) 8hex Add Imm. Unsigned addiu I R[rt] = R[rs] + SignExtImm (2) 9hex Add Unsigned addu R R[rd] = R[rs] + R[rt] 0 / 21hex And and R R[rd] = R[rs] & R[rt] 0 / 24hex And Immediate andi I R[rt] = R[rs] & ZeroExtImm (3) chex Branch On Equal beq I if(R[rs]==R[rt]) PC=PC+4+BranchAddr (4) 4hex Branch On Not Equalbne I if(R[rs]!=R[rt]) PC=PC+4+BranchAddr (4) 5hex Jump j J PC=JumpAddr (5) 2hex Jump And Link jal J R[31]=PC+4;PC=JumpAddr (5) 3hex 0 / 08 コア命令セット OPCODE 名前 略号 形式 操作 - / FUNCT (Hex) Add add R R[rd] = R[rs] + R[rt] (1) 0 / 20hex Add Immediate addi I R[rt] = R[rs] + SignExtImm (1,2) 8hex Add Imm. Unsigned addiu I R[rt] = R[rs] + SignExtImm (2) 9hex Add Unsigned addu R R[rd] = R[rs] + R[rt] 0 / 21hex And and R R[rd] = R[rs] & R[rt] 0 / 24hex And Immediate andi I R[rt] = R[rs] & ZeroExtImm (3) chex Branch On Equal beq I if(R[rs]==R[rt]) PC=PC+4+BranchAddr (4) 4hex Branch On Not Equalbne I if(R[rs]!=R[rt]) PC=PC+4+BranchAddr (4) 5hex Jump j J PC=JumpAddr (5) 2hex Jump And Link jal J R[31]=PC+4;PC=JumpAddr (5) 3hex Jump Register jr R PC=R[rs] 0 / 08hex 基本命令形式 Set Less Than Unsig. sltu R R[rd] = (R[rs] < R[rt]) ? 1 Shift Left Logical sll R R[rd] = R[rt] << shamt Shift Right Logical srl R R[rd] = R[rt] >> shamt Subtract sub R R[rd] = R[rs] - R[rt] Subtract Unsigned subu R R[rd] = R[rs] - R[rt] (1) May cause overflow exception (2) SignExtImm = { 16{immediate[15] (3) ZeroExtImm = { 16{1b’0}, immedi (5) JumpAddr = { PC+4[31:28], addr (7) Atomic test&set pair; R[rt] = 1 if pa R opcode rs rt rd s 31 26 25 21 20 16 15 11 10 I opcode rs rt im 31 26 25 21 20 16 15 (4) BranchAddr = { 14{immediate[15] (6) Operands considered unsigned num Store Word sw I M[R[rs]+SignExtImm] =
  • 21. オーバーフローの検出(176頁) ■ 符号付き加算でのオーバーフロー addu $t0,$t1,$t2 xor $t3,$t1,$t2 slt $t3,$t3,$zero bne $t3,$zero,NoOV xor $t3,$t0,$t1 slt $t3,$t3,$zero bne $t3,$zero,OV NoOV: //オーバーフローなし OV: //オーバーフロー処理 ■ 符号無し加算でのオーバーフロー addu $t0,$t1,$2 nor $t3,$t1,$zero sltu $t3,$t3,$t2 bne $t3,$zero,OV NoOV: //オーバーフローなし OV://オーバーフロー処理 オーバフロー例外を発生させないため 加算は全て,add ではなくて adduを使う.
  • 22. オーバーフロー 4ビット符号付き整数同士の加算 ■ 異符号同士の加算では 発生しない ■ 同符号同士の加算でし か発生しない. ‣ 正+正=負 ‣ 負+負=正 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 -8 1000 OV OV OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 -7 1001 OV OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 -6 1010 OV OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 -5 1011 OV OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 -4 1100 OV OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 -3 1101 OV OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 -2 1110 OV OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 -1 1111 OV 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0 0000 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 1 0001 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV 2 0010 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV 3 0011 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV 4 0100 1100 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV 5 0101 1101 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV 6 0110 1110 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV OV 7 0111 1111 0000 0001 0010 0011 0100 0101 0110 0111 OV OV OV OV OV OV OV
  • 23. 排他的論理和 XOR ■ 排他的論理和 eXclusive OR,XOR,EORと表記する.論理記号は であり,X Yと書く. ■ 包含的論理和 inclusive OR,ORと表記する.論理記号は+であり,X+Yと書く. X Y OR XOR AND X+Y X Y X・Y 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 OR XOR AND
  • 24. S 0000000000000000000000000000000 $t1 S1 xor $t2 S2 $t3 S3 符号付き加算におけるオーバーフローの検出 ■ 符号付き加算でのオーバーフロー addu $t0,$t1,$t2 xor $t3,$t1,$t2 slt $t3,$t3,$zero bne $t3,$zero,NoOV xor $t3,$t0,$t1 slt $t3,$t3,$zero bne $t3,$zero,OV NoOV: //オーバーフローなし OV: //オーバーフロー処理 ■ $t1と$t2が異符号ならばオーバーフローしない ■ xorで同符号か異符号かを調べることができる ‣ $t1と$t2が同符号ならば S3=0となり,$t3 0である ‣ $t1と$t2が異符号ならば S3=1となり,$t3<0,負数,である ■ $t1と$t2が同符号ならば,加算結果$t0と$t1($t2) の符号が異なればオーバーフローが発生している. X Y XOR 0 0 0 0 1 1 1 0 1 1 1 0
  • 25. オーバーフロー 4ビット符号無し整数同士の加算 ■ 加算の結果が15(1111)2を 超えるとき ■ 1011+0110=10001 ‣ 11+06=17>15 ■ 検出条件 ‣ X+Y>1111 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0000000100100011010001010110011110001001101010111100110111101111 00 0000 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 01 0001 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV 02 0010 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV 03 0011 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV 04 0100 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV 05 0101 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV 06 0110 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV 07 0111 0111 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV 08 1000 1000 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV 09 1001 1001 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV 10 1010 1010 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV 11 1011 1011 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV 12 1100 1100 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV 13 1101 1101 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV 14 1110 1110 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV OV 15 1111 1111 OV OV OV OV OV OV OV OV OV OV OV OV OV OV OV
  • 26. 符号無し加算におけるオーバーフローの検出 ■ 符号無し加算でのオーバーフロー addu $t0,$t1,$2 nor $t3,$t1,$zero sltu $t3,$t3,$t2 bne $t3,$zero,OV NoOV: //オーバーフローなし OV://オーバーフロー処理 ■ ビット反転(NOT)はnor命令で計算できる nor $t3,$t1,$zero # $t3= NOT $t1 ■ ビット反転した値は,次のように表すことができる $t3= NOT $t1 = 232-1 - $t1 ■ sltu $t3,$t3,$t2の意味は次の通り. $t3 < $t2 232-1 - $t1 < $t2 232-1 < $t2+$t1 ■ 次の条件が成立すれば,オーバーフローが発生している 232-1 < $t2+$t1
  • 27. 符号無し加算におけるオーバーフローの検出 ■ 符号無し加算でのオーバーフロー addu $t0,$t1,$2 nor $t3,$t1,$zero sltu $t3,$t3,$t2 bne $t3,$zero,OV NoOV: //オーバーフローなし OV://オーバーフロー処理 ■ ビット反転(NOT)はnor命令で計算できる nor $t3,$t1,$zero # $t3= NOT $t1 ■ ビット反転した値は,次のように表すことができる $t3= NOT $t1 = 232-1 - $t1 ■ sltu $t3,$t3,$t2の意味は次の通り. $t3 < $t2 232-1 - $t1 < $t2 232-1 < $t2+$t1 ■ 次の条件が成立すれば,オーバーフローが発生している 232-1 < $t2+$t1
  • 28. norとnot ■ 否定notは単項演算子である. C言語では !x ですね. ■ $s0= not $s1 は,nor $s0,$zero,$s1 あるいは nor $s0,$s1,$zero で求められる. X Y OR NOR X+Y X+Y 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 OR XOR AND NOT NOR X NOT X 0 1 1 0
  • 29. 符号無し加算におけるオーバーフローの検出 ■ 符号無し加算でのオーバーフロー addu $t0,$t1,$2 nor $t3,$t1,$zero sltu $t3,$t3,$t2 bne $t3,$zero,OV NoOV: //オーバーフローなし OV://オーバーフロー処理 ■ ビット反転(NOT)はnor命令で計算できる nor $t3,$t1,$zero # $t3= NOT $t1 ■ ビット反転した値は,次のように表すことができる $t3= NOT $t1 = 232-1 - $t1 ■ sltu $t3,$t3,$t2の意味は次の通り. $t3 < $t2 232-1 - $t1 < $t2 232-1 < $t2+$t1 ■ 次の条件が成立すれば,オーバーフローが発生している 232-1 < $t2+$t1 232は(100000000) なので,232 ‒1は,(FFFFFFFF)であり, 32ビット の最大値であり,すべて1の値である. すべて1の値から,ある数を引くことは反転と同じである. 例)1111-0010=1101
  • 30. 32ビットの最大値 符号無し加算におけるオーバーフローの検出 ■ 符号無し加算でのオーバーフロー addu $t0,$t1,$2 nor $t3,$t1,$zero sltu $t3,$t3,$t2 bne $t3,$zero,OV NoOV: //オーバーフローなし OV://オーバーフロー処理 ■ ビット反転(NOT)はnor命令で計算できる nor $t3,$t1,$zero # $t3= NOT $t1 ■ ビット反転した値は,次のように表すことができる $t3= NOT $t1 = 232-1 - $t1 ■ sltu $t3,$t3,$t2の意味は次の通り. $t3 < $t2 232-1 - $t1 < $t2 232-1 < $t2+$t1 ■ 次の条件が成立すれば,オーバーフローが発生している 232-1 < $t2+$t1
  • 31. 2倍長の加算 dadd.s ■ 64ビット同士の加算をする ■ 上位32ビットと下位32ビットに分けて考える ‣ 下位32ビットは符号無し加算で,オーバーフロー を検出する ‣ 上位32ビットは符号付き加算で,下位32ビット の加算からオーバーフローがあれば加算結果に1 を加える. .text .globl __start __start: add $a0,$zero,0x40000000 add $a1,$zero,0x00001234 add $a2,$zero,0x3FFFFFFF add $a3,$zero,0x0 jal dadd break 2 dadd: add $v1,$zero,$zero addu $v0,$a0,$a2 nor $t1,$a0,$zero sltu $t1,$t1,$a2 beq $t1,$zero,No_OV add $v1,$v1,1 No_OV:add $v1,$v1,$a1 add $v1,$v1,$a3 jr $ra OV $a1 $a0 + $a3 $a2 $v1 $v0