Bài tập thực hành Kiến trúc máy tính - Chương 2: Kiến trúc tập lệnh MIPS: Lệnh đại số, luận lý, truy xuất dữ liệu

• Sử dụng thành thạo công cụ mô phỏng MARS. Biết cấu trúc một chương trình hợp ngữ MIPS.
• Sử dụng lệnh syscall để xuất/nhập dữ liệu, dùng trong hiển thị, debug
• Nắm được các lệnh luận lý, đại số trong hợp ngữ MIPS.
• Nắm được cách khai báo các kiểu dữ liệu và sử dụng được các lệnh về truy xuất dữ liệu
(load/store). 
pdf 4 trang xuanthi 28/12/2022 2640
Bạn đang xem tài liệu "Bài tập thực hành Kiến trúc máy tính - Chương 2: Kiến trúc tập lệnh MIPS: Lệnh đại số, luận lý, truy xuất dữ liệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_tap_thuc_hanh_kien_truc_may_tinh_chuong_2_kien_truc_tap.pdf

Nội dung text: Bài tập thực hành Kiến trúc máy tính - Chương 2: Kiến trúc tập lệnh MIPS: Lệnh đại số, luận lý, truy xuất dữ liệu

  1. Dùng syscall để nhập a, b, c, d, x và xuất kết quả ra màn hình. Gợi ý: (theo phương pháp Horner’s Method, sinh viên có thể làm theo cách của riêng mình) • Nhân a với x rồi lưu kết quả vào thanh ghi tạm. t = a.x • Thực hiện phép số tính giữa thanh ghi tạm với b. t = t + b //t = a.x + b • Nhân thanh ghi tạm với x. t = t*x //t = (ax + b)x • Thực hiện phép số tính giữa thanh ghi tạm với c. t = t – c //t = a.x2 + b.x - c • Nhân thanh ghi tạm với x. t = t*x // t = (ax2 + bx – c)x • Thực hiện phép số tính giữa thanh ghi tạm với d. t = t - d // t = a.x3 + b.x2 – c.x - d Bài 4: Lệnh load/store. (a) Cho dãy số nguyên 10 phần tử, xuất ra kết quả là HIỆU của phần tử thứ 7 và 3. Mảng bắt đầu từ phần tử thứ 0. (b) Chuyển đổi vị trí cuối và đầu của chuỗi "MSSV - Ho-Ten". Ví dụ chuỗi "123456 - Nguyen Van A" sẽ chuyển thành "A23456 - Nguyen Van 1". Sinh viên thay tên và mã số sinh viên của mình vào chuỗi trên Làm thêm 1. Xác định các trường (OP, Rs, Rt, Rd, shamt, function, immediate) của các lệnh sau và chuyển các lệnh đó qua mã máy (dạng hex) 1 add $t0, $s0, $a0 # add register to register 2 addi $v0, $a1, 200 # add register to immediate 3 lw $t0, 4($a0) # load word 4 sw $t0, 4($a0) # store word 5 lb $t0, 4($a0) # load byte 6 sb $t0, 4($a0) # store byte 7 sll $t1, $s0, 5 # shift left logic (5-bit) 2
  2. REGISTERS READING THE CYCLE COUNT REGISTER FROM C ATOMIC READ-MODIFY-WRITE EXAMPLE 0 zero Always equal to zero unsigned mips_cycle_counter_read() atomic_inc: 1 at Assembler temporary; used by the assembler { ll $t0, 0($a0) # load linked 2-3 v0-v1 Return value from a function call unsigned cc; addiu $t1, $t0, 1 # increment asm volatile("mfc0 %0, $9" : "=r" (cc)); sc $t1, 0($a0) # store cond'l 4-7 a0-a3 First four parameters for a function call return (cc u; • First four parameters are passed in registers $a0−$a3. } • 64-bit parameters are passed in register pairs: C / ASSEMBLY-LANGUAGE FUNCTION INTERFACE • Little-endian mode: $a1:$a0 or $a3:$a2. • Big-endian mode: $a0:$a1 or $a2:$a3. • Every subsequent parameter is passed through the stack. #include MIPS SDE-GCC COMPILER DEFINES • First 16 bytes on the stack are not used. __mips MIPS ISA (= 32 for MIPS32) • Assuming $sp was not modified at function entry: int asm_max(int a, int b); • The 1st stack parameter is located at 16($sp). __mips_isa_rev MIPS ISA Revision (= 2 for MIPS32 R2) int main() • The 2nd stack parameter is located at 20($sp), etc. • { __mips_dsp DSP ASE extensions enabled 64-bit parameters are 8-byte aligned. int x = asm_max(10, 100); int y = asm_max(200, 20); _MIPSEB Big-endian target CPU Return Values printf("%d %d\n", x, y); • 32-bit and smaller values are returned in register $v0. _MIPSEL Little-endian target CPU • } 64-bit values are returned in registers $v0 and $v1: _MIPS_ARCH_CPU Target CPU specified by -march=CPU • Little-endian mode: $v1:$v0. • Big-endian mode: $v0:$v1. _MIPS_TUNE_CPU Pipeline tuning selected by -mtune=CPU INVOKING MULT AND MADD INSTRUCTIONS FROM C NOTES int dp(int a[], int b[], int n) MIPS32 VIRTUAL ADDRESS SPACE { • Many assembler pseudo-instructions and some rarely used kseg3 0xE000.0000 0xFFFF.FFFF Mapped Cached int i; machine instructions are omitted. long long acc = (long long) a[0] * b[0]; • The C calling convention is simplified. Additional rules apply ksseg 0xC000.0000 0xDFFF.FFFF Mapped Cached for (i = 1; i > 31); • Most MIPS processors increment the cycle counter every other } kseg0 0x8000.0000 0x9FFF.FFFF Unmapped Cached cycle. Please check your processor documentation. useg 0x0000.0000 0x7FFF.FFFF Mapped Cached Copyright © 2008 MIPS Technologies, Inc. All rights reserved. MD00565 Revision 01.01