1. Trang chủ
  2. » Công Nghệ Thông Tin

Chapter03 2mips assembly

63 0 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

Thông tin cơ bản

Định dạng
Số trang 63
Dung lượng 1,59 MB

Nội dung

dce 2015 KIẾN TRÚC MÁY TÍNH KHOA HỌC & KỸ THUẬT MÁY TÍNH BK TP.HCM Võ Tấn Phương http://www.cse.hcmut.edu.vn/~vtphuong dce 2015 Chapter 3.2 Hợp ngữ MIPS (Assembly Language) Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Nội dung  Các phát biểu hợp ngữ MIPS  Khung dạng chương trình hợp ngữ MIPS  Định nghĩa/khai báo liệu  Địa bắt đầu (alignment) thứ tự byte nhớ  Các hàm hệ thống  Thủ tục/hàm  Truyền tham số Runtime Stack Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Các phát biểu hợp ngữ MIPS  Có loại phát biểu hợp ngữ MIPS  Bình thường phát biểu dòng Các lệnh thật  Là lệnh tập lệnh xử lý MIPS  Tương ứng lệnh dạng mã máy (số 32 bit) Lệnh giả (Pseudo-Instructions) Macros  Được chuyển sang lệnh thật assembler  Mục đích giảm cơng sức cho lập trình viên Các thị (directive) Assembler  Cung cấp thơng tin để assembler dịch chương trình  Dùng để định nghĩa phân đoạn, cấp phát liệu nhớ  Không thực thi được: thị khơng phải lệnh Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Phát biểu loại lệnh  Lệnh hợp ngữ có định dạng: [label:] mnemonic [operands] [#comment]  Label: (optional)  Đánh dấu vị trí gợi nhớ lệnh, phải có dấu ‘:’  Nhãn thường xuất phân đoạn liệu mã  Mnemonic  Xác định phép toán (vd: add, sub, vv.)  Operands  Xác định tốn hạn nguồn, đích phép tốn  Tốn hạn ghi, ô nhớ, số  Thông thường lệnh có toán hạn L1: addiu $t0, $t0, Kiến trúc Máy tính– Chương #increment $t0 © Fall 2015 dce 2015 Chú thích (Comments)  Chú thích quan trọng!  Giải thích mục đích chương trình  Giúp việc đọc hiểu chương trình dễ dàng viết xem lại người khác  Giải thích liệu vào,  Chú thích cần thiết đầu thủ tục/hàm  Chỉ đối số, kết thủ tục/hàm  Mô tả mục đích thủ tục/hàm  Chú thích dịng  Bắt đầu với ký tự # Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Tiếp theo …  Các phát biểu hợp ngữ MIPS  Khung dạng chương trình hợp ngữ MIPS  Định nghĩa/khai báo liệu  Địa bắt đầu (alignment) thứ tự byte nhớ  Các hàm hệ thống  Thủ tục/hàm  Truyền tham số Runtime Stack Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Khung dạng mẫu chương trình hợp ngữ # Title: Filename: # Author: Date: # Description: # Input: # Output: ################# Data segment ##################### data ################# Code segment ##################### text globl main main: # main program entry li $v0, 10 # Exit program syscall Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Chỉ thị DATA, TEXT, & GLOBL  Chỉ thị DATA  Định nghĩa phân đoạn liệu (data segment)  Các biến chương trình định nghĩa vùng  Assembler cấp phát khởi tạo biến  Chỉ thị TEXT  Định nghĩa phân đọa mã (code segment) chương trình chứa lệnh  Chỉ thị GLOBL  Khai báo ký hiệu toàn cục (global)  Các ký hiệu tồn cục kham khảo file khác  Ký hiệu hàm main dùng thị tồn cục Kiến trúc Máy tính– Chương © Fall 2015 dce 2015 Phân chia phân đoạn chương trình 0x7FFFFFFF Stack Segment Stack Grows Downwards Memory Addresses in Hex Dynamic Area Data Segment 0x10000000 Static Area Text Segment 0x04000000 Reserved Kiến trúc Máy tính– Chương © Fall 2015 10 dce 2015 leaf_example  MIPS code: leaf_example: add $t0, $a0, $a1 add $t1, $a2, $a3 sub $v0, $t0, $t1 jr $ra Kiến trúc Máy tính– Chương Procedure body Result Return © Fall 2015 49 dce 2015 Ví dụ hàm  C code: int leaf_example (int g, h, i, j) { int f; f = (g + h) - (i + j); return f; }  Arguments g, …, j in $a0, …, $a3  f in $s0 (cần phải bảo toàn giá trị trước trở về)  Result in $v0 Kiến trúc Máy tính– Chương © Fall 2015 50 dce 2015 leaf_example  MIPS code: leaf_example: addi $sp, $sp, -4 sw $s0, 0($sp) add $t0, $a0, $a1 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero lw $s0, 0($sp) addi $sp, $sp, jr $ra Kiến trúc Máy tính– Chương Save $s0 on stack Procedure body Result Restore $s0 Return © Fall 2015 51 dce 2015 Hàm lồng Hàm lồng hàm có thực gọi hàm khác  Địa trở ghi $ra hàm lồng? int rt_1 (int i) { if (i == 0) return 0; else return i + rt_2(i-1); } caller: jal rt_1 next: rt_1: to_2: rt_2: bne $a0, add $v0, jr $ra addu $t0, addi $a0, jal rt_2 addu $v0, jr $ra Kiến trúc Máy tính– Chương $zero, to_2 $zero, $zero $zero, $a0 $a0, -1 $t0, $v0 © Fall 2015 52 dce 2015 Giá trị ghi $ra caller: jal rt_1 next: rt_1: to_2: rt_2: bne $a0, add $v0, jr $ra addu $t0, addi $a0, jal rt_2 addu $v0, jr $ra $zero, to_2 $zero, $zero $zero, $a0 $a0, -1 $t0, $v0 • Khi gọi hàm rt_1, địa trở (next hàm caller) lưu vào $ra Giá trị ghi $ra (i != 0) rt_1 gọi hàm rt_2? Kiến trúc Máy tính– Chương © Fall 2015 53 dce 2015 Lưu địa trở  Hiện thực (i $a0, giá trị trả $v0) high addr old TOS  $sp low addr $ra rt_1: bne add jr to_2: addi sw sw addi jal bk_2: lw lw addi addu jr $a0, $v0, $ra $sp, $ra, $a0, $a0, rt_2 $a0, $ra, $sp, $v0, $ra $zero, to_2 $zero, $zero $sp, -8 4($sp) 0($sp) $a0, -1 0($sp) 4($sp) $sp, $v0, $a0  Lưu địa trở (và tham số) stack Kiến trúc Máy tính– Chương © Fall 2015 54 dce 2015 Ví dụ hàm lồng – tính giai thừa  C code: int fact (int n) { if (n < 1) return 1; else return n * fact(n - 1); }  Argument n in $a0  Result in $v0 Kiến trúc Máy tính– Chương © Fall 2015 55 dce 2015 Ví dụ hàm lồng – tính giai thừa … MIPS code: fact: addi sw sw slti beq addi addi jr L1: addi jal lw lw addi mul jr $sp, $ra, $a0, $t0, $t0, $v0, $sp, $ra $a0, fact $a0, $ra, $sp, $v0, $ra $sp, -8 4($sp) 0($sp) $a0, $zero, L1 $zero, $sp, $a0, -1 0($sp) 4($sp) $sp, $a0, $v0 Kiến trúc Máy tính– Chương # # # # adjust stack for items save return address save argument test for n < # # # # # # # # # # if so, result is pop items from stack and return else decrement n recursive call restore original n and return address pop items from stack multiply to get result and return © Fall 2015 56 dce 2015 Chuyển hàm đệ quy  Ví dụ hàm tính giai thừa int fact (int n) { if (n < 1) return 1; else return (n * fact (n-1)); }  Thực thi hàm đệ quy (hàm gọi nó!) fact (0) = fact (1) = * = fact (2) = * * = fact (3) = * * * = fact (4) = * * * * = 24  Giả sử n ghi $a0; kết trở $v0 Kiến trúc Máy tính– Chương © Fall 2015 57 dce 2015 Chuyển hàm đệ quy… fact: addi sw sw slti beq addi addi jr L1: $sp, $ra, $a0, $t0, $t0, $v0, $sp, $ra $sp, -8 #adjust stack pointer 4($sp) #save return address 0($sp) #save argument n $a0, #test for n < $zero, L1 #if n >=1, go to L1 $zero, #else return in $v0 $sp, #adjust stack pointer #return to caller (1st) addi $a0, $a0, -1 #n >=1, so decrement n jal fact #call fact with (n-1) #this is where fact returns bk_f: lw lw addi mul jr $a0, $ra, $sp, $v0, $ra Kiến trúc Máy tính– Chương 0($sp) #restore argument n 4($sp) #restore return address $sp, #adjust stack pointer $a0, $v0 #$v0 = n * fact(n-1) #return to caller (2nd) © Fall 2015 58 dce 2015 Giá trị stack n=2 (thời điểm 1) old TOS  $sp $ra • Trạng thái Stack lúc thực thi lệnh jal (gọi hàm fact với $a0 lúc 1) − lưu địa trở hàm gọi caller (vd: vị trí hàm main thực gọi hàm fact lần đầu tiên) vào stack − lưu tham số $a0 ban đầu (n=2) vào stack $a0 $v0 Kiến trúc Máy tính– Chương © Fall 2015 59 dce 2015 Giá trị stack n=2 (thời điểm 2) old TOS $sp • Stack sau thực thi lệnh jal lần (gọi hàm fact với $a0 lúc 0) − Lưu địa trở bk_f (vị trí sau lệnh jal) vào stack − Lưu giá trị $a0 trước (n=1) vào stack $ra $a0 $v0 Kiến trúc Máy tính– Chương © Fall 2015 60 dce 2015 Giá trị stack n=2 (thời điểm 3) old TOS $sp • Stack thực thi lệnh jr đầu tiên($v0 gán giá trị 1) − Nhảy tới nhãn bk_f − Cập nhật stack pointer $ra $a0 $v0 Kiến trúc Máy tính– Chương © Fall 2015 61 dce 2015 Giá trị stack n=2 (thời điểm 4) old TOS $sp • Stack thực thi lệnh jr vị trí thứ (trở sau gán $v0 = * 1) − trở vị trí $ra = bk_f phục hồi từ stack − giá trị $a0 = phục hồi từ stack − phục hồi stack pointer $ra $a0 $v0 Kiến trúc Máy tính– Chương © Fall 2015 62 dce 2015 Giá trị stack n=2 (thời điểm 5) old TOS $sp • Stack thực thi lệnh jr vị trí thứ (trở sau gán $v0 = 2* * 1) − trở vị trí sau lệnh gọi hàm main − $a0 = − stack pointer phục hồi giá trị nguyên thủy $ra $a0 $v0 Kiến trúc Máy tính– Chương © Fall 2015 63

Ngày đăng: 08/04/2023, 06:21

w