📆 Thời gian:
🕐 5 phút đọc
Hợp ngữ (Assembly) là ngôn ngữ lập trình bậc thấp, nó gồm tập các từ khóa và từ gợi nhớ rất gần với ngôn ngữ máy (machine code). Mỗi kiến trúc vi xử lý đều có tập lệnh (instruction set) riêng, do đó sẽ có hợp ngữ riêng dành cho kiến trúc đó. Ở đây, ta tập trung nghiên cứu về hợp ngữ dành cho kiến trúc MIPS. Môi trường lập trình được sử dụng là chương trình MARS. MARS là môi trường lập trình giả lập giúp ta viết, biên dịch và chạy hợp ngữ MIPS trên các máy x86.
Cấu trúc của một chương trình hợp ngữ MIPS
.data
# khai báo biến sau chỉ thị này
...
.text
# viết các lệnh sau chỉ thị này
main:
# điểm bắt đầu của chương trình
…
Cách khai báo biến
tên_biến: kiểu_lưu_trữ giá_trị
Các kiểu lưu trữ hỗ trợ: .word, .byte, .asciiz .space
Lưu ý: tên_biến (nhãn) phải theo sau bởi dấu hai chấm (:)
Ví dụ:
var1: .word 3 # số nguyên 4-byte có giá trị khởi tạo là 3
var2: .byte ’a’,’b’ # mảng 2 phần tử, khởi tạo là a và b
var3: .space 40 # cấp 40-byte bộ nhớ, chưa được khởi tạo
Các thanh ghi trong MIPS

Cú pháp tổng quát lệnh MIPS
<tên-lệnh> <r1>, <r2>, <r3>
Một số lệnh MIPS cơ bản
Ghi chú:
Lệnh Load / Store
Đây là các lệnh duy nhất được phép truy xuất bộ nhớ RAM trong tập lệnh của MIPS

Nhóm lệnh số học:

Nhóm lệnh nhảy

System Call:
Lệnh syscall làm treo sự thực thi của chương trình và chuyển quyền điều khiển cho HĐH
(được giả lập bởi MARS). Sau đó, HĐH sẽ xem giá trị thanh ghi $v0 để xác định xem chương
trình muốn nó làm việc gì.
Bảng các system call

Stack
Stack (ngăn xếp) là vùng nhớ đặc biệt được truy cập theo cơ chế “vào trước ra sau” (LIFO – Last In First Out), nghĩa là dữ liệu nào đưa vào sau sẽ được lấy ra trước.
Hình bên là cấu trúc stack trong bộ nhớ, mỗi phần tử có kích thước một word (32-bit).
Thanh ghi $sp đóng vai trò là con trỏ ngăn xếp (stack pointer), luôn chỉ đến đỉnh của stack. Stack phát triển theo chiều giảm của địa chỉ vùng nhớ
(đỉnh của stack luôn có địa chỉ thấp).
Hai thao tác cơ bản trong stack là push (đưa một phần tử vào stack) và pop (lấy một phần tử ra khỏi stack). Cơ chế như sau:

Ví dụ: push vào stack giá trị trong $t0
subu $sp, $sp, 4
sw $t0, ($sp)
Ví dụ: pop từ stack ra $t0
lw $t0, ($sp)
addu $sp, $sp, 4

Thủ tục
MIPS hỗ trợ một số thanh ghi để lưu trữ các dữ liệu phục vụ cho thủ tục:
Cấu trúc của một thủ tục:
Đầu thủ tục
entry_label:
addi $sp,$sp, -framesize # khai báo kích thước cho stack
sw $ra, framesize-4($sp) # cất địa chỉ trả về của thủ tục trong $ra vào ngăn xếp
Lưu tạm các thanh ghi khác (nếu cần)
Thân thủ tục ...
(có thể gọi các thủ tục khác...)
Cuối thủ tục
Phục hồi các thanh ghi khác (nếu cần)
lw $ra, framesize-4($sp) # lấy địa chỉ trả về ra $ra
addi $sp,$sp, framesize
jr $ra
Gọi thủ tục: jal entry_label
1. Nhập vào một chuỗi, xuất lại chuỗi đó ra màn hình
Ví dụ:
Nhap mot chuoi: Hello
Chuoi da nhap: Hello
2. Nhập vào một ký tự, xuất ra ký tự liền trước và liền sau.
Ví dụ:
Nhap mot ky tu: b
Ky tu lien truoc: a
Ky tu lien sau: c
3. Nhập vào một ký tự hoa, in ra ký tự thường.
Ví dụ:
Nhap mot ky tu: A
Ky tu thuong: a
4. Nhập từ bàn phím 2 số nguyên, tính tổng, hiệu, tích, thương của 2 số.
Ví dụ:
Nhap so thu nhat: 7
Nhap so thu hai: 4
Tong: 11
Hieu: 3
Tich: 28
Thuong: 1 du 3
5. Nhập vào 2 số nguyên, xuất ra phép so sánh giữa 2 số.
Ví dụ:
Nhap so thu nhat: 6
Nhap so thu hai: 9
So lon hon la: 9
6. Nhập một ký tự từ bàn phím. Nếu ký tự vừa nhập thuộc [0-9], [a-z], [A-Z] thì xuất ra
màn hình ký tự đó và loại của ký tự đó (số, chữ thường, chữ hoa).
Ví dụ:
Nhập vào một ký tự: 5
Ký tự vừa nhập: 5 là số
Nhập vào một ký tự : f
Ký tự vừa nhập : f là chữ thường
Nhập vào một ký tự : D
Ký tự vừa nhập : D là chữ hoa
7. Nhập một mảng các số nguyên n phần tử, xuất mảng đó ra màn hình.
Ví dụ:
Nhap mang cac so nguyen: 1 2 3 4 5
Mang vua nhap: 1 2 3 4 5
8. Nhập vào một số nguyên n, tính tổng từ 1 đến n.
Ví dụ:
Nhap mot so: 4
Tong tu 1 den 4 la: 10
9. Nhập vào một chuỗi, xuất ra chuỗi ngược.
Ví dụ:
Nhap vao mot chuoi: hello
Chuoi nguoc la: olleh
Xem lời giải tham khảo tại đây: https://github.com/lethinh2003/MIPS_LAB03
Tài liệu tham khảo
[1] http://chortle.ccsu.edu/AssemblyTutorial/index.html - Programmed Introduction to MIPS Assembly Language, Bradley Kjell
[2] http://www.scribd.com/doc/3577342/MIPS-Assembly-Language-Programming - MIPS Assembly Language Programming, Robert Britton.
[3] http://dkrizanc.web.wesleyan.edu/courses/231/07/mips-spim.pdf - MIPS Assembly Language Programming, Daniel J. Ellard.
[4] http://logos.cs.uic.edu/366/notes/MIPS%20Quick%20Tutorial.htm - MIPS Architecture and Assembly Language Overview
[5] http://www.cs.cornell.edu/~tomf/notes/cps104/mips.html - MIPS Examples
0
0
0
0
hợp ngữ mips, code mips, mips, bài tập mips, bài tập hợp ngữ mips