Thanh ghi này không thể bị tác động trực tiếp nên nó không được xem như một toán hạng như các thanh ghi khác.. - Kiểu bộ nhớ phân đoạn Segmented Memory Model : bộ nhớ được thể hiện như
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN MÔN TỔ CHỨC MÁY TÍNH
Kiến trúc tập lệnh Intel
Và một số câu lệnh cơ bản
Người hướng dẫn: TS MAI NGỌC THẮNG
Người thực hiện: ĐẶNG QUỐC KHANH - 51503183
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2016
Trang 2TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN MÔN TỔ CHỨC MÁY TÍNH
Kiến trúc tập lệnh Intel
Và một số câu lệnh cơ bản
Người hướng dẫn: TS MAI NGỌC THẮNG
Người thực hiện: ĐẶNG QUỐC KHANH - 51503183
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2016
Trang 3LỜI CẢM ƠN
Để hoàn thành bài tập này em đã nhận nhiều sự giúp đỡ của nhiều người trong thời gian qua Trước hết em xin cảm ơn thầy Mai Ngoc Thắng, giảng viên môn tổ chức máy tính đã hộ trợ em trong viêc tìm kiếm thông tin Em cũng cám ơn các tác giả đã chỉa sẽ kiến thức quý báo của mình trên internet để em tham khảo
Trang 4PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn
_
Tp Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_
Tp Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Trang 5TÓM TẮT
Kiến trúc tập lệnh là giao diện chính giữa phần cứng và phần mềm là cái nhìn trừu tượng của phần cứng dựa trên quan điểm phần mềm Có nhiều loại kiến trúc đã được sử dụng nhưng phổ biến hơn cả là kiến trúc tập lệnh của intel Kiến trúc này có các thanh ghi và
có các lệnh assembly dùng để thực hiện các phép toán
Trang 6MỤC LỤC
LỜI CẢM ƠN ……….……… ……… …….… 2
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN ……….… ….…… … 3
TÓM TẮT … ……….…….………… ………… 4
MỤC LỤC … ……… ……… …….5
DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT 6
CÁC BẢNG BIỂU, HÌNH VẼ, ĐÒ THỊ 7
CHƯƠNG 1 - SƠ LƯỢC VỀ CÁC THẾ HỆ KIẾN TRÚC TẬP LỆNH INTEL ……… 8
CHƯƠNG 2 -THIẾT KẾ CƠ BẢN CỦA KIẾN TRÚC TẬP LỆNH IA-32 ………… ……….….….…… ….8
CHƯƠNG 3 - THANH GHI VÀ ĐỊNH ĐỊA CHỈ 9
3.1 - Thanh ghi 9
3.1.1 Thanh ghi đa năng 9
3.1.2 Thanh ghi đoạn 10
3.1.3 Thanh ghi EFLAGS 10
3.2 Định địa chỉ 10
CHƯƠNG 4 - MỘT SỐ CÂU LỆNH CƠ BẢN CỦA IA-32 11
4.1 Lệnh của IA - 32 11
4.2 Các kiểu lệnh 11
4.3 Một số câu lệnh cơ bản 11
4.3.1 Một số câu lệnh kiểu di chuyển dữ liệu 11
4.3.2 Một số câu lệnh kiểu tính toán số học 12
4.3.3 Các câu lệnh phép toán luận lý 15
4.3.4 Nhóm lệnh điều khiển tuần tự 17
TÀI LIỆU THAM KHẢO 19
Trang 7DANH MỤC KÍ HIỆU VÀ CHŨ VIẾT TẮT
Chữ viết tắt :
reg : register
mem : memory
con :constant
Var : variable
Trang 8CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ
Hình 2.1 Sơ đồ cơ bản về kiến trúc IA-32
Hình 3.1 Các thanh ghi của kiến trúc IA-32 ở vi xử lý 32 bit
Hình 4.1 Quy ước chung về cách gọi tên các loại thanh ghi
Trang 9CHƯƠNG 1: SƠ LƯỢC VỀ CÁC THẾ HỆ VI XỦ LÝ INTEL
- IA-32(hay còn goi là x86 - 32 hay i386) là kiến trúc tập lệnh xuất hiện lần đầu tiên
ở vi xử lý Intel 80386 (vi xử lý 32 bit ) và được tiếp tục sử dụng cho các thế hệ vi xử lý sau này như học vi xử lý Pentium, Core Các vi xử lý của AMD cũng được áp dụng kiến trúc IA-32.IA-32 có khả năng tương thích ngược và mở rông xử lý 64 bit, Intel phát triển kiến trúc IA-32e (hay còn goi là x86-64) dành cho các vi xử lý 64 bit
- IA-64 (Itanium) là kiến trúc tập lệnh được Intel phát triển cho họ vi xử lý 64 bit dành cho thị trường máy chủ cao cấp
CHƯƠNG 2: THIẾT KẾ CƠ BẢN CỦA KIẾN TRÚC IA-32
Central Processer Unit
Registers
Memory Storage Unit
I/O device
control bus
adsress bus
Trang 10CPU (central process unit ) bao gồm các thanh ghi ( registers ) , đơn vị điều khiển (control unit hay CU ) , đơn vị xử lý tính toán logic ( arithmetic logic unit hay ALU ) và clock là tín hiệu đồng bộ hóa các xử lý của cpu
CHƯƠNG 3 : THANH GHI VÀ ĐỊNH ĐỊA CHỈ
3.1 Thanh ghi
Trong IA - 32 có 16 thanh ghi gồm 3 loại: thanh ghi đa năng ( general-purpose data registers ) , thanh ghi đoạn (segment registers), thanh ghi trạng thái và điều khiển (status and control registers)
Hình 3.1 Các thanh ghi của kiến trúc IA-32 ở vi xử lý 32 bit
3.1.1 Thanh ghi đa năng : có 8 thanh lưu giữ toán tử cho tính toán logic và số học,
toán hạng để tính địa chỉ và con trỏ đến bộ nhớ :
- EAX : chứa toán hạng và dữ liệu kết quả
- EBX : thanh ghi địa chỉ, trỏ chỉ tới dữ liệu
- ECX : thanh ghi đếm Được sủ dụng như biến đếm trong các vòng lặp
- EDX : con trỏ tới hoạt đông nhập xuất hoặc sử dụng trong các phép tính số học
- ESI : con trỏ chỉ tới chuỗi phép toán Thanh ghi này thường làm việc vơi chuỗi và mảng
- ESP: là thanh ghi stack pointer lun chỉ đến đỉnh của ngăn xếp hiện tại
- EBP : thanh ghi dùng để truy cập đến dữ liệu của ngăn xếp Nhưng khác với ESP nó không chỉ tới đỉnh ngăn xếp
Trang 11- EDI : con trỏ tới đích của chuỗi phép toán Thanh ghi này thường làm việc với chuổi và mảng
Các thanh ghi AX,BX,CX,DX có thẻ chia ra làm 2 phần thấp (low) và cao (high) để có thể ghi dữ liệu trong các bit thấp xong rồi ghi trên các bit cao
Các thanh ghi trên cũng có trong các vi xử lý 16 bit và 64 bit sử dụng IA-32
Ở vi xử lý 16 bit (sử dụng kiến trúc IA-32) các thanh ghi có tên tương tự như trên 32 bit nhưng bỏ E ở đầu Tương tự như vậy ở vi xử lý 64 bit (sử dụng kiến trúc IA-32e ) ta thay E bằng R
3.1.2 Thanh ghi đoạn : có 6 thanh ghi 16 bit
- Stack segment (SS) : lưu địa chỉ phân đoạn ngăn xếp
- Code segment (CS) : lưu địa chỉ phân đoạn mã
- Data segment (DS) : lưu địa chỉ phân đoạn dữ liệu
- Extra segment (ES) : lưu địa chỉ phân đoạn dữ liệu
- F segment (FS) : lưu địa chỉ phân đoạn dữ liệu
- G segment (GS) : lưu địa chỉ phân đoạn dữ liệu
3.1.4 Thanh ghi EFLAGS :
Thanh ghi EFLAGS là thanh ghi 32 bit chứa cờ dánh dấu một nhóm các trạng thái, cờ điều khiển và cờ hệ thống ( có thể truy cập thông qua một số lệnh đặc biệt ) Cờ có 1 bit giá trị là 0 hoặc 1 Cờ bật giá trị bằng 1
Có các cờ sau:
- CF ( Carry Flag) : Cờ này được bật khi có phép tính có sử dụng bit nhớ
- ZF (Zero Flag) : Cờ bật khi phép tính được bật là 0
- SF ( Sign Flag): Cờ bật khi kết quả phép tính có dấu
- OF ( Overflow Flag) : Bật khi phép tính gây tràn số
- PF ( Parity Flag) : Bật khi phép tính có chẵn bit 1
- AF ( Auxilary Flag) : Bật khi phép tính có sử dụng bộ nhớ phụ
- IF (Interrupt Flag) : Bật để cho phép xảy ra các ngắt
- DF (Direction Flag) : Bật để giảm chỉ số tự động khi làm việc với mảng hat chuổi ký tự
3.1.5 Thanh ghi EIP
Thanh ghi EIP là một thanh ghi được cập nhật mỗi khi có lệnh được thực hiện và luôn trỏ đến câu lệnh tiếp theo Thanh ghi này không thể bị tác động trực tiếp nên nó không được xem như một toán hạng như các thanh ghi khác
3.2 Định địa chỉ
Trật tự sắp xếp của bit và byte : IA-32 đánh địa chỉ theo “ little endian “ , Least
Significant bit (LSB) luôn được lưu ở ô nhớ có địa chỉ nhỏ nhất và Most Significant bit (MSB) luôn được lưu ở ô nhớ có địa chỉ nhỏ nhất
Kiểu dữ liệu : 1 byte bằng 8 bit, 1 word bằng 16 bit, 1 double word bằng 32 bit,
một quad word bằng 64 bit
Địa chỉ hóa bộ nhớ : có 2 cách
Trang 12- Kiểu bộ nhớ phẳng ( Flat Memory Model) : bộ nhớ đơn lẻ , kết nối với
không gian địa chỉ Code, data, và procedure stack được chứa trong không gian địa chỉ nối tiếp nhau từ 0 đến 2^32-1
- Kiểu bộ nhớ phân đoạn ( Segmented Memory Model) : bộ nhớ được thể hiện như một nhóm độc lập các đoạn không gian địa chỉ Các code, dât và thử tuc ngăn xếp được lưu tách rời nhau
CHƯƠNG 4 : MỘT SỐ CÂU LỆNH CƠ BẢN CỦA IA-32
4.1 Lệnh của IA-32
Lệnh của IA -32 bao gồm
Opcode : xác định công việc cần làm Nguồn toán hạng ( Source Operands) : nằm trông các thanh ghi, từ bộ nhớ ,
và từ các thiết bị nhập xuất
Đích của toán hạng ( Destination Operand) : có thể được lưu trong thanh ghi,
bộ nhớ, các thiết bị nhâp xuất
Cú pháp cơ bản của lệnh ia-32 assembly :
Opcode,sourse1,[sourse2,]detination
4.2 Các kiểu lệnh :
- Di chuyển dữ liệu
- Tính toán số học
- Phép toán luận lý
- Điều khiển tuần tự
Để dễ xem xét về câu lệnh thông dụng của IA-32 assembly vơi cú pháp cảu intel Chúng ta tạm sử dụng các quy ước sau
Hình 4.1
4.3 Một số câu lệnh cơ bản :
4.3.1 Một số câu lệnh kiểu di chuyển dữ liệu :
mov :
Là lệnh dich chuyển dữ liệu từ nguồn sang đích
Tổng quát : mov <toán hạng đích>,<toán hạng nguồn>
Cú pháp :
<reg32> Thanh ghi 32 bit (EAX, EBX, ECX, EDX, ESI, EDI, ESP, or EBP)
<reg16> Thanh ghi 16 bit (AX, BX, CX, or DX)
<reg8> Thanh ghi 8 bit (AH, BH, CH, DH, AL, BL, CL, or DL)
<reg> Bất kỳ thanh ghi nào
<mem> Địa chỉ nhớ (e.g., [eax], [var + 4], or dword ptr [eax+ebx])
<con32> Hằng 32 bit
<con16> Hằng 16 bit
<con8> Hằng 8 bit
<con> Bất kỳ hằng nào
Trang 13mov <reg>,<reg>
mov <reg>,<mem>
mov <mem>,<reg>
mov <reg>,<const>
mov <mem>,<const>
Ví dụ : mov eax,ebx // di chuyển giá trị từ thanh ghi ebx sang eax
push :
Là lệnh đặt dữ liệu từ nguồn vào ngăn xếp theo thứ tự từ dưới lên Tổng quát :
push <toán hạng nguồn>
Cú pháp :
push <reg32>
push <mem>
push <con32>
Ví dụ :
push eax // đặt dữ liệu trong thanh ghi eax vào đáy ngăn xếp
pop :
Là lệnh lấy dữ liêu từ trên xuống trong ngăn xếp vào đích
Tổng quát :
push <toán hạng đích>
Cú pháp :
pop <reg32>
pop <mem>
Ví dụ :
pop edi // lấy dữ liệu trên đỉnh ngăn xếp rồi di chuyển vào thanh ghi edit
lea :
Là lệnh lấy địa chỉ ở toán hạng 2 đặt vào toán hang 1
Tổng quát :
lea <toán hạng 1>,< toán hang 2>
Cú pháp :
lea <reg32>,<mem>
Ví dụ :
lea eax,[var] // địa chỉ của var ở memori được đặt vào thanh eax
4.3.2 Một số câu lệnh kiểu tính toán số học :
add :
Câu lệnh cộng hai toán hạng 1 va 2 sau đó lưu vào toán hạng 1 Toán hạng có thể được lưu trong thanh ghi hoặc bộ nhớ chính hoặc có thể là hằng số
Tổng quát :
add toán hạng 1, toán hạng 2
Cú pháp :
Trang 14add <reg>,<reg>
add <reg>,<mem>
add <mem>,<reg>
add <reg>,<con>
add <mem>,<con>
Ví dụ :
add eax,10 // cộng 10 với dữ liệu trong eax rồi lưu vào eax
sub :
Câu lệnh trừ toán hạng 1 cho toán hạng 2 sau đó lưu vào nơi chưa toán hạng 1 Toán hạng có thể được lưu trong thanh ghi hoặc bộ nhớ chính hoặc có thể là hằng số
Tổng quát :
sub toán hạng 1 , toán hạng 2
Cú pháp :
sub <reg>,<reg>
sub <reg>,<mem>
sub <mem>,<reg>
sub <reg>,<con>
sub <mem>,<con>
Ví dụ :
sub eax,10 // trừ giá trị lưu trong thanh ghi eax cho 10 rồi lưu vào
thanh ghi eax
inc,dec :
inc là lệnh tăng một vào toán hạng, dec thì ngược lại giảm môt giá trị của toán hạng
Cú pháp :
inc <reg>
inc <mem>
dec <reg>
Dec <mem>
Ví dụ :
inc eax //cộng 1 vào toán hạng ở thanh eax
dec eax //trừ 1 vào toán hạng ở thanh eax
imul :
Lệnh nhân các số có dấu , kết quả là số có dấu
Tổng quát :
imul <toán hạng nguồn>
Cú pháp :
Trang 15imul <mem>
imul <reg>
Nếu toán hạng nguồn là 8 bit thì thực hiện nhân EAL với toán
hạng nguồn rồi lưu trong EAX
Nếu toán hạng nguồn là 16 bit thì thực hiện nhân EAX với toán
hạng nguồn rồi lưu trong 2 thanh ghi EDX và EAX EDX giữ 16 bit
cao, EAX giữ 16 bit thấp
Ví dụ :
mov eax,16
mul 2
mul :
Lệnh nhân các số nguyên, kết quả là số nguyên
Tổng quát :
Mul <toán hạng nguồn>
Cú pháp :
mul <mem>
mul <reg>
Nếu toán hạng nguồn là 8 bit thì thực hiện nhân EAL với toán hạng nguồn rồi lưu trong EAX
Nếu toán hạng nguồn là 16 bit thì thực hiện nhân EAX với toán hạng nguồn rồi lưu trong 2 thanh ghi EDX và EAX EDX giữ 16 bit cao, EAX giữ 16 bit thấp
Ví dụ :
mov eax,16
mul 2
div :
Lệnh chia số nguyên, kết quả nguyên Số chia lưu ở thanh ghi eax số bị chia lưu ở toán hạng
Tổng quát :
div <toán hạng>
Số chia lưu ở thanh ghi EAXsố bị chia lưu ở toán hạng Thương số lưu
ở EAL , số dư lưu ở EAH
Cú pháp :
div <reg32>
div <mem>
Ví dụ :
mov eax,8
mov edx,2
div edx
Trang 16 idiv
Lệnh chia số không dấu, kết quả là số không dấu Số chia lưu ở thanh ghi eax số bị chia lưu ở toán hạng
Tổng quát :
idiv <toán hạng>
Số chia lưu ở thanh ghi EAXsố bị chia lưu ở toán hạng Thương số lưu
ở EAL , số dư lưu ở EAH
Cú pháp :
idiv <reg32>
idiv <mem>
Ví dụ :
mov eax,8
mov edx,2
idiv edx
4.3.3 Các câu lệnh phép toán luận lý :
Các lệnhand, or, xor:
Các câu lệnh luận lý thực hiên phép toán luận lý xác định trên toán hạng
và lưu chúng trên toán hạng thứ nhất
Tổng quát :
and <toán hạng 1>, <toán hạng 2>
or <toán hạng 1>, <toán hạng 2>
xor <toán hạng 1>, <toán hạng 2>
Cú pháp :
and <reg>,<reg>
and <reg>,<mem>
and <mem>,<reg>
and <reg>,<con>
and <mem>,<con>
or <reg>,<reg>
or <reg>,<mem>
or <mem>,<reg>
or <reg>,<con>
or <mem>,<con>
xor <reg>,<reg>
xor <reg>,<mem>
xor <mem>,<reg>
xor <reg>,<con>
xor <mem>,<con>
Ví dụ :
Trang 17xor edx,edx // xóa giá trị lưu trên thanh edx.
not :
Nghich đảo giá trị cửa toán hạng
Tổng quát :
not <toán hạng>
Cú pháp :
not <reg>
not <mem>
Ví dụ :
not <eax> // nghịch đảo từng bit trên thanh ghi eax
neg :
Đổi dấu trong giá trị cửa toán hạng
Tổng quát :
neg <toán hạng>
Cú pháp :
neg <reg>
neg <mem>
Ví dụ :
neg eax // đổi dấu giá trị trong thanh ghi eax
shl,shr :
Là lệnh dịch trái (shift left, shl) và lệnh dịch phải (shift right, shr) Ở lệnh này dãy bit sẻ dịch về bên trái ( hoặc phải) nếu bit tai đó trống thì sẽ được thay thế bằng 0
Tổng quát :
shl <toán hạng>, <hằng số>
shr <toán hạng>, <hằng số>
Cú pháp :
shl <reg>,<con8>
shl <mem>,<con8>
shr <reg>,<con8>
shr <mem>,<con8>
Ví dụ: dữ liệu trong thanh ghi eax là 00000000 00000000 01000000 11111111
shl eax,1 // dich trái dãy số trong eax 1 bit thì sẽ là
00000000 00000000 10000001 11111110 shr eax,1 // dich phải dãy số trong eax 2 bit thì sẽ là
00000000 00000000 00100000 01111111
Trang 184.3.4 Nhóm lệnh điều khiển tuần tự
jmp :
Là lệnh nhảy không điều kiện đến vị trí đích Vị trí đích có thể lànhãn của một lệnh, tên của một thủ tục hoặc có thể là một thanh ghi, một ô nhớ (đã được định nghĩa) nào đó <Vị trí đích> cũng có thể là một biến nào đó, giá trị của nó thường là địa chỉ của một ô nhớ trong đoạn Code
Có 3 dạng : near, short, far Cơ chế của jmp dựa vào việc thay đổi nội dung của thanh ghi ip và thanh ghi đoạn cs Dạng near và short ko thay đổi
dữ liệu thanh cs nên vị trí đích phải nằm trên cùng đoạn nhớ còn dạng far thì ngược lại
Cú pháp:
jmp <label>
Lệnh nhảy có điều kiện
Có nguyên lý hoạt động giống như jmp nhưng phải có điều kiện đó là
sự thay đổi cờ hiệu trong thanh ghi EFLAG bằng cách dung các lênh dịch bit, đảo bit, so sánh (cmp)
cmp :
Cú pháp :
Cmp <toán hạng đích>,< toán hạng nguồn>
Trong đó ca 2 không thể là ô nhớ
Toán hạng đích không thể là hằng số
Lênh này so sánh giá trị hoặc nội dung của hay toán hạng, nó trừ toán hạng đích cho toán hạng nguồn nhung không làm hay đổi giá trị của toán hạn đích mà chỉ làm thay đổi trạng thái cờ hiệu trông thanh ghi EFLAG
Các lệnh nhảy có điều kiện :
Các lệnh nhảy :
je <label> (nhảy khi bằng)
jne <label> ( nhảy khi không bằng)
jz <label> ( nhảy khi kết quả cuối cùng là 0)
jg <label> ( nhảy khi lớn hơn)
jge <label> ( nhảy khi lớn hơn hoặc bằng)
jl <label> ( nhảy khi nhỏ hơn )
jle <label> ( nhảy khi nhỏ hơn hoặc bằng)
Ví dụ
cmp eax, ebx //so sánh dữ liệu eax với ebx
jle done // nếu bé hơn hoặc bằng thì nhay tới
nhãn done
call :
Thực hiện chương trình con và trả về Lệnh này đặt địa chỉ mã của chương trình con cần thưc hiện vào ngăn xếp và thực hiên lệnh