Kiến trúc tập lệnh x86-64

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.

docx47 trang | Chia sẻ: vietpd | Lượt xem: 3713 | Lượt tải: 3download
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