2012-11-01 53 views
7

Tôi đang cố gắng hiểu hành vi của mã PIN của .16. Từ hướng dẫn sử dụng, có vẻ như trong phần 16 bit, đối với các toán hạng hoặc hướng dẫn 32 bit, một tiền tố ghi đè toán hạng 66H sẽ được tạo ra cho mã hóa lệnh. Điều đó có nghĩa làTiền tố kích thước vận hành ở chế độ 16 bit

.code16 
movw %eax, %ebx 

là hợp pháp ở chế độ như vậy không? Sau đó, mã không thể chạy trên bộ vi xử lý 16 bit?

+0

Điều này không hợp pháp vì hậu tố 'w' cho biết di chuyển 2 byte. 'movl% eax,% eax' là hợp pháp. – fuz

Trả lời

10

Đây là các hướng dẫn pháp lý cho 80386+. Bắt đầu với 80386, chúng ta có thể sử dụng các tiền tố operandsize và addressizeize-override. Các tiền tố đó có thể được sử dụng kết hợp với chế độ địa chỉ 16 bit và với chế độ địa chỉ 32 bit. Bổ sung nó có thể được sử dụng với các địa chỉ thực sự và với chế độ bảo vệ và chế độ ảo 86. Các tiền tố này đảo ngược toán hạng mặc định và/hoặc địa chỉ hóa cho một lệnh trong mã hóa. Toán hạng mặc định và địa chỉ được xác định bằng cờ D trong bộ mô tả đoạn mã (hoặc nếu không có GDT/LDT, thì chúng ta trở thành mã địa chỉ 16 bit sau khi quá trình POST của bios được thực hiện.)

Với địa chỉ 16 bit, chúng ta phải thêm các tiền tố đó, nếu chúng ta muốn sử dụng các toán hạng 32 bit và/hoặc các địa chỉ 32 bit. Nếu không có các tiền tố đó, chúng ta chỉ có thể sử dụng các địa chỉ/toán hạng 16 bit trong mã địa chỉ 16 bit.

Với địa chỉ 32 bit, chúng tôi phải loại bỏ các tiền tố đó khỏi mã của chúng tôi, nếu chúng tôi muốn sử dụng các toán hạng 32 bit và/hoặc địa chỉ 32 bit. Và nếu chúng ta thêm các tiền tố đó vào mã của chúng ta, thì chúng ta có thể sử dụng các địa chỉ/toán hạng 16 bit trong mã địa chỉ 32 bit.

Blockquote Intel:

Chỉ thị tiền tố có thể được sử dụng để ghi đè các toán hạng mặc định kích thước và địa chỉ kích thước của một đoạn mã. Các tiền tố này có thể được sử dụng trong chế độ địa chỉ thực cũng như ở chế độ được bảo vệ và chế độ ảo 8086. Tiền tố kích thước của toán hạng hoặc kích thước địa chỉ chỉ thay đổi kích thước cho thời lượng của lệnh.

Hai tiền tố hướng dẫn sau đây cho phép trộn các hoạt động 32-bit và 16-bit trong một phân khúc: • Các toán hạng có kích thước prefix (66H) • Địa chỉ kích thước prefix (67H)

Những cụm từ đảo ngược kích thước mặc định được chọn bởi cờ D trong bộ mô tả đoạn mã. Ví dụ, bộ xử lý có thể giải thích lệnh (MOV mem, reg) theo bất kỳ cách nào trong số bốn cách: • Trong đoạn mã 32 bit: —Mua 32 bit từ đăng ký 32 bit sang bộ nhớ bằng cách sử dụng hiệu quả 32 bit địa chỉ nhà. —Nếu trước tiền tố kích cỡ toán hạng, di chuyển 16 bit từ thanh ghi 16 bit sang bộ nhớ bằng địa chỉ hiệu dụng 32 bit. —Nếu trước tiền tố có kích thước địa chỉ, di chuyển 32 bit từ thanh ghi 32 bit sang bộ nhớ bằng địa chỉ có hiệu lực 16 bit. —Nếu trước cả tiền tố có kích cỡ địa chỉ và tiền tố kích cỡ phép toán, di chuyển 16 bit từ thanh ghi 16 bit sang bộ nhớ bằng địa chỉ hiệu dụng 16 bit.

• Trong đoạn mã 16 bit: —Giả 16 bit từ thanh ghi 16 bit sang bộ nhớ bằng địa chỉ hiệu dụng 16 bit. —Nếu trước tiền tố kích cỡ toán hạng, di chuyển 32 bit từ thanh ghi 32 bit sang bộ nhớ bằng địa chỉ có hiệu lực 16 bit. —Nếu trước tiền tố kích thước địa chỉ, di chuyển 16 bit từ thanh ghi 16 bit sang bộ nhớ bằng địa chỉ hiệu dụng 32 bit. —Nếu trước cả tiền tố có kích cỡ địa chỉ và tiền tố có kích cỡ phép toán, di chuyển 32 bit từ thanh ghi 32 bit sang bộ nhớ bằng địa chỉ hiệu dụng 32 bit.

Ví dụ trước cho thấy rằng bất kỳ lệnh nào cũng có thể tạo ra bất kỳ tổ hợp kích thước và kích thước địa chỉ nào cho dù lệnh có nằm trong phân đoạn 16 hoặc 32 bit hay không. Lựa chọn mặc định 16 hoặc 32 bit cho đoạn mã thường dựa trên các tiêu chí sau: • Hiệu suất - Luôn sử dụng phân đoạn mã 32 bit khi có thể. Chúng chạy nhanh hơn các phân đoạn mã 16 bit trên bộ xử lý gia đình P6 và nhanh hơn một chút so với các bộ vi xử lý IA-32 trước đó. • Hệ điều hành mà đoạn mã sẽ chạy trên - Nếu hệ điều hành là hệ điều hành 16 bit, nó có thể không hỗ trợ các mô-đun chương trình 32 bit. • Chế độ hoạt động - Nếu phân đoạn mã đang được thiết kế để chạy ở chế độ địa chỉ thực, chế độ ảo 8086 hoặc SMM, nó phải là đoạn mã 16 bit. • Khả năng tương thích ngược với các bộ xử lý IA-32 trước đó - Nếu đoạn mã phải có khả năng chạy trên bộ vi xử lý Intel 8086 hoặc Intel 286, nó phải là một đoạn mã 16 bit.

Cờ D trong bộ mô tả đoạn mã xác định kích thước và kích thước của toán hạng mặc định cho hướng dẫn của đoạn mã. (Trong chế độ địa chỉ thực và chế độ ảo 8086, không sử dụng mô tả phân đoạn, mặc định là 16 bit.) Đoạn mã với bộ cờ D là đoạn 32 bit; một đoạn mã với cờ D rõ ràng là một đoạn 16 bit.

Đoạn mã có thể thực thi. Cờ được gọi là cờ D và nó cho biết độ dài mặc định cho các địa chỉ và toán hạng hiệu quả được tham chiếu bởi các lệnh trong phân đoạn. Nếu cờ được đặt, các địa chỉ 32 bit và các toán hạng 32 bit hoặc 8 bit được giả định; nếu nó rõ ràng, các địa chỉ 16 bit và các toán hạng 16 bit hoặc 8 bit được giả sử. Tiền tố lệnh 66H có thể được sử dụng để chọn kích thước toán hạng khác với mặc định và tiền tố 67H có thể được sử dụng chọn kích thước địa chỉ khác với mặc định.

Tiền tố toán hạng 32 bit có thể được sử dụng trong các chương trình chế độ địa chỉ thực để thực thi các dạng hướng dẫn 32 bit. Tiền tố này cũng cho phép các chương trình chế độ địa chỉ thực sử dụng thanh ghi đa năng 32 bit của bộ vi xử lý. Tiền tố địa chỉ 32 bit có thể được sử dụng trong các chương trình chế độ địa chỉ thực, cho phép bù đắp 32 bit.

Bộ xử lý IA-32 bắt đầu bằng bộ xử lý Intel386 có thể tạo ra bù đắp 32 bit bằng tiền tố ghi đè địa chỉ; tuy nhiên, trong chế độ địa chỉ thực, giá trị của bù đắp 32 bit có thể không vượt quá FFFFH mà không gây ra ngoại lệ.

Cách sử dụng bộ ghép: Nếu phân đoạn mã sẽ chạy trong chế độ địa chỉ thực được xác định, nó phải được đặt thành thuộc tính USE 16. Nếu toán hạng 32 bit được sử dụng trong một lệnh trong đoạn mã này (ví dụ, MOV EAX, EBX), trình biên dịch sẽ tự động tạo tiền tố toán hạng cho lệnh buộc bộ vi xử lý thực thi thao tác 32 bit, mặc dù thuộc tính đoạn mã mặc định là 16 bit.

Tiền tố toán hạng 32 bit cho phép chương trình chế độ địa chỉ thực sử dụng thanh ghi đa năng 32 bit (EAX, EBX, ECX, EDX, ESP, EBP, ESI và EDI).

Khi di chuyển dữ liệu ở chế độ 32 bit giữa thanh ghi phân đoạn và đăng ký mục đích chung, bộ xử lý Pentium Pro không yêu cầu sử dụng tiền tố kích thước 16 bit; Tuy nhiên, , một số trình lắp ráp yêu cầu tiền tố này. Bộ vi xử lý giả định rằng 16 bit quan trọng nhất là của thanh ghi đa năng là đích hoặc toán hạng nguồn. Khi di chuyển giá trị từ bộ chọn phân đoạn đến thanh ghi 32 bit, bộ xử lý sẽ lấp đầy hai byte thứ tự cao là đăng ký bằng số không.

Blockquote AMD:

3.3.2. Địa chỉ 32-bit so với địa chỉ 16 bit và kích thước vận hành Bộ xử lý có thể được cấu hình cho địa chỉ 32 bit hoặc 16 bit và kích cỡ toán hạng. Với kích thước địa chỉ và toán hạng 32 bit , địa chỉ tuyến tính tối đa hoặc độ lệch phân đoạn là FFFFFFFFH (2^32-1), và kích thước toán hạng thường là 8 bit hoặc 32 bit. Với địa chỉ 16 bit và kích thước toán hạng, địa chỉ tuyến tính tối đa hoặc bù trừ đoạn là FFFFH (2^16-1) và kích thước toán hạng thường là 8 bit hoặc 16 bit. Khi sử dụng địa chỉ 32 bit, địa chỉ lôgic (hoặc con trỏ xa) bao gồm một đoạn 16 bit và bộ bù 32 bit; khi sử dụng địa chỉ 16 bit, nó bao gồm bộ chọn đoạn 16 bit và độ lệch 16 bit. Tiền tố hướng dẫn cho phép ghi đè tạm thời các địa chỉ và/hoặc kích thước toán hạng mặc định từ trong một chương trình. Khi hoạt động ở chế độ được bảo vệ, bộ mô tả phân đoạn cho đoạn mã hiện đang thực hiện xác định địa chỉ mặc định và kích thước toán hạng. Bộ mô tả phân đoạn là dữ liệu hệ thống cấu trúc thường không hiển thị với mã ứng dụng. Chỉ thị của trình lắp ráp cho phép kích thước địa chỉ và toán hạng mặc định được chọn cho một chương trình. Công cụ lắp ráp và các công cụ khác sau đó đặt lên bộ mô tả phân đoạn cho đoạn mã phù hợp. Khi hoạt động ở chế độ địa chỉ thực, kích thước địa chỉ và toán hạng mặc định là 16 bit. An ghi đè kích thước địa chỉ có thể được sử dụng trong chế độ địa chỉ thực để bật địa chỉ 32 bit; tuy nhiên, địa chỉ tuyến tính 32 bit tối đa cho phép cho phép vẫn là 000FFFFFH (2^20-1).

3.6. OPERAND-SIZE AND ADDRESS-SIZE ATTRIBUTES Khi bộ vi xử lý đang thực thi ở chế độ được bảo vệ, mỗi đoạn mã có thuộc tính kích thước thuộc tính và kích thước thuộc tính kích thước là thuộc tính mặc định là . Các thuộc tính này được chọn với cờ D (kích thước mặc định) trong bộ mô tả phân đoạn cho đoạn mã (xem Chương 3, Bộ nhớ chế độ được bảo vệ Quản lý, trong Sách hướng dẫn dành cho nhà phát triển phần mềm kiến ​​trúc Intel, Tập 3). Khi cờ D được đặt, các thuộc tính kích thước địa chỉ và kích thước địa chỉ 32 bit được chọn; khi cờ rõ ràng, thuộc tính kích thước 16 bit được chọn. Khi bộ xử lý đang thực thi ở chế độ địa chỉ thực, chế độ ảo 8086 hoặc SMM (Chế độ quản lý hệ thống), thuộc tính kích thước và kích thước địa chỉ mặc định luôn là 16 bit. Thuộc tính kích thước toán hạng sẽ chọn kích thước của toán hạng mà lệnh hoạt động. Khi thuộc tính kích thước16 bit có hiệu lực, các toán hạng thường có thể là 8 bit hoặc 16 bit và khi thuộc tính kích thước 32 bit có hiệu lực, các toán hạng thường có thể là 8 bit hoặc 32 bit. Thuộc tính kích thước địa chỉ chọn kích thước của địa chỉ được sử dụng để giải quyết bộ nhớ: 16 bit hoặc 32 bit. Khi thuộc tính kích thước địa chỉ 16 bit có hiệu lực, các bù trừ phân đoạn và chuyển vị là 16 bit. Hạn chế này giới hạn kích thước của một phân đoạn có thể được gửi đến 64 KBytes. Khi thuộc tính kích thước địa chỉ32 bit có hiệu lực, bù trừ phân đoạn và chuyển vị là 32 bit, cho phép phân đoạn tối đa 4 GByte. Thuộc tính kích thước và thuộc tính kích thước địa chỉ mặc định có thể được ghi đè cho lệnh cụ thể bằng cách thêm tiền tố kích thước và/hoặc kích thước địa chỉ vào lệnh (xem “Tiền tố hướng dẫn” trong Chương 2 của Sổ tay Nhà phát triển Phần mềm Kiến trúc Intel, Tập 3).Hiệu ứng của tiền tố này chỉ áp dụng cho lệnh mà nó được gắn vào. Bảng 3-1 cho thấy kích thước và kích thước địa chỉ hoạt động hiệu quả (khi thực hiện ở chế độ được bảo vệ) tùy thuộc vào các thiết lập của cờ D và các tiền tố kích cỡ của toán hạng và địa chỉ.

Dirk

Các vấn đề liên quan