Thực hành kiến trúc máy tính ự 4 Bảng tóm tắt các lệnh trong bài thực hành Instruction Meaning Instruction Format add $s1, $s2, $s3 $s1 = $s2 + $s3 $s1 = $s2 + $s3 op = 0 op = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 f = 0x20 f = 0x21 addu $s1, $s2, $s3 sub $s1, $s2, $s3 $s1 = $s2 – $s3 $s1 = $s2 – $s3 $s1 = $s2 & $s3 $s1 = $s2 | $s3 op = 0 op = 0 op = 0 op = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 f = 0x22 f = 0x23 f = 0x24 f = 0x25 subu $s1, $s2, $s3 and or $s1, $s2, $s3 $s1, $s2, $s3 xor nor sll $s1, $s2, $s3 $s1, $s2, $s3 $s1,$s2,10 $s1 = $s2 ^ $s3 $s1 = ~($s2|$s3) $s1 = $s2 << 10 op = 0 op = 0 op = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 rs = $s2 rt = $s3 rd = $s1 sa = 0 f = 0x26 f = 0x27 f = 0x00 rs = 0 rs = 0 rs = 0 rt = $s2 rd = $s1 sa = 10 rt = $s2 rd = $s1 sa = 10 rt = $s2 rd = $s1 sa = 10 srl sra $s1,$s2,10 $s1 = $s2>>>10 $s1 = $s2 >> 10 (Hi, Lo) = $s1*$s2 (Hi, Lo) = $s1*$s2 op = 0 op = 0 op = 0 op = 0 op = 0 f = 0x02 f = 0x03 f = 0x18 f = 0x19 f = 0x1A $s1, $s2, 10 mult $s1, $s2 multu $s1, $s2 rs = $s1 rt = $s2 rs = $s1 rt = $s2 rs = $s1 rt = $s2 rd = 0 rd = 0 rd = 0 sa = 0 sa = 0 sa = 0 div $s1, $s2 Hi = $s1/$s2 Lo = $s1%$s2 divu $s1, $s2 Hi = $s1/$s2 op = 0 rs = $s1 rt = $s2 rd = 0 sa = 0 f = 0x1B Lo = $s1%$s2 mfhi $s1 mflo $s1 $s1 = Hi $s1 = Lo op = 0 op = 0 rs = 0 rs = 0 rt = 0 rt = 0 rd = $s1 sa = 0 rd = $s1 sa = 0 f = 0x10 f = 0x12 Các lệnh số học/luận lý có hằng số Imm16 \= 10 addi $s1, $s2, 10 addiu $s1, $s2, 10 andi $s1, $s2, 10 $s1 = $s2 + 10 op = 0x8 rs = $s2 rt = $s1 op = 0x9 rs = $s2 rt = $s1 op = 0xc rs = $s2 rt = $s1 op = 0xd rs = $s2 rt = $s1 op = 0xe rs = $s2 rt = $s1 $s1 = $s2 + 10 $s1 = $s2 & 10 $s1 = $s2 | 10 $s1 = $s2 ^ 10 $s1 = 10 << 16 Imm16 \= 10 Imm16 \= 10 Imm16 \= 10 Imm16 \= 10 Imm16 \= 10 ori $s1, $s2, 10 xori $s1, $s2, 10 lui $s1, 10 op = 0xf 0 rt = $s1 Các lệnh rẽ nhánh, nhảy Imm26 j label jump to label op = 2 branch if ($s1 == $s2) op = 4 branch if ($s1 != $s2) op = 5 Imm16 Imm16 Imm16 Imm16 Imm16 beq bne $s1, $s2, label $s1, $s2, label rs = $s1 rt = $s2 rs = $s1 rt = $s2 blez $s1, label bgtz $s1, label bltz $s1, label branch if ($s1 <= 0) branch if ($s1 > 0) branch if ($s1 < 0) op = 6 op = 7 op = 1 rs = $s1 rs = $s1 rs = $s1 0 0 0 3 Thực hành kiến trúc máy tính ự 4 bgez $s1, label slt $t0,$s1,$s2 branch if ($s1 >= 0) $t0=($s1<$s2?1:0) $t0=($s1<$s2?1:0) $t0=($s1<10?1:0) $t0=($s1<10?1:0) op = 1 op = 0 op = 0 rs = $s1 1 Imm16 rs = $s1 rt = $s2 rs = $s1 rt = $s2 rd = $t0 rd = $t0 0 f = 0x2a f = 0x2b sltu $t0,$s1,$s2 slti $t0,$s1,10 sltiu $t0,$s1,10 0 op = 0xa rs = $s1 rt = $t0 op = 0xb rs = $s1 rt = $t0 Imm16 \= 10 Imm16 \= 10 Các lệnh truy xuất bộ nhớ load và store $s1, imm16($s0) s1 = MEM[s0+imm16] op = 0x20 rs = $s0 rt = $s1 Imm16 Imm16 Imm16 Imm16 Imm16 Imm16 Imm16 Imm16 lb lh $s1, imm16($s0) $s1, imm16($s0) $s1, imm16($s0) $s1, imm16($s0) $s1, imm16($s0) $s1, imm16($s0) $s1, imm16($s0) s1 = MEM[s0+imm16] op = 0x21 rs = $s0 rt = $s1 s1 = MEM[s0+imm16] op = 0x23 rs = $s0 rt = $s1 s1 = MEM[s0+imm16] op = 0x24 rs = $s0 rt = $s1 s1 = MEM[s0+imm16] op = 0x25 rs = $s0 rt = $s1 MEM[s0+imm16] = s1 op = 0x28 rs = $s0 rt = $s1 MEM[s0+imm16] = s1 op = 0x29 rs = $s0 rt = $s1 MEM[s0+imm16] = s1 op = 0x2b rs = $s0 rt = $s1 lw lbu lhu sb sh sw 4 Thực hành kiến trúc máy tính B ng tóm t t các l nh trong bài thực hành ự 4 s ore( ), oa ( ), a o arra (BYTE, HALF, WORD, FLOAT, DOUBLE, ASCII, ASCIIZ, SPACE … ) r arra . a e eo or a ss a a as , : 5130xxxx_lab4_bai1a.asm B 1. ệ ệ . ư ướ 2 lab 2). với a = 4, b = 3, c = 2, d = 1 a, b, c, d ố ư ư sẵn ở vùng data ị ị kq ư ẵ ướ . .data x: a: b: c: d: .word .word .word .word .word 0 1 2 3 4 0 kq: .word .text main: quan sát giá trị “kq” ở cửa sổ “da a”#$s0 chứa địa chỉ của biến x la $s0, x #địa chỉ biến (a, b, c, d, kq) lần lược là $s0 + #(4, 8, 12, 16, 20) thêm code tính toán biểu thức fD – – . B 2. ắ ả 10 sau: 1, 6, 3, 23, 3, 7, 8, 34, 24, 50 ế ư ế ạ n. 5 Thực hành kiến trúc máy tính ự 4 B 3. ự : “K M 13” ế ạ ư ớ ự ự ế ế ư ư ạ ự . B 4. Xuất giá trị ra LED 7 oạn S d ng công c “Digital Lab Sim” (trong menu “Tool”), viết chư ng trình hi n thị số có hai ch số bất kỳ ư c nhập t ngư i dùng. Đoạn chư ng trình mẫu dưới ây hi n thị số “10” . Tham kh o ph n “Help” c a công c này hi u rõ chư ng trình. # Display LED's Value using Digital Lab Sim, # please read "help" .data LEDL: .byte LEDR: .byte 1 0 # Left Digit value # Right Digit value LEDFONT1: .byte 0x3f, 0x06, 0x5b, 0x4f .text la la la li li $t0, LEDL load address of Left Digit value byte$t1, LEDR # load address of Right Digit value byte $t5, LEDFONT1 $t2, 0xFFFF0011 $t3, 0xFFFF0010 # load address of Left Digit # load address of Right Digit # load value of Left Digit lbu $t0, 0($t0) 6 Thực hành kiến trúc máy tính ự 4 lbu $t1, 0($t1) load value of Right Digitadd $t0,$t0,$t5 get the LEDFONT1[LEDL]lb $t0,0($t0) sb $t0, 0($t2) push the LEDFONT1[LEDL] to Left LEDadd $t1,$t1,$t5 # get the LEDFONT1[LEDR] lb $t1,0($t1) sb $t1, 0($t3) # push the LEDFONT1[LEDR] to Right LED li syscall $v0, 10 # system call for exit # we are out of here. 7 |