Lệnh slt trong kiến trúc máy tính là gì

(1) May cause overflow exception Những lệnh có phần ghi chú (1) sẽ một thông báo lỗi, hay còn gọi là gây ra một ngoại lệ (exception) khi phép toán bị tràn (overflow)

Tên lệnh (đầy đủ)

Tên lệnh

Lệnh thuộc nhóm gì (R, I hay J)

Lệnh thực hiện chức năng gì

Chức năng của từng lệnh được diễn tả theo kiểu viết của Verilog. Verilog là ngôn ngữ lập trình dùng để mô tả thiết kế phần cứng (sinh viên năm 1, 2, 3 chưa học).

Một số ghi chú cho lệnh tương ứng, được làm rõ ở cuối bảng

opcode và funct cho từng lệnh tương ứng.

Ví dụ: lệnh add có số ở cột này là 0/20hex, tức opcode của add là 0; trường funct trong R- format của add là 20 hex

Lưu hành nội bộ

Một số ghi chú:

Ký hiệu số:

 Ký hiệu 0x đầu được dùng để chỉ hệ 16

Ví dụ: 0xffff = ffffhex = ffff(16)

 Số ghi bình thường sẽ được hiểu là đang trong hệ 10

Thanh ghi:

 Bộ xử lý chứa 32 thanh ghi để hoạt động, mỗi thanh ghi 32 bits.  Mỗi thanh ghi sẽ có tên gợi nhớ và số thứ tự tương ứng của nó. Bảng 2 mô tả số thứ tự và tên gợi nhớ của từng thanh ghi  Như vậy, khi làm việc với thanh ghi có 2 vấn đề cần quan tâm: giá trị và địa chỉ  Giá trị là giá trị đang được chứa trong thanh ghi  Địa chỉ là chỉ số của thanh ghi trong tập 32 thanh ghi.

Ví dụ: Nếu nói thanh ghi $t3 có giá trị là 5, hoặc thanh ghi $t3 bằng 5, tức giá trị đang chứa trong $t3 là 5 và chỉ số/địa chỉ của $t3 là 11

Bảng 2. Mô tả các thanh ghi (trích từ bảng 1)

Tên gợi nhớ của các thanh ghi

Chỉ số tương ứng của các thanh ghi

Mục đích sử dụng của từng thanh ghi

Thanh ghi nào “Yes” là những thanh ghi cần được lưu trữ lại khi thực hiện việc gọi một hàm con

Lưu hành nội bộ

Bộ nhớ:

Tương tự như thanh ghi, khi làm việc với bộ nhớ có 2 vấn đề cần quan tâm: giá trị và địa chỉ

 Giá trị là giá trị đang được chứa trong một từ nhớ (word), hoặc trong byte  Địa chỉ địa chỉ được gán cho word hoặc byte đó.

Ví dụ:

Hình 3. Một ví dụ về hình ảnh bộ nhớ từ phần mềm mô phỏng (simulator) MARS 4.

Đây là word (4 bytes) tại địa chỉ 0x10010004, và có giá trị là 0x

Lưu hành nội bộ

Các lệnh số học:  add, addi, addiu, addu  sub, subu

--------

1. Lệnh add

 Lệnh này thuộc dạng R-format, có opcode là 0 và trường funct giá trị là 20hex

Syntax (cú pháp): (tham khảo Appendix B của sách tham khảo [1])

Ý nghĩa: R[rd] = R[rs] + R[rt]

Thực hiện cộng giá trị thanh ghi rs với giá trị thanh ghi rt, tổng đưa vào thanh ghi rd

Ví dụ:

add $t0, $t1, $t

Giả sử giá trị đang chứa trong thanh ghi $t1 là 3, giá trị đang chứa trong thanh ghi $t2 là 4

Kết quả: Sau khi lệnh add trên thực hiện, giá trị trong thanh ghi $t0 là 7 (4 + 3 = 7).

2. Lệnh addi

 Lệnh này thuộc dạng I-format, có opcode 8hex

Syntax (cú pháp):

Ý nghĩa: R[rt] = R[rs] + SignExtImm

Thực hiện cộng giá trị thanh ghi rs với số tức thời, kết quả đưa vào thanh ghi rt.

Lưu ý: Phạm vi cho số tức thời trong lệnh này là 16 bits. Số tức thời trước khi cộng với thanh ghi rs phải được mở rộng có dấu thành (SignExtImm) thành số 32 bits.

R viết tắt của Register Ví dụ: R[rs] hiểu là giá trị của thanh ghi rs

Lưu hành nội bộ

Ví dụ:

  1. addi $t0, $t1, 3 b) addi $t0, $t1, - c) addi $t0, $t1, 32768

Giả sử giá trị đang chứa trong thanh ghi $t1 cho cả 3 câu đều là 4

Kết quả:

  1. Sau khi addi thực hiện xong, giá trị của $t0 là 7 Quy trình lệnh thực hiện: số tức thời là 3(10) = 0000 0000 0000 0011(2) (số 16 bit có dấu) SignExtImm của 3(10) = 0000 0000 0000 0000 0000 0000 0000 0011(2) Giá trị thanh ghi $t1 = 0000 0000 0000 0000 0000 0000 0000 0100(2)

Giá trị trong $t1 + SingExtImm của 3(10) = 0000 0000 0000 0000 0000 0000 0000 0111(2)

  1. Sau khi addi thực hiện xong, giá trị của $t0 là 1 Quy trình lệnh thực hiện: số tức thời là -3(10) = 1111 1111 1111 1101(2) (số 16 bit có dấu, biểu diễn theo bù 2) SignExtImm của 3(10) = 1111 1111 1111 1111 1111 1111 1111 1101 (2) Giá trị thanh ghi $t1 = 0000 0000 0000 0000 0000 0000 0000 0100(2)

Giá trị trong $t1 + SingExtImm của 3(10) = 0000 0000 0000 0000 0000 0000 0000 0001(2)

  1. Lệnh bị báo lỗi, do 32768 ra khỏi giới hạn của số 16 bits có dấu

3. Lệnh addiu và addu

 Addiu có cú pháp và thực hiện chức năng giống addi

 Addu có cú pháp và thực hiện chức năng giống add

Tuy nhiên, addiu và addu không xét kết quả có bị overflow hay không, trong khi đó addi và add sẽ báo khi overflow xuất hiện

Syntax (cú pháp):

Lưu hành nội bộ

(có ‘i’  làm việc với số tức thời)  Các lệnh không có “u” theo sau: add, addi, sub có thêm ghi chú (1); Các lệnh có “u” theo sau như: addiu, addu và subu không có ghi chú (1)  tức các lệnh không có “ u ” sẽ báo khi có overflow, còn các lệnh có “u” sẽ không báo khi có overflow

 Nhóm lệnh so sánh

slt / sltu

slti / sltiu

----------

5. Lệnh slt/sltu

 Hai lệnh này thuộc nhóm lệnh R-format, có opcode là 0 và funct trong slt là 2ahex, trong sltu là 2bhex

Syntax:

Ý nghĩa:

slt: R[rd] = (R[rs] < R[rt])? 1 : 0

Kiểm tra xem giá trị trong thanh ghi rs có nhỏ hơn thanh ghi rt hay không, nếu nhỏ hơn thì thanh ghi rd nhận giá trị là 1; ngược lại thanh ghi rd sẽ nhận giá trị 0

sltu: Ý nghĩa thực hiện giống như slt. Nhưng việc kiểm tra giá trị thanh ghi rs có nhỏ hơn thanh ghi rt hay không trong lệnh slt thực hiện trên số có dấu, còn trong sltu thực hiện trên số không dấu

Ví dụ:

Lưu hành nội bộ

  1. slt $t0, $t1, $t Giả sử $t1 = 0xfffffff1, $t2 = 0x

Kết quả: $t0 = 1

Lệnh slt so sánh theo kiểu so sánh 2 số có dấu dạng bù 2

$t1 = 0xfffffff1 = 1111 1111 1111 1111 1111 1111 1111 0001(2) = -15(10)

$t2 = 0x00000073 = 01110011(2) = 115(10)

Vậy $t1 < $t2  giá trị trong thanh ghi $t0 = 1

  1. sltu $t0, $t1, $t Giả sử $t1 = 0xfffffff1, $t2 = 0x

Kết quả: $t0 = 0

Lệnh slt so sánh theo kiểu so sánh 2 số không dấu

$t1 = 0xfffffff1 = 1111 1111 1111 1111 1111 1111 1111 0001(2) = 4294967281(10)

$t2 = 0x00000073 = 01110011(2) = 115(10)

Vậy $t1 > $t2  giá trị trong thanh ghi $t0 = 0

6. Lệnh slti/sltiu

 Hai lệnh này thuộc nhóm lệnh I-format. Opcode của slti là ahex, opcode của sltiu là bhex

Syntax:

Ý nghĩa:

slti/sltiu: R[rd] = (R[rs] < SignExtImm)? 1 : 0

Lưu hành nội bộ

B. Các lệnh logic

Lưu hành nội bộ

Nhóm lệnh logic:

and, andi

nor

or, ori

sll, srl

----------

7. Lệnh and

 Lệnh này thuộc dạng R-format, có opcode là 0 và trường funct là 24hex

Syntax (cú pháp):

Ý nghĩa: R[rd] = R[rs] & R[rt]

Thực hiện and từng bit giá trị của thanh ghi rs và rt với nhau, kết quả lưu vào thanh ghi rd

Ví dụ:

and $t0, $t1, $t

Giả sử giá trị đang chứa trong thanh ghi $t1 là 0x12345678, giá trị đang chứa trong thanh ghi $t2 là 0x0000000f thì

Kết quả : sau lệnh add trên, giá trị trong thanh ghi $t0 là 0x00000008.

8. Lệnh andi

 Lệnh này thuộc dạng I-format, có opcode là 0xc

Syntax (cú pháp):

Ý nghĩa: R[rt] = R[rs] & ZeroExtImm

Lưu hành nội bộ

 lệnh dịch phải số học, thuộc nhóm lệnh R, opcode là 0 và funct là 02hex

Syntax (cú pháp):

Ý nghĩa:

sll: R[rd] = R[rt] << shamt

Thanh ghi rt dịch trái shamt bit và kết quả lưu vào thanh ghi rd ( ‘<< ‘ là ký hiệu của phép toán dịch trái)

srl: R[rd] = R[rt] >>> shamt

Thanh ghi rt dịch phải shamt bit và kết quả lưu vào thanh ghi rd ( ‘>>> ‘ là ký hiệu của phép toán dịch phải)

Ví dụ:

  1. sll $t0, $t1, 5

Giả sử thanh ghi $t1 đang chứa giá trị 0x

Kết quả: sau lệnh trên, thanh ghi $t0 = 0x468ACF

Quy trình lệnh thực hiện: lệnh trên dịch trái 5 bit thanh ghi $t

$t1 = 0x12345678 = 0001 0010 0011 0100 0101 0110 0111 1000(2)

Dịch trái 5 bit $t1 = 0100 0110 1000 1010 1100 1111 0000 0000(2) = 0x468ACF

Vậy kết quả thanh ghi $t0 = 0x468ACF

  1. srl $t0, $t1, 5

Giả sử thanh ghi $t1 đang chứa giá trị 0x

Kết quả: sau lệnh trên, thanh ghi $t0 = 0x91A2B

Quy trình lệnh thực hiện: lệnh trên dịch phải 5 bit thanh ghi $t

$t1 = 0x12345678 = 0001 0010 0011 0100 0101 0110 0111 1000(2)

Dịch phải 5 bit $t1 = 0000 0000 1001 0001 1010 0010 1011 0011(2) = 0x91A2B

Vậy kết quả thanh ghi $t0 = 0x91A2B

Lưu hành nội bộ

Tổng kết:

Các lệnh trong nhóm:

and, andi

nor

or, ori

sll, srl

Trong cột ghi chú ở bảng 1, chú ý chỉ có 2 lệnh andi và ori có ghi chú (3) – ghi chú ‘zeroExtImm’, tức các lệnh làm việc với số tức thời trong nhóm này khi mở rộng từ số tức thời 16 bits sang số 32 bits thì dùng zeroExtImm, không phải SignExtImm như nhóm lệnh số học.

Lưu hành nội bộ

Các lệnh xem xét:

beq, bne

j, jal, jr

Ngoài ra còn các lệnh thuộc bảng “PsedoInstruction Set”

blt/blte

bgt/bgte

Chú ý:

Các lệnh assembly có thể chia vào 2 nhóm: nhóm lệnh thật và nhóm lệnh giả

 Nhóm lệnh thật: là các lệnh mà thực chất processor sẽ chạy đúng lệnh đó  Nhóm lệnh giả: là các lệnh mà khi thực thi thật sự thì lệnh này được chuyển thành một hoặc một số lệnh thuộc nhóm lệnh thật (nhóm lệnh này được đặt ra để thuận tiện cho người lập trình)

Các lệnh thuộc nhóm lệnh “PsedoInstruction Set” là những lệnh giả.

--------

11. Lệnh beq

 lệnh này thuộc nhóm lệnh I-format, có opcode 4hex

Syntax (cú pháp):

Lệnh beq có 2 cách viết cho vị trí ‘label’, ‘label’ có thể là một nhãn được viết bằng chữ, hoặc có thể là số

Ví dụ 1: ‘label’ viết bằng chữ:

Chạy đoạn chương trình sau: beq $t1, $t2, label_A add $s0, $t3, $t addi $s1, $t5, 3 label_A : or $t1, $t2, $t sub $t3, $t4, $t

 lệnh beq kiểm tra giá trị của $t1 và $t2, nếu:  2 thanh ghi này bằng nhau, thì lệnh tiếp theo

Ví dụ 2 : ‘label’ viết bằng số:

Chạy đoạn chương trình sau: beq $t1, $t2, 2 add $s0, $t3, $t addi $s1, $t5, 3 or $t1, $t2, $t sub $t3, $t4, $t

 Trong ví dụ này, số 2 thay cho label_A Lệnh beq kiểm tra giá trị của $t1 và $t2, nếu:

Lưu hành nội bộ

được thực hiện là lệnh “ or $t1, $t2, $t3 ”. Sau khi “or” thực hiện xong thì luồng lệnh theo sau đó sẽ được thực hiện (ví dụ lệnh sub tiếp theo sau sẽ được thực hiện)  2 thanh ghi này không bằng nhau, thì lệnh tiếp theo được thực hiện là lệnh “ add $s0, $t3, $t4 ”. Sau khi “ add ” thực hiện xong thì luồng lệnh theo sau đó sẽ được thực hiện (ví dụ chuỗi các lệnh addi , or , sub tiếp theo sau sẽ được thực hiện)

 2 thanh ghi này bằng nhau, thì lệnh tiếp theo được thực hiện là lệnh cách beq 2 lệnh , tức là lệnh“ or $t1, $t2, $t3 ”. Sau khi “ or ” thực hiện xong thì luồng lệnh theo sau đó sẽ được thực hiện (ví dụ lệnh sub tiếp theo sau sẽ được thực hiện)  2 thanh ghi này không bằng nhau, thì lệnh tiếp theo được thực hiện là lệnh “ add $s0, $t3, $t4 ”. Sau khi “ add ” thực hiện xong thì luồng lệnh theo sau đó sẽ được thực hiện (ví dụ chuỗi các lệnh addi, or, sub tiếp theo sau sẽ được thực hiện)

 Khi lập trình, ta có thể sử dụng một trong 2 cách như 2 ví dụ trên. Nhưng thực tế lệnh mà bộ xử lý hiểu là lệnh như ví dụ 2. Khi ta lập trình theo như ví dụ 1 thì lệnh cũng sẽ được chuyển về như ví dụ 2 để gởi cho bộ xử lý.

Như vậy beq chuẩn theo dạng:

beq rs, rt, label/imm

Số tức thời label/imm này chính là số lệnh mà lệnh beq hiện tại cách lệnh sẽ nhảy tới bao nhiêu, được lưu vào 16 bits của offset

Ý nghĩa: if(R[rs] = = R[rt]) PC = PC + 4 + BranchAddr  Nếu giá trị thanh ghi rs bằng rt thì chương trình nhảy tới lệnh mà cách lệnh beq đang xét là imm lệnh, tức địa chỉ con trỏ/thanh ghi PC sẽ chuyển thành PC + 4 + imm*4 (đối với trường hợp mỗi lệnh lưu trong một word 4 bytes) = PC + 4 + BranchAddr

BranchAddr = imm * 4 (đối với trường hợp mỗi lệnh lưu trong một word 4 bytes)

12. Lệnh bne:

Cách viết tương tự như beq, nhưng ý nghĩa trái ngược:

 beq: kiểm tra nếu 2 thanh ghi bằng nhau thì nhảy đến lệnh mong muốn  bne: kiểm tra nếu 2 thanh ghi không bằng nhau thì nhảy đến lệnh mong muốn