1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo thực hành tổ chức và cấu trúc máy tính ii it012

32 64 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KHOA HỌC VÀ KỸ THUẬT THÔNG TIN BÁO CÁO THỰC HÀNH Tổ chức Cấu trúc Máy tính II/ IT012 Giảng viên hướng dẫn : ThS Ngô Hiếu Trường Họ tên sinh viên : Nguyễn Xuân Thanh MSSV : 22540020 TP Hồ Chí Minh, tháng năm 2023 MỤC LỤC Chương IT002-Lab01 Lý thuyết Giảng viên hướng dẫn sinh viên sử dụng phần mềm Logisim dựa theo tài liệu: Hướng dẫn sử dụng Logisim Giảng viên giới thiệu cho sinh viên số cổng luận lý thiết bị lưu trữ phần mềm Thực hành 2.1 Tìm hiểu mơ cổng luận lý sau: AND, OR, NOT, XOR, XNOR, NAND, NOR 2.2 Tìm hiểu mô thiết bị lưu trữ sau: D latch, D flip-flop, Thanh ghi (Register) Bài tập 3.1 Mô mạch tổ hợp sau: 3.2 Mô mạch sau: Chương IT002-Lab02 Lý thuyết Giảng viên giới thiệu cấu trúc xử lý, tập trung vào ALU Register Files Giảng viên hướng dẫn sinh viên thiết kế mạch tổ hợp đơn giản Thực hành 2.1.Mô ALU sau: 2.2.Mô Register Files sau: Bài tập 3.1.Cải tiến ALU với phép toán: A + B, A + 1, A – B, A – 1, A AND B, A OR B, A XOR B, A XNOR B 3.3 Thiết kế mô lại Register Files với địa xuất riêng với địa ghi? 3.4 Thiết kế mạch tổ hợp có chức chuyển đổi số thành MSSV bảng bên dưới? Ví dụ: MSSV 21522345 Chương IT002-Lab03 Lý thuyết Giảng viên hướng dẫn sinh viên sử dụng phần mềm MARS dựa theo tài liệu: MARS – chương trình mơ hợp ngữ (assembly) MIPS Thực hành 2.1 Sinh viên tìm hiểu tài liệu “Một số lệnh assembly MIPS bản” mô việc thực thi lệnh cho biết chức lệnh sau: add, addi, addu, addiu, sub, subu, and, andi, or, nor, lw, sw, slt, slti, sltu, sltiu, syscall 2.2 Mô chương trình bên có biết ý nghĩa chương trình: Bài tập 3.1 Nhập vào chuỗi, xuất cửa sổ I/O MARS theo yêu cầu sau: a) Khai báo xuất cửa sổ I/O chuỗi có giá trị sau: - Chuỗi 1: Chao ban! Ban la sinh vien nam thu may? - Chuỗi 2: Hihi, minh la sinh vien nam thu ^-^ b) Biểu diễn nhị phân chuỗi nhớ gì? c) Xuất lại chuỗi nhập Ví dụ: Nhap: Truong Dai hoc Cong nghe Thong tin Xuất: Truong Dai hoc Cong nghe Thong tin d) Nhập vào số nguyên sau xuất tổng số nguyên Chương IT002-Lab04 Lý thuyết Giảng viên hướng dẫn sinh viên chương trình hợp ngữ MIPS dựa theo tài liệu: Tổng quát hợp ngữ kiến trúc MIPS Thực hành Chuyển đoạn code bảng theo sau sang MIPS sử dụng MARS để kiểm tra lại kết quả: if (i == j) f = g + h; else f = g – h; (Với giá trị i, j, f, g, h chứa ghi $s0, $s1, $s2, $t0, $t1) int Sum = for (int i = 1; i 'z' khơng phải chữ thường 18 # Nếu ký tự nằm khoảng ['a', 'z'] xuất thông báo chữ thường li $v0, la $a0, lowercase_msg syscall j end not_lowercase: blt $t0, $t5, invalid_type # ký tự < 'A' invalid type bgt $t0, $t6, invalid_type # ký tự > 'Z' invalid type # Nếu ký tự nằm khoảng ['A', 'Z'] xuất thơng báo chữ hoa li $v0, la $a0, uppercase_msg syscall j end invalid_type: # Nếu ký tự khơng thuộc ba loại xuất thông báo invalid type li $v0, la $a0, invalid_msg syscall end: Chương IT002-Lab05 Thao tác với mảng Mảng với n phần tử chuỗi n phần tử liên tiếp nhớ Thao tác với mảng MIPS thao tác trực tiếp với byte/word nhớ ▪ Để cấp phát chuỗi word byte nhớ, có giá trị khởi tao sử dụng “.word” “.byte” “.data” ▪ Để cấp phát chuỗi byte khơng có giá trị khởi tạo trước, sử dụng “.space” “.data” Cho ba mảng với cấp phát liệu nhớ sau: data array1: word 5, 6, 7, 8, 1, 2, 3, 9, 10, size1: word 10 array2: byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 size2: word 16 array3: space size3: word Mảng array1 có 10 word, kích thước lưu size1; Mảng array2 có 16 byte, kích thước lưu size2; Mảng array3 có byte, kích thước lưu size3 Viết code phần “.text” thực riêng phần việc: ✓ In cửa sổ I/O MARS tất phần tử mảng array1 array2 19 ✓ Gán giá trị cho mảng array3 cho array3[i] = array2[i] + array2[size2 - - i] ✓ Người sử dụng nhập vào mảng thứ số phần tử cần lấy mảng đó, chương trình xuất phần tử tương ứng .data array1: word 5, 6, 7, 8, 1, 2, 3, 9, 10, size1: word 10 array2: byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 size2: word 16 array3: space size3: word print_msg: asciiz "\nMang thu " element_msg: asciiz "\nPhan tu thu " input_msg: asciiz "\nNhap mang thu may va chi so phan tu can lay (cach boi khoang trang): " error_msg: asciiz "\nDu lieu nhap khong hop le!" text # In cửa sổ I/O MARS tất phần tử mảng array1 array2 li $t0, # biến đếm cho mảng thứ li $t1, # biến đếm cho phần tử mảng thứ la $t2, array1 # địa mảng thứ lw $t3, size1 # kích thước mảng thứ li $t4, # biến đếm cho mảng thứ hai li $t5, # biến đếm cho phần tử mảng thứ hai la $t6, array2 # địa mảng thứ hai lw $t7, size2 # kích thước mảng thứ hai print_loop: beq $t0, $t4, print_array2 # in mảng thứ hai nhảy đến nhãn print_array2 beq $t1, $t3, next_array # in hết phần tử mảng thứ nhảy đến nhãn next_array # In dòng "Mang thu x" với x số thứ tự mảng li $v0, la $a0, print_msg syscall li $v0, move $a0, $t0 syscall # In dòng "Phan tu thu y" với y số thứ tự phần tử mảng li $v0, la $a0, element_msg syscall addi $a0, $t1, # cộng thêm số 20 li $v0, syscall # In giá trị phần tử vị trí mảng thứ (word) lw $a0, ($t2) li $v0 ,1 syscall # Tăng biến đếm cho phần tử lên đơn vị tăng địa lên bốn byte (word) addi $t1 , $t1 ,1 addi $t2 , $t2 ,4 j print_loop # quay lại vòng lặp in next_array: # Chuyển sang in mảng thứ hai reset biến đếm cho phần tử không move $t0 , $t4 li $t1 ,0 j print_loop # quay lại vòng lặp in print_array2: beq $t5 , $t7 , end_print # in hết phần tử mảng thứ hai nhảy đến nhãn end_print # In dòng "Mang thu x" với x số thứ tự mảng li $v0 ,4 la $a0 ,print_msg syscall li $v0 ,1 move $a0 ,$t0 syscall # In dòng "Phan tu thu y" với y số thứ tự phần tử mảng li $v0 ,4 la $a0 ,element_msg syscall addi $a0 ,$t5 ,1 # cộng thêm số li $v0 ,1 syscall # In giá trị phần tử vị trí mảng thứ hai (byte) lb $a0 ,($t6) li $v0 ,1 syscall # Tăng biến đếm cho phần tử lên đơn vị tăng địa lên byte (byte) addi $t5 ,$t5 ,1 addi $t6 ,$t6 ,1 j print_loop # quay lại vòng lặp in 21 end_print: # Gán giá trị cho mảng array3 cho array3[i] = array2[i] + array2[size2 - - i] li $t0, # biến đếm cho phần tử mảng la $t1, array2 # địa mảng array2 la $t2, array3 # địa mảng array3 lw $t3, size2 # kích thước mảng array2 assign_loop: beq $t0, $t3, end_assign # gán hết phần tử nhảy đến nhãn end_assign # Lấy giá trị array2[i] lưu vào ghi $t4 lb $t4, ($t1) # Tính số phần tử đối xứng với i mảng array2 lưu vào ghi $t5 subi $t5, $t3, sub $t5, $t5, $t0 # Lấy giá trị array2[size2 - - i] lưu vào ghi $t6 sll $t6, $t5, # nhân với để chuyển từ số sang độ dời byte add $t6, $t6, $t1 # cộng với địa ban đầu mảng để địa phần tử cần lấy lb $t6, ($t6) # Cộng hai giá trị lại lưu vào ghi $t7 addu $t7, $t4, $t6 # Gán giá trị cho array3[i] sb $t7, ($t2) # Tăng biến đếm cho phần tử lên đơn vị tăng địa lên byte (byte) cho hai mảng addi $t0, $t0, addi $t1, $t1, addi $t2, $t2, j assign_loop # quay lại vòng lặp gán end_assign: # Người sử dụng nhập vào mảng thứ số phần tử cần lấy mảng đó, chương trình xuất phần tử tương ứng li $v0 ,4 la $a0 ,input_msg syscall # in dòng nhắc nhập li $v0 ,5 syscall # đọc số nguyên từ bàn phím số thứ tự mảng cần lấy move $s0 ,$v0 # lưu số thứ tự mảng vào ghi $s0 li $v0 ,5 syscall # đọc số nguyên từ bàn phím số phần tử cần lấy move $s1 ,$v0 # lưu số phần tử vào ghi $s1 22 beqz $s0 ,error_input # số thứ tự mảng khơng nhảy đến nhãn error_input bgt $s0 ,3 ,error_input # số thứ tự mảng lớn ba nhảy đến nhãn error_input bltz $s1 ,error_input # số phần tử nhỏ không nhảy đến nhãn error_input beq beq beq $s0 ,1 ,get_array1 # số thứ tự mảng nhảy đến nhãn get_array1 $s0 ,2 ,get_array2 # số thứ tự mảng hai nhảy đến nhãn get_array2 $s0 ,3 ,get_array3 # số thứ tự mảng ba nhảy đến nhãn get_array3 get_array1: lw $t0 ,size1 # lấy kích thước mảng array1 bgt $s1 ,$t0 ,error_input # số phần tử lớn kích thước mảng nhảy đến nhãn error_input la $t1 ,array1 # lấy địa mảng array1 sll $t2 ,$s1 ,2 # tính độ dời byte từ đầu mảng đến phần tử cần lấy add $t2 ,$t2 ,$t1 # cộng với địa ban đầu mảng để địa phần tử cần lấy lw $a0 ,($t2) # lấy giá trị phần tử cần lấy j print_element # nhảy đến nhãn print_element để in giá trị phần tử get_array2: lw $t0 ,size2 # lấy kích thước mảng array2 bgt $s1 ,$t0 ,error_input # số phần tử lớn kích thước mảng nhảy đến nhãn error_input la $t1 ,array2 # lấy địa mảng array2 add $t2 ,$s1 ,$t1 # cộng với địa ban đầu mảng để địa phần tử cần lấy lb $a0 ,($t2) # lấy giá trị phần tử cần lấy j print_element # nhảy đến nhãn print_element để in giá trị phần tử get_array3: lw $t0 ,size3 # lấy kích thước mảng array3 bgt $s1 ,$t0 ,error_input # số phần tử lớn kích thước mảng nhảy đến nhãn error_input la $t1 ,array3 # lấy địa mảng array3 add $t2 ,$s1 ,$t1 # cộng với địa ban đầu mảng để địa phần tử cần lấy lb $a0 ,($t2) # lấy giá trị phần tử cần lấy j print_element # nhảy đến nhãn print_element để in giá trị phần tử print_element: li $v0 ,1 syscall # in giá trị phần tử j end_program # kết thúc chương trình error_input: li $v0 ,4 la $a0 ,error_msg syscall # in dịng thơng báo lỗi nhập liệu 23 end_program: Thao tác với trỏ Con trỏ biến lưu địa biến khác Thao tác với trỏ MIPS thao tác trực tiếp với địa nhớ Thực lại yêu cầu nội dung với trỏ .data a: word b: word c: word d: word ptr1: word a # trỏ ptr1 trỏ đến biến a ptr2: word b # trỏ ptr2 trỏ đến biến b ptr3: word c # trỏ ptr3 trỏ đến biến c ptr4: word d # trỏ ptr4 trỏ đến biến d text # Thực lại yêu cầu nội dung với trỏ # a Tính tổng hai số lưu hai trỏ ptr1 ptr2, lưu kết vào ghi $s0 lw $t0, ptr1 # lấy địa biến a từ trỏ ptr1 lw $t1, ($t0) # lấy giá trị biến a từ địa lấy lw $t2, ptr2 # lấy địa biến b từ trỏ ptr2 lw $t3, ($t2) # lấy giá trị biến b từ địa lấy add $s0, $t1, $t3 # cộng hai giá trị lại lưu vào ghi $s0 # b Tính hiệu hai số lưu hai trỏ ptr3 ptr4, lưu kết vào ghi $s1 lw $t0, ptr3 # lấy địa biến c từ trỏ ptr3 lw $t1, ($t0) # lấy giá trị biến c từ địa lấy lw $t2, ptr4 # lấy địa biến d từ trỏ ptr4 lw $t3, ($t2) # lấy giá trị biến d từ địa lấy sub $s1, $t1, $t3 # trừ hai giá trị lại lưu vào ghi $s1 # c Tính tích hai số lưu ghi $s0 $s1, lưu kết vào ghi $s2 mul $s2, $s0, $s1 # nhân hai giá trị lại lưu vào ghi $s2 # d Tính thương hai số lưu ghi $s0 $s1, lưu kết vào ghi $s3 (phần nguyên) ghi $s4 (phần dư) div $s3, $s4, $s0, $s1 # chia hai giá trị lại lưu phần nguyên vào ghi $s3 phần dư vào ghi $s4 # e In hình kết lưu ghi từ $s0 đến $s4 theo thứ tự tăng dần số ghi li $v0 ,4 la $a0 ,sum_msg syscall # in dòng "Tong la: " move $a0 ,$s0 li $v0 ,1 syscall # in giá trị tổng li $v0 ,4 la $a0 ,diff_msg syscall # in dòng "Hieu la: " 24 move $a0 ,$s1 li $v0 ,1 syscall # in giá trị hiệu li $v0 ,4 la $a0 ,product_msg syscall # in dòng "Tich la: " move $a0 ,$s2 li $v0 ,1 syscall # in giá trị tích li $v0 ,4 la $a0 ,quotient_msg syscall # in dòng "Thuong la: " move $a0 ,$s3 li $v0 ,1 syscall # in giá trị thương (phần nguyên) li $v0 ,4 la $a0 ,remainder_msg syscall # in dòng "Du la: " move $a0 ,$s4 li $v0 ,1 syscall # in giá trị thương (phần dư) Bài tập (chỉ sử dụng trỏ) a Nhập mảng số nguyên n phần tử (nhập vào số phần tử giá trị phần tử), xuất cửa sổ I/O MARS theo yêu cầu sau: ✓ Xuất giá trị lớn nhỏ mảng ✓ Tổng tất phần tử mảng ✓ Người sử dụng nhập vào số phần tử giá trị phần tử in cửa sổ data input_size: asciiz "Nhap so phan tu cua mang: " input_element: asciiz "Nhap phan tu thu " input_index: asciiz "\nNhap chi so cua phan tu can lay: " max_msg: asciiz "\nGia tri lon nhat cua mang la: " min_msg: asciiz "\nGia tri nho nhat cua mang la: " sum_msg: asciiz "\nTong cac phan tu cua mang la: " element_msg: asciiz "\nGia tri cua phan tu can lay la: " text # Nhập mảng số nguyên n phần tử (nhập vào số phần tử giá trị phần tử) li $v0, la $a0, input_size syscall # in dòng nhắc nhập số phần tử li $v0, syscall # đọc số nguyên từ bàn phím số phần tử mảng move $s0, $v0 # lưu số phần tử vào ghi $s0 25 li $t0, # biến đếm cho phần tử mảng li $t1, # kích thước word (byte) mul $t2, $s0, $t1 # tính kích thước cần cấp phát cho mảng (byte) li $v0, move $a0, $t2 syscall # cấp phát nhớ cho mảng move $s1, $v0 # lưu địa mảng vào ghi $s1 input_loop: beq $t0, $s0, end_input # nhập đủ số phần tử nhảy đến nhãn end_input li $v0, la $a0, input_element syscall # in dòng nhắc nhập phần tử addi $a0, $t0, # cộng thêm số li $v0, syscall # in số thứ tự phần tử li $v0, syscall # đọc số nguyên từ bàn phím giá trị phần tử sw $v0, ($s1) # lưu giá trị phần tử vào mảng # Tăng biến đếm cho phần tử lên đơn vị tăng địa lên bốn byte (word) addi $t0, $t0, addi $s1, $s1, j input_loop # quay lại vòng lặp nhập end_input: # Xuất giá trị lớn nhỏ mảng subi $s1, $s1, # trừ bốn byte để trỏ phần tử cuối mảng lw $t3 ,($s1) move $t4 ,$t3 move $t5 ,$t3 find_max_min_loop: beqz $t0 ,end_find_max_min # duyệt hết phần tử nhảy đến nhãn end_find_max_min lw bgt blt $t3 ,($s1) $t3 ,$t4 ,update_max $t3 ,$t5 ,update_min next_element: subi $s1 ,$s1 ,4 addi $t0 ,$t0 ,-1 j find_max_min_loop # quay lại vòng lặp tìm max update_max: move $t4 ,$t3 j next_element update_min: move $t5 ,$t3 26 j next_element end_find_max_min: # In giá trị lớn nhỏ mảng li $v0 ,4 la $a0 ,max_msg syscall move $a0 ,$t4 li $v0 ,1 syscall li $v0 ,4 la $a0 ,min_msg syscall move $a0 ,$t5 li $v0 ,1 syscall # Tổng tất phần tử mảng li $t6 ,0 # biến lưu tổng phần tử sum_loop: beqz $t0 ,end_sum # duyệt hết phần tử nhảy đến nhãn end_sum lw $t3 ,($s1) add $t6 ,$t6 ,$t3 subi addi $s1 ,$s1 ,4 $t0 ,$t0 ,-1 j sum_loop # quay lại vịng lặp tính tổng end_sum: # In tổng phần tử mảng li $v0 ,4 la $a0 ,sum_msg syscall move $a0 ,$t6 li $v0 ,1 syscall # Người sử dụng nhập vào số phần tử giá trị phần tử in cửa sổ li $v0 ,4 la $a0 ,input_index syscall # in dòng nhắc nhập số li $v0 ,5 syscall # đọc số nguyên từ bàn phím số phần tử cần lấy bltz $v0 ,error_input # số nhỏ khơng nhảy đến nhãn error_input bge $v0 ,$s0 ,error_input # số lớn số phần tử nhảy đến nhãn error_input mul add $t3 ,$v0 ,$t1 # tính độ dời byte từ đầu mảng đến phần tử cần lấy $s1 ,$s2 ,$t3 # cộng với địa ban đầu mảng để địa phần tử cần lấy 27 lw j $a0 ,($s1) # lấy giá trị phần tử cần lấy print_element # nhảy đến nhãn print_element để in giá trị phần tử print_element: li $v0 ,4 la $a0 ,element_msg syscall li $v0 ,1 syscall # in giá trị phần tử j end_program # kết thúc chương trình error_input: li $v0 ,4 la $a0 ,error_msg syscall # in dịng thơng báo lỗi nhập liệu end_program: b Nhập mảng số nguyên n phần tử (nhập vào số phần tử giá trị phần tử) Mảng gọi A Chuyển dòng lệnh C sang mã assembly MIPS Với biến nguyên i, j gán vào ghi $s0, $s1; địa mảng số nguyên A lưu ghi $s3 if (i= j), nhảy đến nhãn else sll $t1, $s0, # tính độ lệch byte A[i] cách nhân i với add $t1, $s3, $t1 # tính địa A[i] sw $s0, 0($t1) # lưu i vào A[i] j end # nhảy đến nhãn end else: sll $t1, $s0, # tính độ lệch byte A[i] cách nhân i với 28 add $t1, $s3, $t1 # tính địa A[i] sw $s1, 0($t1) # lưu j vào A[i] end: NHẬN XÉT CỦA GIẢNG VIÊN 29 30 MỤC LỤC Bài 1: abc Bài 2: efg .7 Bài 3: zxc .8 31 Bài 1: Trình bày ……………………………………………… 32

Ngày đăng: 20/09/2023, 15:48

Xem thêm:

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w