Thuật ngữ x64 hay x86-64 dùng để chỉ kiến trúc tập lệnh 64-bit do AMD phát triển và được AMD, Intel, VIA và nhiều nhà sản xuất khác sử dụng trong các sản phẩm BLX. Khác với kiến trúc 64-bit trước đó là IA-64 được Intel sử dụng trong các BXL Itanium, kiến trúc x86-64 cho phép chạy các ứng dụng 32-bit mà không cần phải biên dịch lại và hiệu suất không bị suy giảm như khi chạy ở chế độ mô phỏng x86-32 trên BXL Itanium (điều này đặc biệt quan trọng vì hiện nay đa phần ứng dụng là 32-bit). Với ưu điểm trên x86-64 là kiến trúc 64-bit được dùng phổ biến hơn cho đến thời điểm hiện nay.
47 trang |
Chia sẻ: vietpd | Lượt xem: 3670 | Lượt tải: 3
Bạn đang xem nội dung tài liệu Kiến trúc tập lệnh x86-64, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
KIẾN TRÚC TẬP LỆNH x86-64
Nhóm 4 cập nhật
Thuật ngữ x64 hay x86-64 dùng để chỉ kiến trúc tập lệnh 64-bit do AMD phát triển và được AMD, Intel, VIA và nhiều nhà sản xuất khác sử dụng trong các sản phẩm BLX. Khác với kiến trúc 64-bit trước đó là IA-64 được Intel sử dụng trong các BXL Itanium, kiến trúc x86-64 cho phép chạy các ứng dụng 32-bit mà không cần phải biên dịch lại và hiệu suất không bị suy giảm như khi chạy ở chế độ mô phỏng x86-32 trên BXL Itanium (điều này đặc biệt quan trọng vì hiện nay đa phần ứng dụng là 32-bit). Với ưu điểm trên x86-64 là kiến trúc 64-bit được dùng phổ biến hơn cho đến thời điểm hiện nay.
Kiến trúc mới tăng không gian bộ nhớ phẳng cho các phần mềm lên 64 bit và hỗ trợ không gian địa chỉ vật lý lên đến 40 bit.
Chế độ 64-bit hỗ trợ những tính năng mới sau:
64-bit địa chỉ có nghĩa là ứng dụng có thể sử dụng 16EB (Exabytes) bộ nhớ (264). Các bộ xử lý hiện tại có thể đánh địa chỉ cho không gian bộ nhớ lên đến 256 TB (248). Giới hạn này là do kích thước có hạn của FSB. Trong tương lai bộ vi xử lí có thể truy cập không gian bộ nhớ phẳng lên tới 16EB.
Thêm 8 thanh ghi: những thanh ghi mới này có tên là R8 tới R15. R được hiểu là thanh ghi 64 bit. Trong mode 64 bit, CPU có tất cả 16 thanh ghi 64 bit .
Thêm 8 thanh ghi sử dụng cho tập lệnh SIMD (MMX, SSE, SSE2, SSE3). Khi đó bộ vi xử lí có tất cả 16 thanh ghi MMX 64 bit. Thanh ghi XMM có độ dài 128 bit , số thanh ghi XMM tăng từ 8 lên 16 thanh ghi . Những thanh ghi XMM được sử dụng trong những phép tính dấu phảy động SSE.
Tất cả các con trỏ thanh ghi và con trỏ lệnh có độ rộng 64 bit. Thanh ghi trong FPU có độ rộng 80 bit .
Sử dụng kỹ thuật Fast interrupt-priorization.
Con trỏ lệnh 64-bit RIP (relative data addressing mode).
I. CÁC ĐẶC ĐIỂM CỦA KIẾN TRÚC TẬP LỆNH x86-64:
Kiến trúc x86-64 đưa ra 2 thành phần mới: long mode, và phần mở rộng thanh ghi.
1. Long mode (IA-32e mode)
Kiến trúc x86-64 mở rộng kiến trúc x86 bằng cách thêm vào một chế độ hoạt động gọi là long mode. Long mode được điều khiển bằng một bit gọi là LMA (Long Mode Active). Khi tắt LMA, bộ xử lý hoạt động như một bộ xử lý chuẩn x86, và nó tương thích với mọi hệ điều hành cũng như ứng dụng 16 và 32-bit từ trước. Khi bật long mode (LMA=1) các mở rộng 64-bit được kích hoạt. Tính năng này khiến cho hệ thống tự động cấu hình theo phần mềm.
Hệ điều hành 64-Bit
(LMA)
Ứng dụng 64-Bit
(CSD L Bit)
Kích thước dữ liệu
(CSD D Bit)
Chế độ hoạt động của CPU
0
X
0
16-Bit chuẩn
0
X
1
32-Bit chuẩn
1
0
0
Tương thích 16-Bit
1
0
1
Tương thích 32-Bit
1
1
0
64-Bit
1
1
1
Dự phòng
Mode
Yêu cầu hệ điều hành
Cần dịch lại ứng dụng
Mặc định
Kích thước địa chỉ
Kích thước toán hạng
Dùng mở rộng thanh ghi
Độ rộng thanh ghi đa năng
Long mode
(IA-32e mode)
64-bit
Hệ điều hành 64-bit
Có
64
32
Có
64
Chế độ tương thích
Không
32
Không
32
16
Legacy mode
Hệ điều hành 32-bit hoặc 16-bit
Không
32
32
Không
32
16
16
Long mode lại bao gồm 2 chế độ: 64-bit và chế độ tương thích. Các mode này sử dụng 2 bit trong thanh ghi mô tả đoạn mã (code segment descriptor). Bit đầu tiên là bit “D” (default size) có sẵn, điều khiển kích thước của toán hạng. Bit thứ hai là “bit L” (bit thứ 53 trước đây chưa được sử dụng), nó dùng để định rõ liệu một ứng dụng là 64-bit hay đang ở chế độ tương thích.
Kích thước địa chỉ mặc định là 64-bit, và kích thước toán hạng mặc định là 32-bit. Kích thước này có thể định nghĩa lại bằng các tiếp đầu lệnh. Một tiếp đầu lệnh REX mới được thêm vào để chỉ định kích thước toán hạng 64-bit và những thanh ghi mới. Chế độ này được kích hoạt vận hành trên cơ sở hệ thống mã phân đoạn riêng lẻ.
2. Các thanh ghi trong bộ xử lý x64
Như hình trên đã chỉ rõ, các thanh ghi có thể chia thành những nhóm sau đây:
Thanh ghi đa năng: 16 thanh ghi.
Thanh ghi đoạn: 6 thanh ghi.
Thanh ghi của bộ xử lý dấu chấm động (FPU): 8 thanh ghi
Thanh ghi trạng thái và điều khiển: 1 thanh ghi.
Thanh ghi con trỏ lệnh: 1 thanh ghi.
Thanh ghi sử dụng cho tập lệnh SIMD: 16 thanh ghi.
Để định địa chỉ logic cho các thanh ghi, các vi xử lý có kiến trúc x86-64 mở rộng thiết kế đã sử dụng trong các tập lệnh 16-bit và 32-bit. Tất cả thanh ghi 64 bit được chia thành những thanh ghi nhỏ 8 bit. Sơ đồ dưới đây gọi là “uniform byte-register addressing”.
Với chế độ hoạt động 16-bit ,2 byte của thanh ghi A được định địa chỉ là AX.
Với chế độ hoạt động 32-bit ,4 byte của thanh ghi A được định địa chỉ là EAX.
Với chế độ hoạt động 64-bit ,8 byte của thanh ghi A được định địa chỉ là RAX.
a. Các thanh ghi đa năng
Các thanh ghi đa chức năng 32 bit EAX, EBX, ECX, EDX, ESI, EDI, ESP và EBP có trách nhiệm lưu trữ những nội dung sau:
Tham số của các phép toán lôgíc và số học.
Tham số của các phép tính địa chỉ.
Con trỏ bộ nhớ.
Tuy vậy, tất cả các thanh ghi đều có thể được dùng để lưu trữ mọi tham số, kết quả và con trỏ. Cần lưu ý khi dùng thanh ghi ESP vì thanh ghi này chỉ dành riêng cho con trỏ ngăn xếp và không được phép dùng cho mục đích khác.
Một số lệnh cần một thanh ghi nhất định để lưu trữ tham số của nó. Ví dụ, lệnh chuỗi (string) dùng các thanh ghi ECX,ESI và EDI. Khi sử dụng mô hình bộ nhớ phân đoạn, một số cặp thanh ghi được ngầm định để lưu địa chỉ lôgíc (ví dụ DS:EBX).
Ngoài ra mỗi thanh ghi đều có một nhiệm vụ đặc biệt:
EAX: thanh ghi kết quả các phép toán (accumulator).
EBX: thanh ghi con trỏ mà địa chỉ đoạn nằm trong DS,
ECX: thanh ghi số đếm cho các phép toán chuỗi (string) và quay vòng (loop)
EDX: thanh ghi địa chỉ cổng cứng.
ESI: thanh ghi con trỏ mà địa chỉ đoạn nằm trong DS, con trỏ nguồn của phép toán chuỗi.
EDI: thanh ghi con trỏ mà địa chỉ đoạn nằm trong DS, con trỏ đích của phép toán chuỗi.
ESP: thanh ghi con trỏ ngăn xếp mà địa chỉ đoạn nằm trong SS
EBP: thanh ghi con trỏ ngăn xếp mà địa chỉ đoạn nằm trong SS
16 bit cuối của những thanh ghi đa chức năng được dùng như các thanh ghi của thế hê 8086 và 8088. Người lập trình có thể sử dụng nó qua tên thanh ghi AX, BX, CX, DX, BP, SP, SI và DI. Hai byte cuối cùng của EAX, EBX, ECX và EDX được gọi là AH, BH, CH, DH (byte cao) và AL, BL, CL, DL (byte thấp).
Ở chế đô 64-bit, các thanh ghi đa năng được mở rộng lên 64 bit .Chúng được gọi là RAX, RBX, RDX, RDI, RSI, RBD, RSP. Có 8 thanh ghi đa năng mới được thêm vào đưa tổng số thanh ghi đa năng lên 16 thanh. Các thanh ghi mới này có tên từ R8 đến R15.
b. Thanh ghi đoạn
Các thanh ghi đoạn (CS, DS, SS, ES, FS, GS) lưu trữ bộ chọn đoạn 16 bit. Một bộ chọn đoạn là một con trỏ đặc biệt chỉ đến bộ mô tả đoạn là nơi lưu trữ địa chỉ và đặc tính của đoạn. Ðể truy nhập một đoạn trong bộ nhớ, bộ chọn đoạn phải nằm trong thanh ghi đoạn tương ứng.
Cách sử dụng thanh ghi đoạn phụ thuộc vào mô hình bộ nhớ mà hệ điều hành sử dụng. Nếu sử dụng mô hình bộ nhớ phẳng (không phân đoạn), thanh ghi đoạn lưu trữ bộ chọn đoạn trỏ đến những đoạn chồng lên nhau. Mỗi đoạn đều bắt đầu từ địa chỉ số 0 của không gian địa chỉ tuyến tính. Thông thường có hai đoạn chồng lên nhau: một đoạn cho mã lệnh, một đoạn cho dữ liệu và ngăn xếp. Thanh ghi CS trỏ đến đoạn mã lệnh, các thanh ghi đoạn khác trỏ đến đoạn dữ liệu.
Các thanh ghi đoạn được bỏ qua trong chế độ 64-bit. Nhưng CS (code segment) vẫn còn tồn tại trong chế độ 64-bit. CS là cần thiết để gộp chung các chế độ của bộ xử lý (16 -, 32 - hoặc 64-bit) cũng như mức độ ưu tiên thực hiện. Như đã nói ở trên, các bit D và L là bit dùng để xác định địa chỉ mặc định và kích thước toán hạng. DPL được sử dụng để kiểm tra tính ưu tiên thực hiện. Cơ số và các trường giới hạn được bỏ qua.
c. Thanh ghi trạng thái và điều khiển
Thanh ghi cờ EFLAGS được mở rộng thành thanh ghi 64-bit RFLAGS, chứa một nhóm cờ trạng thái một nhóm cờ điều khiển và một nhóm cờ hệ thống. Cho phép theo dõi và thay đổi trạng thái của bộ vi xử lý cũng như của chương trình đang chạy.
d. Thanh ghi con trỏ lệnh
Thanh ghi con trỏ lệnh EIP lưu giữ địa chỉ lệch của mã lệnh chuẩn bị được tiến hành. Giá trị của nó tăng khi chạy chương trình thường hay giảm khi dùng các lệnh JMP, Jcc, CALL, RET, IRET. Lệnh CALL là lệnh duya nhất có thể đọc giá trị của con trỏ lệnh từ ngăn xếp. Nội dung của EIP có thể thay đổi gián tiếp bằng cách thay đổi giá trị con trỏ lệnh trong ngăn xếp và sau đó thực hiện lệnh quay về (RET hay IRET). Trong chế độ 64-bit, thanh nghi lệnh được gọi là RIP.
Phần mở rộng thanh ghi cũng bao gồm 8 thanh ghi dùng cho tập lệnh SIMD ,đưa tổng số thanh ghi cho tập lệnh này lên 16, Các thanh ghi mới này có tên từ XMM8 đến XMM15.
3. Quản lý bộ nhớ
3 mô hình quản lý bộ nhớ
Khi sử dụng các khả năng quản lý bộ nhớ của bộ vi xử lý, chương trình không định địa chỉ trực tiếp bộ nhớ vật lý mà truy nhập chúng qua một trong các mô hình bộ nhớ: phẳng, chia đoạn và chế độ địa chỉ thực.
Mô hình phẳng không gian địa chỉ duy nhất và liên tục (không gian tuyến tính). Mã lệnh, dữ liệu và ngăn xếp đều nằm trong không gian địa chỉ này. Không gian địa chỉ tuyến tính được định vị theo từng byte, địa chỉ tăng dần từ 0 đến 232-1. Ðịa chỉ trong không gian tuyến tính được gọi là địa chỉ tuyến tính.
Mô hình phân đoạn không gian địa chỉ được chia thành từng phần độc lập (gọi là đoạn). Nếu sử dụng mô hình này, mã lệnh, dữ liệu và ngăn xếp đều chiếm giữ một đoạn riêng. Ðể định vị một byte trong đoạn chương trình cần có một địa chỉ vật lý. Ðịa chỉ vật lý bao gồm một bộ chọn đoạn và địa chỉ lệch. Bộ chọn đoạn mô tả đoạn cần truy nhập, địa chỉ lệnh xác định hytc cần mô tả trong đoạn. Một chương trình chạy trong bộ vi xử lý Intel có thể định địa chỉ 1683 đoạn với kích thước khác nhau. Mỗi đoạn có thể lớn tới 232 byte = 4 Gigabyte. Mỗi đoạn được mô tả đều quy chiếu đến không gian địa chỉ tuyến tính của bộ nhớ. Bộ vi xử lý chuyển đổi địa chỉ lôgic thành địa chỉ vật lý.
Mô hình địa chỉ thực, đây là mô hình quản lý bộ nhớ của BXL 8086, là một dạng đặc biệt của bộ nhớ phân đoạn. Chương trình ứng dụng và hệ điều hành cùng nằm trong một trường nhiều đoạn dài 64K. Vì 8086 có 20 dây địa chỉ nên dung lượng bộ nhớ tuyến tính trong chế độ địa chỉ thực chỉ là 220 byte. Kích thước địa chỉ của chế độ địa chỉ thực mặc định là 16 bit. Có thể viết địa chỉ trong chế độ này với kích thước 32 bit, nhưng dịa chỉ lớn nhất vẫn chỉ là 0000FFFFH (216).
II. TẬP LỆNH x86-64
1. Dạng lệnh:
[Mã gợi nhớ] [toán hạng 1], [toán hạng 2], [toán hạng 3]
Số lượng toán hạng 0, 1, 2, hay 3 phụ thuộc vào mã gợi nhớ. Toáng hạng 1 là toán hạng đích, lưu kết quá của phép toán, (các) toán hạng sau (nếu có) là toán hạng nguồn. Trong một số trường hợp toán hạng 1 vừa là nguồn vừa là đích. Ví dụ với các lệnh ADD, SUB, MUL, DIV (cộng, trừ, nhân, chia) …
Mỗi toán hạng có thể là:
Một giá trị đưa trực tiếp vào câu lệnh (ngoại trừ toán hạng đích)
ADD EAX, 14 ; cộng 14 vào thanh ghi 32-bit EAX
Một thanh ghi
ADD R8L, AL ; cộng 8 bit AL vào R8L
Gián tiếp (bằng địa chỉ trên bộ nhớ): cho phép dùng 8, 16, 32 bit địa chỉ, thanh ghi đa đụng dung cho cơ số và chỉ số, với hệ số nhân 1, 2, 4, 8. Một cách đầy đủ có thể thêm tiền tố bằng FS: hoặc GS: nhưng hiếm khi cần.
MOV R8W, 1234[8*RAX+RCX]
(lệnh chuyển một word tại địa chỉ 8*RAX+RCX+1234 vào R8W)
RIP-relative addressing: dạng mới của x64 và cho phép truy cập vào bảng dữ liệu cũng như mã lệnh đang được con trơ lệnh trỏ tới, làm cho việc cài đặt các đoạn mã độc lập đối với vị trí trở nên dễ dàng hơn.
MOV AL, [RIP] ; RIP trỏ đến cấu lệnh tiếp theo chính là NOP
NOP
MOV EAX, TABLE ; dùng RIP để lấy bảng dữ liệu
2. Các nhóm lệnh:
Các lệnh đa dụng (general-purpose instructions)
Các lệnh hệ thống (system instructions)
64-bit mode instructions
(Đây là nhóm lệnh cơ bản của tập lệnh x86-64, các nhóm lệnh như MMX, SSE, VMX, SMX được nhà sản xuất đưa vào từng dòng sán phẩm cụ thể nên không xét đến)
a. Các lệnh đa dụng (general-purpose instructions)
Đây là nhóm lệnh tính toán cơ sở mà lập trình viên thường xuyên sử dụng nhất. Bao gồm:
Các lệnh truyền dữ liệu (data transfer instructions)
Các phép tính số học nhị phân (binary arithmetic instructions)
Các phép tính số học thập phân (decimal arithmetic instructions)
Các phép tính luận lý (logical instructions)
Các lệnh dịch và xoay (shift và rotate instructions)
Các lệnh thao tác trên Bit và Byte (Bit và Byte instructions)
Các câu lệnh điều khiển (control transfer instructions)
Các lệnh xử lý chuỗi (string instructions)
Các lệnh vào ra (I/O instructions)
Bắt đầu, ra khỏi khối lệnh (enter và leave instructions)
Điều khiển các cờ (EFLAG)
Các câu lệnh với thanh ghi đoạn (segment register instructions)
Các lệnh khác
Bảng sau tóm tắt các lệnh thông dụng của nhóm này:
Tên
Đối số
Phép toán
Mô tả
Nhóm lệnh
mov
SRC, DST
DST = SRC
Sao chép nguồn vào đích
Truyền dữ liệu
xchg
SRC, DST
DST = SRC,
SRC = DST
Hoán chuyển
đẩy
SRC
(%esp) = SRC;
%esp -= 4;
Đẩy vào stack
pop
DST
DST = (%esp);
%esp += 4;
Lấy ra khỏi stack
xor
SRC, DST
DST = DST ^ SRC
Bitwise xor
Luận lý
or
SRC, DST
DST = DST | SRC
Bitwise or
và
SRC, ST
DST = DST & SRC
Bitwise và
cmp
A, B
EFLAGS = B - A
So sánh
Số học
test
A, B
EFLAGS = B & A
Và
inc
DST
DST++
Tăng
dec
DST
DST-
Giảm
add
SRC, DST
DST = DST + SRC
Cộng
sub
SRC, DST
DST = DST - SRC
Trừ
mul
SRC
%edx:%eax = %eax * SRC
Nhân (không dấu)
imul
SRC
%edx:%eax = %eax * SRC
Nhân (có dấu)
div
SRC
%edx = %eax MOD SRC;
%eax = %eax / SRC;
Chia (không dấu)
idiv
SRC
%edx = %eax MOD SRC; %eax = %eax / SRC;
Chia (có dấu)
jmp
LABEL
Nhảy vô điều kiện
Các lệnh nhảy
je
LABEL
Nhảy nếu bằng
jne
LABEL
Nhảy nếu không bằng
jg
LABEL
Nhảy nếu lơn hơn
jge
LABEL
Nhảy nếu lớn hơn hoặc bằng
jl
LABEL
Nhảy nếu nhỏ hơn
jle
LABEL
Nhảy nếu nhỏ hơn hoặc bằng
call
LABEL
Gọi thủ tục con
loop
LABEL
Vòng lặp
loope
LABEL
loopz
LABEL
loopnz
LABEL
int
INT_NR
Gây ra ngắt số hiệu INT_NR
Khác
b. Các lệnh hệ thống (system instructions)
Bảng sau liệt kê các lệnh dùng để hỗ trợ hệ điều hành trong việc điều khiển các chức năng của bộ VXL:
Tên lệnh
Chức năng
LGDT
Nạp thanh ghi bảng mô tả toàn cục (GDT register)
SGDT
Lưu thanh ghi bảng mô tả toàn cục (GDT register)
LLDT
Nạp thanh ghi bảng mô tả cục bộ (LDT register)
SLDT
Lưu thanh ghi bảng mô tả cục bộ (LDT register)
LTR
Nạp thanh ghi tác vụ
STR
Nhớ thanh ghi tác vụ
LIDT
Nạp thanh ghi bảng mô tả ngắt (IDT register)
SIDT
Lưu thanh ghi bảng mô tả ngắt (IDT register)
MOV
Nạp và lưu các thanh nghi điều khiển (control registers)
LMSW
Nạp trang thái (16 bit trạng thái)
SMSW
Lưu trạng thái
CLTS
Xóa cờ chuyển tác vụ
ARPL
Điều chỉnh quyền ưu tiên
LAR
Nạp quyền truy cập
LSL
Nạp giới hạn phân đoạn
VERR
Xác nhận đoạn để đọc
VERW
Xác nhận đoạn để ghi
MOV
Nạp và lưu thanh ghi soát lỗi (debug registers)
INVD
Vô hiệu hóa cache, không ghi trở lại.
WBINVD
Vô hiệu hóa cache, ghi trở lại.
INVLPG
Vô hiệu hóa TLB (Translation lookaside buffer)
LOCK (prefix)
Khóa Bus
HLT
Một nửa bộ VXL
RSM
Trở lại từ chế độ quản lý hệ thống (system management mode - SMM)
RDMSR
Mô hình đọc-chỉ định thanh ghi
WRMSR
Mô hình ghi-chỉ định thanh ghi
RDPMC
Đọc bộ đếm giám sát hiệu năng
RDTSC
Đọc bộ đếm time stamp
RDTSCP
Đọc bộ đếm time stamp và ID của bộ VLX
SYSENTER
Fast System Call, chuyển sang nhân flat protected mode với CPL = 0
SYSEXIT
Fast System Call, chuyển sang nhân flat protected mode với CPL = 0
XSAVE
Lưu các cờ mở rộng vào bộ nhớ
XRSTOR
Khôi phục các cờ mở rộng từ bộ nhớ
XGETBV
Đọc trạng thái của một thanh ghi điều khiển mở rộng (extended control registers)
XSETBV
Ghi trạng thái của một thanh ghi điều khiển mở rộng (extended control registers)
c. x87 FPU (Floating Point Unit) instructions
(các lệnh sử dụng đơn vị tính toán dấu chấm động)
Tuy không thuộc nhóm các lệnh cơ bản nhưng đây là một nhóm rất quan trọng có trong tất cả các vi xử lý x86 hiện đại. Nhóm lệnh này hỗ trợ tính toán trên số nguyên, số thực dấu chấm động, xử lý thập phân/nhị phân … Đó là cơ sở cho các tính toán đồ họa và khoa học phức tạp của các hệ thống bên trên.
Định dạng của các toán hạng:
STn
Một thanh ghi của bộ đồng xử lý toán học (80x87)
F
Số thực
D
Số thực (độ chính xác cao)
E
Kiểu số thực mở rộng (không thuộc 3 loại dưới)
I16
word (16-bit)
I32
double word (32-bit)
I64
quad word (64-bit)
FABS
ST0 = |ST0|
FADD src
ST0 += src
STn FD
FADD dest, ST0
dest += STO
STn
FADDP dest [,ST0]
dest += STO
STn
FCHS
ST0 = −ST0
FCOM src
So sánh ST0 và src
STn FD
FCOMP src
So sánh ST0 và src
STn FD
FCOMPP src
So sánh ST0 và ST1
FCOMI src
So sánh vào FLAGS
STn
FCOMIP src
So sánh vào FLAGS
STn
FDIV src
ST0/= src
STn FD
FDIV dest, ST0
dest /=STO
STn
FDIVP dest [,ST0]
dest /=STO
STn
FDIVR src
ST0= src /ST0
STn FD
FDIVR dest, ST0
dest =ST0/dest
STn
FDIVRP dest [,ST0]
dest =ST0/dest
STn
FFREE dest
Đánh dấu rỗng
STn
FIADD src
ST0+= src
I16I32
FICOM src
So sánh ST0 và src
I16I32
FICOMP src
So sánh ST0 và src
I16I32
FIDIV src
STO/= src
I16I32
FIDIVR src
STO= src /ST0
I16I32
FILD src
Đẩy src vào satck
I16I32I64
FIMUL src
ST0*= src
I16I32
FINIT
Khởi tạo bộ đồng xử lý
FIST dest
Lưu ST0
I16I32
FISTP dest
Lưu ST0
I16I32I64
FISUB src
ST0-= src
I16I32
FISUBR src
ST0= src -ST0
I16I32
FLD src
Đẩy src vào satck
STn FDE
FLD1
Đẩy 1.0 vào satck
FLDCW src
Nạp thanh ghi từ điều khiển
I16
FLDPI
Đẩy π vào satck
FLDZ
Đẩy 0.0 vào satck
FLDL2E
Đẩy log2e vào satck
FLDLN2
Đẩy loge2 vào satck
FLDL2T
Đẩy lg 2 vào satck
FLDLG2
Đẩy 0.0 vào satck
FMUL src
ST0*= src
STn FD
FMUL dest, STO
dest *=STO
STn
FMULP dest [,STO]
dest *=STO
STn
FRNDINT
Round ST0
FSCALE
ST0 = ST0 × 2[ST1]
FSQRT
ST0 = ST01/2
FSIN
Sin
FCOS
Cosin
FSINCOS
Sin và cos
FPTAN
Tan
FPATAN
arctan
F2XM1
2x-1
FYL2X
y∗log2x
FYL2XP1
y∗log2(x+1)
FST dest
Lưu ST0
STn FD
FSTP dest
Lưu ST0
STn FDE
FSTCW dest
Lưu thanh ghi từ điều khiển
I16
FSTSW dest
Lưu thanh ghi từ trạng thái
I16AX
FSUB src
ST0-= src
STn FD
FSUB dest, STO
dest -=STO
STn
FSUBP dest [,STO]
dest -=STO
STn
FSUBR src
ST0= src -ST0
STn FD
FSUBR dest, STO
dest =ST0-dest
STn
FSUBP dest [,STO]
dest =ST0-dest
STn
FTST
So sánh ST0 với 0.0
FXCH dest
Hoán đổi ST0 và dest
STn
d. 64-bit mode instructions
Chế độ 64-bit xuất hiện cùng với một vài lệnh mới. Phần lớn chúng hỗ trợ cho việc mở rộng cho không gian địa chỉ lên 64-bit.
CDQE
Chuyển số nguyên từ doubleword (32-bit) sang quadword (64-bit)
CMPSQ
So sánh chuỗi
CMPXCHG16B
So sánh RDX:RAX với m128
LODSQ
Nạp quadword tại địa chỉ (R)SI vào RAX
MOVSQ
Copy (R)SI vào (R)DI
MOVZX (64-bits)
Copy doubleword sang quadword, thêm các bit 0
STOSQ
Lưu RAX tại địa chỉ RDI
SWAPGS
Hoán đổi GS base register value với giá trị ở địa chỉ C0000102H của MSR
SYSCALL
Gọi nhanh các thủ tục hệ thống có mức ưu tiên là 0
SYSRET
Trở lại từ fast system call
III. KẾT LUẬN
Ưu điểm của kiến trúc x86-64
Không gian địa chỉ 64-bit.
Mở rộng các thanh ghi.
Sử dụng tập lệnh quen thuộc.
Khả năng chạy ứng dụng 32-bit trong hệ điều hành 64-bit.
Khả năng chạy hệ điều hành 32-bit.
Nhược điểm của kiến trúc x86-64
Kiến trúc mới không có nhược điểm nào lớn cả. Ta có thể chỉ ra bộ nhớ của chương trình phải tăng thêm một chút vì kích thước lớn hơn của địa chỉ và toán hạng. Nhưng nó cũng không ảnh hướng đến kích thước mã lệnh hay yêu cầu về bộ nhớ chính.
Tuy nhiên có một thực tế là kiến trúc x86-64 không đem lại hiệu quả gì mới ngoại trừ khả năng tương thích ngược với các phần mềm 32-bit và 16-bit. Không có đột phá về mặt hiệu năng. Tuy nhiên theo các thử nghiệm, trung bình, ta có thể mong đợi tăng 5-15% sau khi dịch lại chương trình.
Tài liệu tham khảo:
Intel® 64 and IA-32 Architectures Manuals Volume 1: Basic Achitecture
x86-64 Tour of Intel Manuals – MazeGen - x86asm.net
x86-64TM Technology White Paper – AMD
Thực hiện:
Nguyễn Sơn Hà (nhóm trưởng)
Nguyễn Tiến Thành