Assembly - Thanh ghi
Hoạt động của bộ xử lý chủ yếu liên quan đến xử lý dữ liệu. Dữ liệu này có thể được lưu trữ trong bộ nhớ và được truy cập từ đó. Tuy nhiên, việc đọc dữ liệu từ và lưu trữ dữ liệu vào bộ nhớ làm chậm bộ xử lý, vì nó liên quan đến các quá trình phức tạp gửi yêu cầu dữ liệu qua bus điều khiển và vào bộ lưu trữ bộ nhớ và nhận dữ liệu qua cùng một kênh.
Để tăng tốc hoạt động của bộ xử lý, bộ xử lý bao gồm một số vị trí lưu trữ bộ nhớ trong, được gọi là registers.
Các thanh ghi lưu trữ các phần tử dữ liệu để xử lý mà không cần phải truy cập vào bộ nhớ. Một số thanh ghi hạn chế được tích hợp trong chip xử lý.
Bộ xử lý đăng ký
Có 10 thanh ghi bộ xử lý 32 bit và sáu thanh ghi 16 bit trong kiến trúc IA-32. Các thanh ghi được nhóm thành ba loại:
- Đăng ký chung,
- Thanh ghi điều khiển và
- Thanh ghi phân đoạn.
Các thanh ghi chung được chia thành các nhóm sau:
- Đăng ký dữ liệu,
- Thanh ghi con trỏ, và
- Các thanh ghi chỉ mục.
Đăng ký dữ liệu
Bốn thanh ghi dữ liệu 32-bit được sử dụng cho các phép toán số học, logic và các phép toán khác. Các thanh ghi 32-bit này có thể được sử dụng theo ba cách:
Là thanh ghi dữ liệu 32-bit hoàn chỉnh: EAX, EBX, ECX, EDX.
Các nửa dưới của thanh ghi 32 bit có thể được sử dụng như bốn thanh ghi dữ liệu 16 bit: AX, BX, CX và DX.
Các nửa thấp hơn và cao hơn của bốn thanh ghi 16 bit nói trên có thể được sử dụng như tám thanh ghi dữ liệu 8 bit: AH, AL, BH, BL, CH, CL, DH và DL.
Một số thanh ghi dữ liệu này có công dụng cụ thể trong các phép toán số học.
AX is the primary accumulator; nó được sử dụng trong đầu vào / đầu ra và hầu hết các lệnh số học. Ví dụ, trong phép toán nhân, một toán hạng được lưu trong thanh ghi EAX hoặc AX hoặc AL tùy theo kích thước của toán hạng.
BX is known as the base register, vì nó có thể được sử dụng trong việc lập chỉ mục.
CX is known as the count register, như các thanh ghi ECX, CX lưu trữ số vòng lặp trong các hoạt động lặp lại.
DX is known as the data register. Nó cũng được sử dụng trong các hoạt động đầu vào / đầu ra. Nó cũng được sử dụng với thanh ghi AX cùng với DX cho các phép toán nhân và chia liên quan đến các giá trị lớn.
Thanh ghi con trỏ
Các thanh ghi con trỏ là các thanh ghi EIP, ESP và EBP 32-bit và các phần bên phải 16-bit tương ứng là IP, SP và BP. Có ba loại thanh ghi con trỏ -
Instruction Pointer (IP)- Thanh ghi IP 16 bit lưu địa chỉ offset của lệnh tiếp theo sẽ được thực hiện. IP kết hợp với thanh ghi CS (như CS: IP) cung cấp địa chỉ đầy đủ của lệnh hiện tại trong đoạn mã.
Stack Pointer (SP)- Thanh ghi SP 16 bit cung cấp giá trị offset bên trong ngăn xếp chương trình. SP kết hợp với thanh ghi SS (SS: SP) đề cập đến vị trí hiện tại của dữ liệu hoặc địa chỉ trong ngăn xếp chương trình.
Base Pointer (BP)- Thanh ghi 16-bit BP chủ yếu giúp tham chiếu các biến tham số được truyền cho chương trình con. Địa chỉ trong thanh ghi SS được kết hợp với offset trong BP để lấy vị trí của tham số. BP cũng có thể được kết hợp với DI và SI làm thanh ghi cơ sở để định địa chỉ đặc biệt.
Sổ đăng ký chỉ mục
Thanh ghi chỉ mục 32-bit, ESI và EDI, và các phần ngoài cùng bên phải 16-bit của chúng. SI và DI, được sử dụng để đánh chỉ mục và đôi khi được sử dụng để cộng và trừ. Có hai bộ con trỏ chỉ mục -
Source Index (SI) - Nó được sử dụng làm chỉ mục nguồn cho các hoạt động chuỗi.
Destination Index (DI) - Nó được sử dụng làm chỉ mục đích cho các hoạt động chuỗi.
Đăng ký kiểm soát
Thanh ghi con trỏ lệnh 32-bit và thanh ghi cờ 32-bit kết hợp được coi là thanh ghi điều khiển.
Nhiều lệnh liên quan đến so sánh và tính toán toán học và thay đổi trạng thái của các cờ và một số lệnh có điều kiện khác kiểm tra giá trị của các cờ trạng thái này để đưa luồng điều khiển đến vị trí khác.
Các bit cờ phổ biến là:
Overflow Flag (OF) - Nó chỉ ra sự tràn của một bit bậc cao (bit ngoài cùng bên trái) của dữ liệu sau một phép toán số học có dấu.
Direction Flag (DF)- Nó xác định hướng trái hoặc phải để di chuyển hoặc so sánh dữ liệu chuỗi. Khi giá trị DF là 0, hoạt động chuỗi sẽ có hướng từ trái sang phải và khi giá trị được đặt thành 1, hoạt động chuỗi sẽ có hướng từ phải sang trái.
Interrupt Flag (IF)- Nó xác định xem các ngắt bên ngoài như nhập bàn phím, v.v., có được bỏ qua hoặc xử lý hay không. Nó vô hiệu hóa ngắt bên ngoài khi giá trị là 0 và cho phép ngắt khi được đặt thành 1.
Trap Flag (TF)- Nó cho phép thiết lập hoạt động của bộ xử lý ở chế độ một bước. Chương trình DEBUG mà chúng tôi đã sử dụng đặt cờ bẫy, vì vậy chúng tôi có thể thực hiện từng bước một trong lệnh.
Sign Flag (SF)- Nó cho thấy dấu hiệu của kết quả của một phép tính số học. Cờ này được đặt theo dấu hiệu của một mục dữ liệu sau phép tính số học. Dấu hiệu được biểu thị bằng bậc cao của bit ngoài cùng bên trái. Kết quả dương tính xóa giá trị của SF thành 0 và kết quả âm tính đặt nó thành 1.
Zero Flag (ZF)- Nó cho biết kết quả của một phép toán số học hoặc phép so sánh. Kết quả khác không xóa cờ 0 thành 0 và kết quả 0 đặt nó thành 1.
Auxiliary Carry Flag (AF)- Nó chứa giá trị mang từ bit 3 đến bit 4 theo một phép toán số học; dùng cho chuyên ngành số học. AF được đặt khi phép toán số học 1 byte gây ra chuyển từ bit 3 sang bit 4.
Parity Flag (PF)- Nó cho biết tổng số bit 1 trong kết quả thu được từ một phép toán số học. Số bit 1 chẵn xóa cờ chẵn lẻ thành 0 và số bit lẻ 1 đặt cờ chẵn lẻ thành 1.
Carry Flag (CF)- Nó chứa giá trị mang 0 hoặc 1 từ một bit bậc cao (ngoài cùng bên trái) sau một phép toán số học. Nó cũng lưu trữ nội dung của bit cuối cùng của hoạt động thay đổi hoặc xoay .
Bảng sau chỉ ra vị trí của các bit cờ trong thanh ghi Cờ 16 bit:
Cờ: | O | D | Tôi | T | S | Z | A | P | C | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit không: | 15 | 14 | 13 | 12 | 11 | 10 | 9 | số 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Đăng ký phân đoạn
Phân đoạn là các khu vực cụ thể được xác định trong một chương trình để chứa dữ liệu, mã và ngăn xếp. Có ba phân đoạn chính -
Code Segment- Nó chứa tất cả các lệnh được thực thi. Thanh ghi đoạn mã 16 bit hoặc thanh ghi CS lưu trữ địa chỉ bắt đầu của đoạn mã.
Data Segment- Nó chứa dữ liệu, hằng số và vùng làm việc. Thanh ghi Phân đoạn dữ liệu 16 bit hoặc thanh ghi DS lưu trữ địa chỉ bắt đầu của phân đoạn dữ liệu.
Stack Segment- Nó chứa dữ liệu và địa chỉ trả về của các thủ tục hoặc chương trình con. Nó được thực hiện như một cấu trúc dữ liệu 'ngăn xếp'. Thanh ghi Phân đoạn ngăn xếp hoặc thanh ghi SS lưu trữ địa chỉ bắt đầu của ngăn xếp.
Ngoài các thanh ghi DS, CS và SS, còn có các thanh ghi phân đoạn bổ sung khác - ES (phân đoạn phụ), FS và GS, cung cấp các phân đoạn bổ sung để lưu trữ dữ liệu.
Trong lập trình hợp ngữ, một chương trình cần truy cập các vị trí bộ nhớ. Tất cả các vị trí bộ nhớ trong một phân đoạn đều có liên quan đến địa chỉ bắt đầu của phân đoạn. Một phân đoạn bắt đầu bằng địa chỉ chia đều cho 16 hoặc thập lục phân 10. Vì vậy, chữ số hex ngoài cùng bên phải trong tất cả các địa chỉ bộ nhớ như vậy là 0, thường không được lưu trữ trong thanh ghi phân đoạn.
Thanh ghi phân đoạn lưu trữ các địa chỉ bắt đầu của một phân đoạn. Để có được vị trí chính xác của dữ liệu hoặc lệnh trong một đoạn, cần phải có giá trị offset (hoặc độ dời). Để tham chiếu bất kỳ vị trí bộ nhớ nào trong một phân đoạn, bộ xử lý kết hợp địa chỉ phân đoạn trong thanh ghi phân đoạn với giá trị offset của vị trí.
Thí dụ
Nhìn vào chương trình đơn giản sau để hiểu việc sử dụng các thanh ghi trong lập trình hợp ngữ. Chương trình này hiển thị 9 ngôi sao trên màn hình cùng với một thông báo đơn giản -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Displaying 9 stars
*********