Đọc và ghi byte
68 HUST-FET, 13/02/2011
MIPS các lệnh đặc biệt để dịch chuyển bytes
lb $t0, 1($s3) #load byte from memory
sb $t0, 6($s3) #store byte to memory
op rs rt 16 bit number
Các byte 8bit nào được đọc và ghi?
Lệnh đọc đưa byte được đọc vào 8 bit ngoài cùng bên
phải từ bộ nhớ vào thanh ghi đích
- Các bit khác của thanh ghi?
Lệnh ghi lấy 8 bit ngoài cùng bên phải của thanh ghi
nguồn và ghi vào bộ nhớ
- Giữ các byte khác trong từ nhớ không thay đổiVí dụ 2.7. Đọc ghi byte
69 HUST-FET, 13/02/2011
Cho đoạn mã sau và trạng thái bộ nhớ. Xác định
trạng thái bộ nhớ sau khi thực hiện đoạn mã
add $s3, $zero, $zero
lb $t0, 1($s3)
sb $t0, 6($s3)
Memory
0x 0 0 9 0 1 2 A 0
Data Word
Address (Decimal)
8 4 0
12
16
20
24
0x F F F F F F F F
0x 0 1 0 0 0 4 0 2
0x 1 0 0 0 0 0 1 0
0x 0 0 0 0 0 0 0 0
0x 0 0 0 0 0 0 0 0
0x 0 0 0 0 0 0 0 0
Giá trị lưu trong $t0?
Điều gì xảy ra khi máy tính là loại little
Endian?
Từ nào được ghi vào bộ nhớ ở vị trí
nào?Đọc ghi nửa từ
70 HUST-FET, 13/02/2011
MIPS also provides special instructions to move
half words
lh $t0, 1($s3) #load half word from memory
sh $t0, 6($s3) #store half word to memory
op rs rt 16 bit number
What 16 bits get loaded and stored?
load half word places the half word from memory in the
rightmost 16 bits of the destination register
- what happens to the other bits in the register?
store half word takes the half word from the rightmost
16 bits of the register and writes it to the half word in
memory
142 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 553 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng môn Kiến trúc máy tính - Chương 2: Ngôn ngữ máy tính và các phép toán - Nguyễn Đức Minh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
không? (Vấn đề alighment)
HUST-FET, 13/02/201144Chương 2. Ngôn ngữ máy tính và các phép toán
31 23 15 7 0
xx+1x+2x+3x+4 byte address
word
Địa chỉ bộ nhớ: Endianess và Alignment
Big Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa lớn nhất trong word
(Most Significant Byte)
IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA
Litle Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa nhỏ nhất trong word
(Least Significant Byte)
Intel 80x86, DEC Vax, DEC Alpha
Alignment:
Dữ liệu được lưu trữ ở địa chỉ
byte chia hết cho kích thước.
HUST-FET, 13/02/201145Chương 2. Ngôn ngữ máy tính và các phép toán
Địa chỉ bộ nhớ: Endianess và Alignment
Big Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa lớn nhất trong word
(Most Significant Byte)
IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA
Litle Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa nhỏ nhất trong word
(Least Significant Byte)
Intel 80x86, DEC Vax, DEC Alpha
Alignment:
Dữ liệu được lưu trữ ở địa chỉ
byte chia hết cho kích thước.
HUST-FET, 13/02/201146Chương 2. Ngôn ngữ máy tính và các phép toán
Địa chỉ bộ nhớ: Endianess và Alignment
Big Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa lớn nhất trong word
(Most Significant Byte)
IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA
Litle Endian:
Địa chỉ word = địa chỉ của byte có ý nghĩa nhỏ nhất trong word
(Least Significant Byte)
Intel 80x86, DEC Vax, DEC Alpha
Alignment:
Dữ liệu được lưu trữ ở địa chỉ
byte chia hết cho kích thước.
HUST-FET, 13/02/201147Chương 2. Ngôn ngữ máy tính và các phép toán
0 1 2 3
Aligned
Not
Aligned
Sử dụng chế độ địa chỉ
Displacement: 42% avg, 32% to 55%
Immediate: 33% avg, 17% to 43%
Register deferred (indirect): 13% avg, 3% to 24%
Scaled: 7% avg, 0% to 16%
Memory indirect: 3% avg, 1% to 6%
Misc: 2% avg, 0% to 3%
75% displacement & immediate
88% displacement, immediate & register indirect
HUST-FET, 13/02/201148Chương 2. Ngôn ngữ máy tính và các phép toán
88%
75%
Thống kê chế độ địa chỉ
Kích thước trường toán hạng trực tiếp
8 bit: 50-60%
16 bit; 75%-80%
Các chế độ địa chỉ quan trọng
Dịch chuyển (Displacement)
Trực tiếp (Immediate)
Thanh ghi gián tiếp (Register indirect)
Kích thước độ lệch trong chế độ địa chỉ: 12-16
bít
Kích thước toán hạng trực tiếp: 8-16 bít
HUST-FET, 13/02/201149Chương 2. Ngôn ngữ máy tính và các phép toán
Định dạng chỉ thị
HUST-FET, 13/02/201150Chương 2. Ngôn ngữ máy tính và các phép toán
Độ dài chỉ thị:
Cố định
Thay đổi
Lai: gồm 1 vài loại chỉ thị có độ dài cố định khác nhau
Khi kích thước chương trình quan trọng: dùng chỉ độ dài
thay đổi
Khi hiệu năng quan trọng: dùng độ dài cố định
Variable:
Fixed:
Hybrid:
Một số kiến trúc tập lệnh
HUST-FET, 13/02/201151Chương 2. Ngôn ngữ máy tính và các phép toán
Kiến trúc RISC
Reduce Instruction Set Computer
DEC Alpha, AMD 29k, ARC, ARM, Atmel AVR, MIPS, PA-RISC,
Power (PowerPC), SuperH, và SPARC.
Định dạng lệnh và độ dài lệnh cố định, đơn giản
Dễ giải mã lệnh
Các thanh ghi chung mục đích có thể sử dụng trong nhiều ngữ cảnh
Dễ thiết kế phần mềm biên dịch
Có thể cần các thanh ghi dấu phẩy động riêng biệt
Chế độ địa chỉ đơn giản
Các chế độ địa chỉ phức tạp được thực hiện thông qua chuỗi lệnh số
học và lệnh nạp/ghi
Ít hỗ trợ các loại dữ liệu phức tạp
HUST-FET, 13/02/201152Chương 2. Ngôn ngữ máy tính và các phép toán
Kiến trúc CISC
Complex Instruction Set Computer
System/360, z/Architecture, PDP-11, VAX, Motorola 68k, và x86.
Lệnh có độ dài thay đổi, phức tạp
Có thể bao gồm 1 vài phép toán nhỏ
Gần ngôn ngữ lập trình bậc cao
Nhiều chế độ địa chỉ phức tạp
Hỗ trợ các loại dữ liệu phức tạp
HUST-FET, 13/02/201153Chương 2. Ngôn ngữ máy tính và các phép toán
CISC vs. RISC
HUST-FET, 13/02/201154Chương 2. Ngôn ngữ máy tính và các phép toán
RISC CISC
- Tập lớn các thanh ghi
- Tập lệnh đơn giản
- Tập trung trao đổi dữ liệu giữa thanh ghi
- Các lệnh thực hiện trong một chu kỳ máy
- Các lệnh LOAD/STORE đơn giản để truy
cập bộ nhớ
- Giới hạn chế độ địa chỉ
- Từ mã có chiều dài cố định
- Giới hạn số thanh ghi
- Tập lệnh phức tạp
- Nhấn mạnh vào các hoạt động truy cập
bộ nhớ
- Lệnh có thể được thực hiện trong nhiều
chu kỳ máy
- Một lệnh có thể tương đương với nhiều
lệnh của RISC
- Nhiều chế độ địa chỉ
- Mã lệnh có chiều dài thay đổi tùy vào
từng lệnh
CISC vs. RISC
HUST-FET, 13/02/201155Chương 2. Ngôn ngữ máy tính và các phép toán
RISC CISC
- Mã lệnh thực hiện nhanh
- Đơn vị điều khiển đơn giản
- Giải mã nhanh
- Xử lý song song đường ống hiệu suất cao
- Thiết kế, phát triển và kiểm tra nhanh
- Hỗ trợ trình dịch tăng cường sự tối ưu
- Giảm các lỗi rẽ nhánh của đường ống
- Tăng tốc truyền tham số cho các thủ tục
- Ngôn ngữ lập trình assembly mạnh
- Giảm các yêu cầu khi thiết kế trình dịch
- Các tính năng với dấu phẩy động mạnh
- Tăng khả năng của cache
Ví dụ 2.4. So sánh hiệu năng RISV vs. CISC
Kiến trúc tập lệnh ISA có 2 lớp chỉ thỉ phức tạp (C) và đơn giản (S).
Trong 1 chương trình thời gian thực hiện chỉ thị S chiếm 95%. Để triển
khai ISA bằng kiến trúc RISC ta sẽ triển khai các chỉ thị S bằng phần
cứng và chỉ thị C bằng phần mềm (dùng đoạn chỉ thị S và coi như 1 chỉ
thị giả C). So sánh với kiến trúc CISC, các chỉ thị S sẽ được thực hiện
nhanh hơn 20% và các chỉ thị CISC bị chậm đi 3 lần. Kiến trúc nào có
hiệu năng cao hơn và cao hơn bao nhiêu lần?
HUST-FET, 13/02/201156Chương 2. Ngôn ngữ máy tính và các phép toán
Kiến trúc tập lệnh MIPS
Định dạng chỉ thị:
32 bit
3 loại định dạng:
R-chỉ thị thanh ghi: 2 toán hạng nguồn thanh ghi, 1 toán hạng
đích thanh ghi
I-chỉ thị trực tiếp: 1 toán hạng nguồn thanh ghi, 1 toán hạng
nguồn trực tiếp, 1 toán hạng đích thanh ghi
J-chỉ thị nhảy: 1 toán hạng nguồn trực tiếp
HUST-FET, 13/02/201157Chương 2. Ngôn ngữ máy tính và các phép toán
op
op
op
rs rt rd sa funct
rs rt immediate
jump target
R format
I format
J format
Nguyên tắc thiết kế MIPS (RISC)
HUST-FET, 13/02/201158Chương 2. Ngôn ngữ máy tính và các phép toán
Tính đơn giản quan trọng hơn tính quy tắc(Simplicity favors regularity)
Chỉ thị kích thước cố định (32 bit)
Ít định dạng chỉ thị (3 loại định dạng)
Mã lệnh ở vị trí cố định (6 bit đầu)
Nhỏ hơn thì nhanh hơn
Số chỉ thị giới hạn
Số thanh ghi giới hạn
Số chế độ địa chỉ giới hạn
Tăng tốc các trường hợp thông dụng
Các toán hạng số học lấy từ thanh ghi (máy tính dựa trên cơ chế load-
store)
Các chỉ thị có thể chứa toán hạng trực tiếp
Thiết kế tốt đòi hỏi sự thỏa hiệp
3 loại định dạng chỉ thị
Chỉ thị số học của MIPS
HUST-FET, 13/02/201159
Mã hợp ngữ của chỉ thị số học
add $t0, $s1, $s2
sub $t0, $s1, $s2
Mỗi chỉ thị số học thực hiện một phép toán
Mỗi chỉ thị chứa chính xác ba chỉ số của các thanh ghi
trong tệp thanh ghi của đường dữ liệu ($t0,$s1,$s2)
destination source1 op source2
Định dạng chỉ thị loại thanh ghi (R format)
0 17 18 8 0 0x22
Các trường trong chỉ thị MIPS
HUST-FET, 13/02/201160Chương 2. Ngôn ngữ máy tính và các phép toán
Các trường trong 1 chỉ thị MIPS được đặt tên:
op rs rt rd shamt funct
op 6-bits mã lệnh xác định phép toán (opcode)
rs 5-bits chỉ số thanh ghi chứa toán hạng nguồn 1 trong
tệp thanh ghi
rt 5-bits chỉ số thanh ghi chứa toán hạng nguồn 2 trong
tệp thanh ghi
rd 5-bits chỉ số thanh ghi sẽ lưu kết quả trong tệp thanh ghi
shamt 5-bits số lượng dịch (cho chỉ thị dịch)
funct 6-bits mã chức năng thêm cho phần mã lệnh
Tệp thanh ghi của MIPS
HUST-FET, 13/02/201161Chương 2. Ngôn ngữ máy tính và các phép toán
Register File
src1 addr
src2 addr
dst addr
write data
32 bits src1
data
src2
data
32
locations
325
32
5
5
32
write control
Gồm 32 thanh ghi 32-bit
2 cổng đọc
1 cổng ghi
Thanh ghi:
Nhanh hơn bộ nhớ chính
- Nhiều thanh ghi sẽ chậm hơn
(VD., 1 tệp gồm 64 thanh ghi word sẽ
chậm hơn tệp gổm 32 thanh ghi khoảng 50%)
- Số lượng cổng đọc ghi ảnh hưởng bậc 2 đến tốc độ
Dễ biên dịch
- VD., (A*B) – (C*D) – (E*F) có thể thực hiện phép nhân theo thứ
tự bất kỳ, không giống như ngăn xếp
Chứa biến chương trình
- cải thiện độ lớn mã chương trình
Các thanh ghi MIPS
HUST-FET, 13/02/201162Chương 2. Ngôn ngữ máy tính và các phép toán
Tên Chỉ số Công dụng Preserve
on call?
$zero 0 constant 0 (hardware) n.a.
$at 1 reserved for assembler n.a.
$v0 - $v1 2-3 returned values no
$a0 - $a3 4-7 arguments yes
$t0 - $t7 8-15 temporaries no
$s0 - $s7 16-23 saved values yes
$t8 - $t9 24-25 temporaries no
$gp 28 global pointer yes
$sp 29 stack pointer yes
$fp 30 frame pointer yes
$ra 31 return addr (hardware) yes
Truy cập bộ nhớ
HUST-FET, 13/02/201163Chương 2. Ngôn ngữ máy tính và các phép toán
2 chỉ thị dịch chuyển dữ liệu để truy cập bộ nhớ
o lw $t0, 4($s3) #đọc 1 từ từ bộ nhớ
o sw $t0, 8($s3) #ghi 1 từ vào bộ nhớ
Dữ liệu được đọc vào (lw) hoặc ghi ra từ (sw) 1 thanh ghi
trong tệp thanh ghi – 5 bit chỉ số thanh ghi
32 bit địa chỉ bộ nhớ được tạo ra bằng cách cộng giá trị
thanh ghi cơ sở (base register) với giá trị offset
Trường offset rộng 16 bit sẽ giới hạn các ô nhớ trong khoảng 213
hay 8,192 words (215 hay 32,768 bytes) tính từ giá trị của thanh
ghi cơ sở
Định dạng lệnh truy cập bộ nhớ
HUST-FET, 13/02/201164Chương 2. Ngôn ngữ máy tính và các phép toán
Định dạng chỉ thị Load/Store (Định dạng I):
lw $t0, 24($s3)
35 19 8 2410
Memory
data word address (hex)
0x00000000
0x00000004
0x00000008
0x0000000c
0xf f f f f f f f
$s3 0x12004094
2410 + $s3 =
. . . 0001 1000
+ . . . 1001 0100
. . . 1010 1100 =
0x120040ac
0x120040ac$t0
Ví dụ 2.5. Truy cập bảng (array)
HUST-FET, 13/02/201165
Cho A[ ] = là 1 mảng bắt đầu tại địa chỉ cơ sở lưu trong
thanh ghi $s3;
Biến h được gắn với thanh ghi $s2;
Dịch: A[5] = h + A[8]
Thành mã hợp ngữ MIPS:
lw $t0, 32 ($s3) # $t0 A[8]
add $t0, $s2, $t0 # $t0 h+$t0
sw $t0, 20 ($s3) # A[5] $t0
OP rs rt immediateI-type
8
7
6
5
4
3
2
1
Ví dụ 2.6. Truy cập mảng với chỉ số thay đổi
HUST-FET, 13/02/201166
A[ ] = array with base address in $s3;
variables g, h, i associated with registers $s1, $s2, $s4
Compile: g = h + A[i]
into MIPS instructions:
add $t1, $s4, $s4 # $t1 i+i = 2i
add $t1, $t1, $t1 # $t1 2i+2i = 4i
add $t1, $t1, $s3 # $t1 address of A[i]
lw $t0, 0 ($t1) # $t0 A[i]
add $s1, $s2, $t0 # $s1 h + A[i]
Lưu trữ byte: Endianess (Nhắc lại)
HUST-FET, 13/02/201167
Big Endian: leftmost byte is word address
Little Endian: rightmost byte is word address
Thanh ghi lsb
3 2 1 0
Địa chỉ:little endian byte 0
0 1 2 3
Địa chỉ:big endian byte 0
msb
Đọc và ghi byte
HUST-FET, 13/02/201168
MIPS các lệnh đặc biệt để dịch chuyển bytes
lb $t0, 1($s3) #load byte from memory
sb $t0, 6($s3) #store byte to memory
op rs rt 16 bit number
Các byte 8bit nào được đọc và ghi?
Lệnh đọc đưa byte được đọc vào 8 bit ngoài cùng bên
phải từ bộ nhớ vào thanh ghi đích
- Các bit khác của thanh ghi?
Lệnh ghi lấy 8 bit ngoài cùng bên phải của thanh ghi
nguồn và ghi vào bộ nhớ
- Giữ các byte khác trong từ nhớ không thay đổi
Ví dụ 2.7. Đọc ghi byte
HUST-FET, 13/02/201169
Cho đoạn mã sau và trạng thái bộ nhớ. Xác định
trạng thái bộ nhớ sau khi thực hiện đoạn mã
add $s3, $zero, $zero
lb $t0, 1($s3)
sb $t0, 6($s3)
Memory
0x 0 0 9 0 1 2 A 0
Data Word
Address (Decimal)
0
4
8
12
16
20
24
0x F F F F F F F F
0x 0 1 0 0 0 4 0 2
0x 1 0 0 0 0 0 1 0
0x 0 0 0 0 0 0 0 0
0x 0 0 0 0 0 0 0 0
0x 0 0 0 0 0 0 0 0
Giá trị lưu trong $t0?
Điều gì xảy ra khi máy tính là loại little
Endian?
Từ nào được ghi vào bộ nhớ ở vị trí
nào?
Đọc ghi nửa từ
HUST-FET, 13/02/201170
MIPS also provides special instructions to move
half words
lh $t0, 1($s3) #load half word from memory
sh $t0, 6($s3) #store half word to memory
op rs rt 16 bit number
What 16 bits get loaded and stored?
load half word places the half word from memory in the
rightmost 16 bits of the destination register
- what happens to the other bits in the register?
store half word takes the half word from the rightmost
16 bits of the register and writes it to the half word in
memory
- leaving the other half word in the memory word unchanged
Lệnh trực tiếp
HUST-FET, 13/02/201171Chương 2. Ngôn ngữ máy tính và các phép toán
addi $sp, $sp, 4 #$sp = $sp + 4
slti $t0, $s2, 15 #$t0 = 1 if $s2<15
Định dạng mã máy (Định dạng I):
Các hằng số trong chương trình thường có giá trị nhỏ
Các phương pháp lưu trữ và sử dụng hằng số:
Lưu các hằng thường dùng trong bộ nhớ và đọc chúng
Tạo 1 thanh ghi kết nối cứng (như $zero) để lưu hằng số
Dùng các lệnh đặc biệt có chứa hằng số
0x0A 18 8 0x0F
Hằng số được chứa trong lệnh!
Định dạng trực tiếp giới hạn giá trị trong khoảng +215–1 to -215
Lệnh dịch
HUST-FET, 13/02/201172Chương 2. Ngôn ngữ máy tính và các phép toán
Shifts move all the bits in a word left or right
sll $t2, $s0, 8 #$t2 = $s0 << 8 bits
srl $t2, $s0, 8 #$t2 = $s0 >> 8 bits
Instruction Format (R format)
Such shifts are called logical because they fill with
zeros
Notice that a 5-bit shamt field is enough to shift a 32-bit value
25 – 1 or 31 bit positions
0 16 10 8 0x00
Lệnh logic
HUST-FET, 13/02/201173Chương 2. Ngôn ngữ máy tính và các phép toán
There are a number of bit-wise logical operations in the
MIPS ISA
and $t0, $t1, $t2 #$t0 = $t1 & $t2
or $t0, $t1, $t2 #$t0 = $t1 | $t2
nor $t0, $t1, $t2 #$t0 = not($t1 | $t2)
Instruction Format (R format)
andi $t0, $t1, 0xFF00 #$t0 = $t1 & ff00
ori $t0, $t1, 0xFF00 #$t0 = $t1 | ff00
Instruction Format (I format)
0 9 10 8 0 0x24
0x0D 9 8 0xFF00
Sử dụng các hằng số lớn
HUST-FET, 13/02/201174
Đưa 1 hằng số 32 bit vào 1 thanh ghi
Sử dụng 2 lệnh:
Lệnh nạp vào phần cao "load upper immediate“
lui $t0, 0xaaaa
Lệnh nạp vào phần thấp:
ori $t0, $t0, 0xaaaa
16 0 8 1010101010101010
1010101010101010
0000000000000000 1010101010101010
0000000000000000
1010101010101010 1010101010101010
Lệnh điều khiển dòng chương trình
HUST-FET, 13/02/201175Chương 2. Ngôn ngữ máy tính và các phép toán
Lệnh rẽ nhánh có điều kiện:
bne $s0, $s1, Lbl #go to Lbl if $s0$s1
beq $s0, $s1, Lbl #go to Lbl if $s0=$s1
Ex: if (i==j) h = i + j;
bne $s0, $s1, Lbl1
add $s3, $s0, $s1
Lbl1: ...
Định dạng lệnh (Định dạng I):
0x05 16 17 16 bit offset
Địa chỉ đến được xác định như thế nào ?
Xác định địa chỉ rẽ nhánh đến
HUST-FET, 13/02/201176
Sử dụng 1 thanh ghi (giống như lw và sw) cộng với 16-bit offset
Thanh ghi địa chỉ lệnh PC (Instruction Address Register )
- Việc sử dụng PC được tự động bao hàm trong lệnh
- PC được cập nhật (PC+4) khi lệnh được nạp vì vậy khi tính toán nó chứa giá
trị địa chỉ của lệnh kế tiếp
giới hạn khoảng cách rẽ nhánh trong khoảng -215 đến +215-1 (word) lệnh
kể từ lệnh sau lệnh rẽ nhánh. Tuy nhiên phần lớn các rẽ nhánh là địa
phương.
PC
Add
32
32 32
32
32
offset
16
32
00
sign-extend
Trường 16 bit thấp của lệnh rẽ nhánh
branch dst
address
?
Add
4 32
So sánh hỗ trợ lệnh rẽ nhánh
HUST-FET, 13/02/201177
Có lệnh beq, bne, các loại điều kiện khác? (VD., rẽ nhánh
nếu nhỏ hơn)? Cần 1 lệnh so sánh khác: slt
Set on less than:
slt $t0, $s0, $s1 # if $s0 < $s1 then
# $t0 = 1 else
# $t0 = 0
Instruction format (R format):
Các phiên bản khác của slt
slti $t0, $s0, 25 # if $s0 < 25 then $t0=1 ...
sltu $t0, $s0, $s1 # if $s0 < $s1 then $t0=1 ...
sltiu $t0, $s0, 25 # if $s0 < 25 then $t0=1 ...
0 16 17 8 0x24
Sử dụng slt
HUST-FET, 13/02/201178
Dùng slt, beq, bne, và giá trị 0 trong thanh ghi $zero
để tạo ra các điều kiện rẽ nhánh khác
less than blt $s1, $s2, Label
less than or equal to ble $s1, $s2, Label
greater than bgt $s1, $s2, Label
great than or equal to bge $s1, $s2, Label
Các lệnh rẽ nhánh được thêm vào tập lệnh như các lệnh
giả, được nhận dạng và mở rộng bằng trình dịch
assembler
Trình dịch assembler cần thanh ghi riêng ($at)
slt $at, $s1, $s2 #$at set to 1 if
bne $at, $zero, Label #$s1 < $s2
Lệnh nhảy không điều kiện
HUST-FET, 13/02/201179
Lệnh nhảy không điều kiện:
j label #go to label
Định dạng lệnh (J Format):
0x02 26-bit address
PC
4
32
26
32
00
từ trường 26 bits thấp của lệnh nhảy
Nhảy đến địa chỉ ở xa
HUST-FET, 13/02/201180
Khi địa chỉ nhảy đến ở xa hơn, và không thể biểu diễn
bằng 16 bits?
Phần mềm assembler hỗ trợ – nó chèn 1 lệnh nhảy không
điều kiện đến địa chỉ nhảy đến và đảo điều kiện rẽ nhánh
beq $s0, $s1, L1
trở thành
bne $s0, $s1, L2
j L1
L2:
Nhảy đến địa chỉ thay đổi
HUST-FET, 13/02/201181
Các ngôn ngữ bậc cao có các lệnh như case
hay switch cho phép lựa chọn trong nhiều
trường hợp phụ thuộc vào 1 biến
Lệnh:
jr $t1 #go to address in $t1
Mã máy:
op rs funct
0 9 0 0 0 8 = 0x08
R format
Lệnh case (switch) ở ngôn ngữ bậc cao
HUST-FET, 13/02/201182
switch (k) {
case 0: h=i+j; break; /*k=0*/
case 1: h=i+h; break; /*k=1*/
case 2: h=i-j; break; /*k=2*/
Giả sử 3 từ liên tiếp trong bộ nhớ bắt đầu từ địa chỉ lưu
trong $t4 chứa giá trị của các nhãn L0, L1, và L2 và k
lưu trong $s2 $t4
L2
L1
L0
Memory
add $t1, $s2, $s2 #$t1 = 2*k
add $t1, $t1, $t1 #$t1 = 4*k
add $t1, $t1, $t4 #$t1 = addr of JumpT[k]
lw $t0, 0($t1) #$t0 = JumpT[k]
jr $t0 #jump based on $t0
L0: add $s3, $s0, $s1 #k=0 so h=i+j
j Exit
L1: add $s3, $s0, $s3 #k=1 so h=i+h
j Exit
L2: sub $s3, $s0, $s1 #k=2 so h=i-j
Exit: . . .
Các từ lưu địa chỉ các nhãn như trên gọi là bảng địa chỉ nhảy (jump address
table)
Bảng này chứa dữ liệu nhưng thường nằm chung với đoạn mã chương trình
Gọi hàm hoặc thủ tục
HUST-FET, 13/02/201183
1. Hàm chính (hàm gọi, caller) đặt các tham số vào vị trị
mà thủ tục (hàm bị gọi, callee) có thể truy cập
$a0 - $a3: 4 thanh ghi tham số
2. Hàm gọi chuyển quyền điều khiển cho hàm bị gọi
3. Hàm bị gọi được cấp chỗ lưu trữ cần thiết
4. Hàm bị gọi thực hiện công việc mong muốn
5. Hàm bị gọi đặt kết quả vào vị trí hàm gọi có thể truy cập
$v0 - $v1: 2 thanh ghi kết quả
6. Hàm bị gọi trả điều khiển cho hàm gọi
$ra: 1 thanh ghi địa chỉ trở về để quay về vị trí xuất phát
Lệnh để gọi 1 hàm
HUST-FET, 13/02/201184
MIPS procedure call instruction:
jal ProcAddress #jump and link
Lưu PC+4 vào thanh ghi $ra như là đường dẫn
đến lệnh kế tiếp khi trở về từ hàm
Định dạng mã máy:
Hàm sẽ trở về hàm gọi bằng:
jr $ra #return
op 26 bit address J format
3 ????
Tổng kết MIPS
HUST-FET, 13/02/201185
Các loại lệnh
Load/Store
Computational
Jump and Branch
Floating Point
- coprocessor
Memory Management
Special
3 định dạng lệnh: độ rộng 32 bit
R0 - R31
PC
HI
LO
OP rs rt rd shamt funct
OP rs rt 16 bit number
OP 26 bit jump target
Registers
R format
I format
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
J format
Tổng kết các lệnh MIPS
HUST-FET, 13/02/201186
Category Instr OpC Example Meaning
Arithmetic
(R & I
format)
add 0 & 20 add $s1, $s2, $s3 $s1 = $s2 + $s3
subtract 0 & 22 sub $s1, $s2, $s3 $s1 = $s2 - $s3
add immediate 8 addi $s1, $s2, 4 $s1 = $s2 + 4
shift left logical 0 & 00 sll $s1, $s2, 4 $s1 = $s2 << 4
shift right
logical
0 & 02 srl $s1, $s2, 4 $s1 = $s2 >> 4 (fill with
zeros)
shift right
arithmetic
0 & 03 sra $s1, $s2, 4 $s1 = $s2 >> 4 (fill with
sign bit)
and 0 & 24 and $s1, $s2, $s3 $s1 = $s2 & $s3
or 0 & 25 or $s1, $s2, $s3 $s1 = $s2 | $s3
nor 0 & 27 nor $s1, $s2, $s3 $s1 = not ($s2 | $s3)
and immediate c and $s1, $s2, ff00 $s1 = $s2 & 0xff00
or immediate d or $s1, $s2, ff00 $s1 = $s2 | 0xff00
load upper
immediate
f lui $s1, 0xffff $s1 = 0xffff0000
Tổng kết các lệnh MIPS
HUST-FET, 13/02/201187
Category Instr OpC Example Meaning
Data
transfer
(I format)
load word 23 lw $s1, 100($s2) $s1 = Memory($s2+100)
store word 2b sw $s1, 100($s2) Memory($s2+100) = $s1
load byte 20 lb $s1, 101($s2) $s1 = Memory($s2+101)
store byte 28 sb $s1, 101($s2) Memory($s2+101) = $s1
load half 21 lh $s1, 101($s2) $s1 = Memory($s2+102)
store half 29 sh $s1, 101($s2) Memory($s2+102) = $s1
Cond.
branch
(I & R
format)
br on equal 4 beq $s1, $s2, L if ($s1==$s2) go to L
br on not equal 5 bne $s1, $s2, L if ($s1 !=$s2) go to L
set on less
than immediate
a slti $s1, $s2,
100
if ($s2<100) $s1=1;
else $s1=0
set on less
than
0 & 2a slt $s1, $s2, $s3 if ($s2<$s3) $s1=1;
else $s1=0
Uncond.
jump
jump 2 j 2500 go to 10000
jump register 0 & 08 jr $t1 go to $t1
jump and link 3 jal 2500 go to 10000; $ra=PC+4
Tổ chức máy tính MIPS
HUST-FET, 13/02/201188
Processor
Memory
32 bits
230
words
read/write
addr
read data
write data
word address
(binary)
00000
00100
01000
01100
11100
Register File
src1 addr
src2 addr
dst addr
write data
32 bits
src1
data
src2
data
32
registers
($zero - $ra)
32
32
32
32
32
32
5
5
5
PC
ALU
32 32
32
32
32
0 1 2 3
7654
byte address
(big Endian)
Fetch
PC = PC+4
DecodeExec
Add
32
32
4
Add
32
32
br offset
Chế độ địa chỉ MIPS
HUST-FET, 13/02/201189
1. Register addressing
op rs rt rd funct
Register
word operand
op rs rt offset
2. Base addressing
base register
Memory
word or byte operand
3. Immediate addressing
op rs rt operand
4. PC-relative addressing
Program Counter (PC)
Memory
branch destination instruction
5. Pseudo-direct addressing
op jump address
Program Counter (PC)
Memory
jump destination instruction||
op rs rt offset
Nguyên tắc thiết kế RISC
HUST-FET, 13/02/201190
Simplicity favors regularity
fixed size instructions – 32-bits
small number of instruction formats
Smaller is faster
limited instruction set
limited number of registers in register file
limited number of addressing modes
Good design demands good compromises
three instruction formats
Make the common case fast
arithmetic operands from the register file (load-store
machine)
allow instructions to contain immediate operands
Biên dịch
HUST-FET, 13/02/201191
C program
compiler
assembly code
Biến đổi chương trình C thành
hợp ngữ
Các ưu điểm của chương trình ngôn ngữ bậc cao
Số dòng mã ít hơn rất nhiều
dễ hiểu dễ biên dịch
Ngày nay các trình biên dịch tối ưu có thể tạo ra mã hợp
ngữ tốt như chuyên gia lập trình và thường tốt hơn khi
dịch các chương trình lớn
Kích thước mã nhỏ hơn, tốc độ nhanh hơn
Assembler
HUST-FET, 13/02/201192
C program
compiler
assembly code
assembler
object code
Kiểm tra cú pháp mã hợp ngữ và
chuyển đổi mã biểu tượng (mã hợp
ngữ) thành mã đổi tượng (mã máy).
Chú ý: Khi xác định hiệu năng cần đếm số chỉ thị được
thực thi chứ không phải kích thước mã chương trình.
Ưu điểm của assembler
Dễ nhớ
Sử dụng nhãn địa chỉ - giá trị địa
chỉ được tính bởi assembler
Sử dụng chỉ thị giả
- VD., “move $t0, $t1” chỉ có trong
assembler và sẽ được chuyển
thành chỉ thị “add $t0,$t1,$zero”)
Nhiệm vụ chính của assembler
HUST-FET, 13/02/201193
1. Tạo bảng biểu tượng (symbol table) chứa tên
biểu tượng (nhãn) và địa chỉ tương ứng
1 biểu tượng địa phương được sử dụng trong tệp nó
được định nghĩa. Biểu tượng được quy ước mặc định
là địa phương.
1 biểu tượng toàn cục (ngoại) tham chiếu/được tham
chiếu đến mã hoặc dữ liệu ở 1 tệp. Các biểu tượng
toàn cục được khai báo rõ ràng là toàn cục (VD.,
.globl main)
2. Dịch các lệnh ở mã hợp ngữ thành ngôn ngữ
máy bằng cách “lắp ghép” các giá trị số tương
ứng với mã lệnh (opcode), chỉ số thanh ghi
(register specifiers), số bít dịch (shift amounts),
và độ lệch các lệnh jump/branch.
Các nhiệm vụ khác của Assembler
HUST-FET, 13/02/201194
Thay mã giả lệnh bằng mã hợp ngữ hợp lệ
Thanh ghi $at được dành riêng cho assembler để làm việc này
Thay lệnh rẽ nhánh xa bằng 1 lệnh rẽ nhánh gần theo sau
bởi 1 lệnh nhảy
Thay lệnh với giá trị tức thời lớn bằng lệnh lui theo sau
bởi 1 lệnh ori
Đổi các số ở dạng thập phân và hệ 16 thành các số ở dạng
nhị phân và ký tự thành mã ASCII tương ứng.
Xử lý các dẫn hướng sắp xếp dữ liệu (e.g., .asciiz)
Triển khai các macro thành các chuỗi chỉ thị
Sơ đồ bộ nhớ MIPS
HUST-FET, 13/02/201195
Memory
230
words
0000 0000
f f f f f f f c
Text
Segment
Reserved
Static data
Mem Map I/O
0040 0000
1000 0000
1000 8000
7f f f f f fc
Stack
Dynamic data
$sp
$gp
PC
Kernel Code
& Data
Cấu trúc 1 tệp mã máy
HUST-FET, 13/02/201196
Object file header: kích thước và vị trí các phần sau trong
tệp
Text (code) segment (.text) : mã máy
Data segment (.data) : dữ liệu đi kèm với mã
Dữ liệu tĩnh (static data) – được cấp phát trong toàn bộ quá trình
chạy
Dữ liệu động (dynamic data) – cấp phát khi cần thiết
Relocation information: xác định các lệnh (dữ liệu) sử
dụng (nằm tại vị trị) địa chỉ tuyệt đối – không liên quan đến
1 thanh ghi (kể cả PC)
Trên MIPS các lệnh j, jal, và 1 số lệnh đọc ghi (VD., lw $t1,
100($zero) ) sử dụ
Các file đính kèm theo tài liệu này:
- bai_giang_mon_kien_truc_may_tinh_chuong_2_ngon_ngu_may_tinh.pdf