3. Tập lệnh của MIPS
Lệnh
Cú pháp
Định dạng lệnh
Ý nghĩa
Cộng số bù 2
add rd, rs, rt
rd <-- rs+rt ;
Cộng không dấu
addu rd, rs, rt
rd <-- rs+rt ;
Cộng với hằng số
16 bit bù 2
addi rd, rs, const
rd Å rs+const ;
Cộng với hằng số
16 bit không dấu
addiu rd, rs, const
rd Å rs+const ;
AND từng bit
and rd, rs, rt
rd Å bitwise AND of rs with rt
AND từng bit với
hằng số 16 bit
andi rd, rs, const
rd Å bitwise AND of rs with
const
Nhảy nếu bằng
beq rs, rt, addr
nhảy đến addr nếu rs == rt. Cần
phải thêm delay theo sau (nop)
Nhảy nếu lớn hơn
hay bằng 0
bgez rs, addr
nhảy đến addr nếu số bù 2 trong
rs >= 0. Cần thêm delay
Nhảy nếu nhỏ hơn
0
bltz rs, addr
nhảy đến addr nếu số bù 2 trong
rs < 0. Cần thêm delay
Nhảy nếu khác
bne rs, rt, addr
nhảy đến addr nếu rs != rt. Cần
thêm delay
Chia hai số bù 2
div rs, rt
lo Å rs div rt; hi Å rs mod rt
hai số rs và rt ở dạng bù 2
Chia hai số không
dấu
divu rs, rt
lo Å rs div rt; hi Å rs mod rt
hai số rs và rt ở dạng không dấu
Nhảy không điều
kiện
j target
delay sau một chu kỳ máy:
PC Å địa chỉ của target
Nhảy không điều
kiện và link
jal target
gọi hàm target, $ra = PC +4
PC Å địa chỉ của target, thêm
nop
Nhảy không điều
kiện theo giá trị
thanh ghi
jr rs
trở về hàm gọi, thường dùng
jr $ra , PC Å $ra, cần thêm lệnh
delay nop theo sau
Load byte và mở
rộng dấu
lb rd, offset(base)
rd Å byte đã được mở rộng dấu
từ ô nhớ có địa chỉ base +
offset, offset là số bù 2
Load byte và mở
rộng số 0 đầu
lbu rd, offset(base)
rd Å byte đã được mở rộng 0 từ
ô nhớ có địa chỉ base + offset,
offset là số bù 2
Load half-word
và mở rộng dấu
lh rd, offset(base)
rd Å 2 byte liên tiếp đã được
mở rộng dấu từ ô nhớ có địa chỉ
base + offset , offset là số bù 2
Load half-word
và mở rộng số 0
lhu rd, offset(base)
rd Å 2 byte liên tiếp đã được
mở rộng 0 từ ô nhớ có địa chỉ
base + offset, offset là số bù 2
Load hằng vào 16
bit cao
lui rd, const
2 byte cao của rd Å 16 bit const
2 byte thấp của rd Å 0x0000
Load word
lw rd, offset(base)
rd Å word bộ nhớ có địa chỉ
base + offset, offset là số bù 2
Chuyển giá trị từ
hi vào thanh ghi
mfhi rd
rd Å hi
Chuyển giá trị từ
lo vào thanh ghi
mflo rd
rd Å lo
Nhân hai số bù 2
mult rs, rt
value(hi, lo) Å rs*rt; rs và rt là
hai số bù 2
Nhân hai số
không dấu
multu rs, rt
value(hi, lo) Å rs*rt; rs và rt là
hai số không dấu
NOT từng bit
nor rd, rs, $0
rd Å NOT từng bit của rs
NOR từng bit
nor rd, rs, rt
rd Å NOR từng bit của rs và rt
OR từng bit
or rd, rs, rt
rd Å OR từng bit của rs và rt
OR từng bit với
hằng 16 bit
or rd, rs, const
rd Å OR từng bit của rs và
hằng sau khi mở rộng 0
Lưu byte thấp của
thanh ghi vào bộ
nhớ
sb rs, offset(base)
byte ở offset +base Å byte thấp
của rs, offset dạng bù 2
Lưu hai byte thấp
vào bộ nhớ
sh rs, offset(base)
2 byte ở offset +base Å 2 byte
thấp của rs, offset dạng bù 2
Lệnh nop
sll $0, $0, 0
tạo thời gian trễ cần thiết
Dịch trái không
dấu
sll rd, rs, shft
rd Å rs sau khi dich trái shft
bit; 0 <= shft <32
So sánh hai thanh
ghi dạng bù 2
slt rd, rs, rt
if rs < rt
rd <-- 1
else
rd <-- 0
hai toán hạng dạng bù 2
So sánh thanh ghi
với hằng bù 2
slti rd, rs, const
if rs < const
rd <-- 1
else
rd <-- 0
hai toán hạng dạng bù 2
So sánh thanh ghi
với hằng không
dấu
sltiu rd, rs, const
if rs < const
rd <-- 1
else
rd <-- 0
hai toán hạng dạng không dấu
So sánh hai thanh
ghi không dấu
sltu rd, rs, rt
if rs < rt
rd <-- 1
else
rd <-- 0
hai toán hạng dạng không dấu
Dịch phải có dấu
sra rd, rs, shft
rd Å rs sau khi dich phải shft
bit và mở rộng dấu;
0 <= shft <32
Dịch phải luận lý
srl rd, rs, shft
rd Å rs sau khi dich phải shft
bit; 0 <= shft <32
Trừ hai thanh ghi
dạng bù 2
sub rd, rs, rt
rd Å rs – rt; các toán hạng dạng
bù 2
Trừ hai thanh ghi
dạng không dấu
subu rd, rs, rt
rd Å rs – rt; các toán hạng dạng
không dấu
Lưu thanh ghi vào
bộ nhớ
sw rs, offset(base)
word ở địa chỉ offset + base Å
$rs; offset dạng bù 2
XOR từng bit
xor rd, rs, rt
rd Å XOR từng bit rs và rt
XOR từng bit với
hằng
xori rd, rs, rt
rd Å XOR từng bit rs và hằng
sau khi mở rộng 0
Chú thích (comment) chuỗi các từ bắt đầu bằng #, tất cả các từ bắt đầu từ # cho đến cuối
dòng đều được bỏ qua.
Tên định danh (identifier) là chuỗi các ký tự chữ, số, dấu gạch dưới (_) và dấu chấm (.)
không bắt đầu bằng số. Tên không được trùng với các từ dành riêng là opcode của lệnh.
Các ví dụ về tên định danh hợp lệ:
main, loop, end_if, case1.2
Các ví dụ về tên định danh không hợp lệ:
1value
# số đứng đầu
b
# trùng với opcode lệnh nhảy
add
# trùng với opcode lệnh cộng
Nhãn bao gồm tên định danh theo sau là dấu hai chấm (:) được đặt ở đầu dòng.
Ví dụ:
Số (number) mặc định là cơ số 10. Số thập lục phân (hexadecimal) thêm 0x vào phía
trước. Hai số 256 và 0x100 diễn tả số có cùng giá trị.
Chuỗi (string) được đặt giữa hai dấu nháy kép (“). Ví dụ: “Hello world!\n”. Các ký tự
đặt biệt cho phép trong chuỗi:
Chỉ thị (directive) được hỗ trợ gồm có:
Tên chỉ thị
Ý nghĩa
.text <addr>
Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được
đặt trong vùng nhớ chương trình (code segment). Tham số addr nếu có quy
định địa chỉ bắt đầu của vùng nhớ chương trình dùng để lưu các phần trong
phân đoạn mã chương trình này. Phần theo sau thường là các lệnh.
.ktext <addr>
Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được
đặt vào vùng nhớ nhân (kernel) của hệ điều hành. Tham số addr nếu có quy
định địa chỉ bắt đầu của vùng nhớ dùng để lưu. Phần theo sau thường là các
lệnh.
.
globl sym
Khai báo nhãn sym là toàn cục và có thể được tham khảo từ file khác
.data <addr>
Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được
đặt trong vùng nhớ dữ liệu nhân (kernel data segment). Tham số addr nếu
có quy định địa chỉ bắt đầu của vùng nhớ dùng để lưu.
newline \n
tab
\t
quote \”
.data
item:
.word
1
.text
.globl main
# must be global
main:
…
.kdata <addr>
Tất cả các phần theo sau cho tới chỉ thị mới (.text, .ktext, .data, .kdata) được
đặt trong vùng nhớ dữ liệu (data segment). Tham số addr nếu có quy định
địa chỉ bắt đầu của vùng nhớ dùng để lưu.
.ascii str
Lưu chuỗi str vào bộ nhớ, không có ký tự kết thúc chuỗi (giá trị = 0) sau
cùng
.asciiz str
Lưu chuỗi str vào bộ nhớ, thêm ký tự kết thúc chuỗi (giá trị = 0) sau cùng
.byte b1,..,bn
Lưu n byte liên tiếp nhau b1,..,bn vào bộ nhớ
.half h1,..,hn
Lưu n phần tử 16-bit liên tiếp nhau h1,..,hn vào bộ nhớ
.word w1,..,wn
Lưu n phần tử 32-bit liên tiếp nhau w1,..,wn vào bộ nhớ
.float f1,..,fn
Lưu n số thực dấu chấm động độ chính xác đơn liên tiếp nhau f1,..,fn vào bộ
nhớ
.double d1,..,dn
Lưu n số thực dấu chấm động độ chính xác đơn liên tiếp nhau d1,..,dn vào
bộ nhớ
.space n
Cấp phát n byte liên tiếp nhau trong phân đoạn dữ liệu hiện tại. Phải đặt sau
chỉ thị .data
.extern sym n
Khai báo dữ liệu lưu ở sym có kích thước n byte và sym là nhãn toàn cục.
Dữ liệu vùng nhớ này được truy xuất thông qua thanh ghi $gp
32>32>32> Chia sẻ với bạn bè của bạn: |