2013-02-05 40 views
25

Số byte tối đa mà lệnh hoàn chỉnh yêu cầu trong mã asm x64 là bao nhiêu?x86_64 ASM - byte tối đa cho lệnh?

Cái gì đó như một bước nhảy đến địa chỉ có thể chiếm tới 9 byte Tôi cho rằng: FF 00 00 00 00 11 12 3F 1F nhưng tôi không biết nếu đó là số lượng tối đa byte một hướng dẫn x64 có thể sử dụng

+8

[Các hướng dẫn dài nhất có thể trên x86 là 15 byte] (http://en.wikipedia.org/wiki/Instruction_set) –

+1

Lưu ý rằng, trong khi nó có thể xây dựng một lệnh duy nhất phải dài hơn 15 byte (bằng cách sử dụng một loạt các tiền tố), giao diện bộ giải mã lệnh x86 sẽ bị nghẹt thở trên nó. 15 byte là một giới hạn cứng. – duskwuff

Trả lời

30

Tập lệnh x86 (16, 32 hoặc 64 bit, tất cả các biến thể/chế độ) đảm bảo/yêu cầu chỉ dẫn tối đa là 15 byte. Bất cứ điều gì ngoài đó sẽ cung cấp cho một "opcode không hợp lệ". Bạn không thể đạt được điều đó mà không cần sử dụng tiền tố dư thừa (ví dụ: nhiều tiền tố 0x66 hoặc 0x67).

Lệnh duy nhất thực sự lấy 64 bit làm mục dữ liệu là hằng số tải để đăng ký (cú pháp Intel: mov reg, 12345678ABCDEF00h, tại cú pháp & t: movabs $12345678ABCDEF00, %reg) - vì vậy nếu bạn muốn nhảy hơn 31 bit về phía trước/sau , nó sẽ là một di chuyển của vị trí mục tiêu vào một đăng ký, và sau đó gọi/nhảy vào sổ đăng ký. Sử dụng ngay lập tức 32-bit và chuyển vị (trong nhảy tương đối và chế độ địa chỉ) tiết kiệm bốn byte trên nhiều hướng dẫn trong chế độ 64-bit.

+3

Cũng có các dạng 'mov' có thể lấy địa chỉ 64 bit đầy đủ, những địa chỉ có' ​​moffs' là toán hạng. Nhưng chúng chỉ có thể di chuyển đến/từ bộ tích lũy, do đó độ dài hữu ích tối đa cho chúng vẫn chỉ là 11 byte (8 cho địa chỉ, 1 cho opcode, 1 cho kích thước toán hạng 64 hoặc 16 bit và 1 cho một fs hoặc gs segment override). – ughoavgfhw

15

Từ Manual Intel® 64 và IA-32 Kiến trúc phần mềm phát triển:

2.3.11 AVX hướng dẫn chiều dài

Độ dài tối đa của một hướng dẫn r Intel 64 và IA-32 emains 15 bytes.

Bạn có thể tạo hướng dẫn sẽ mã hóa thành hơn 15 byte, nhưng hướng dẫn như vậy sẽ là bất hợp pháp và có thể sẽ không thực thi.

18

Câu hỏi là, hướng dẫn dài nhất có thể có trong tập lệnh x86 là gì?

Trả lời: bạn có thể tạo hướng dẫn x86 hợp lệ với số lượng byte vô hạn !

Đúng vậy, bạn có thể điền toàn bộ hình ảnh ROM 64K với một lệnh hợp lệ duy nhất. Để cụ thể hơn, không có giới hạn về độ dài của 8086 hướng dẫn. Mát mẻ! Thật không may, phiên bản hiện đại i386 ném một lỗi bảo vệ chung khi cố gắng giải mã các lệnh dài hơn 15 byte.

Vì vậy, lệnh 8086 vô hạn nhưng có giá trị như thế nào? Kinda nhàm chán, thực sự. Bạn chỉ có thể tạo một lệnh dài vô hạn bằng cách sử dụng các tiền tố dư thừa ở phía trước trên các mã opcodes. Tiền tố hướng dẫn là các byte được định trước vào đầu của một lệnh có thể sửa đổi kích thước địa chỉ mặc định, kích thước dữ liệu hoặc các thanh ghi phân đoạn được sử dụng bởi một lệnh.

Ví dụ, bạn có thể hướng dẫn tìm kiếm vô thưởng vô phạt:

89 E5    mov %sp,%bp 

Và biến nó thành một hướng dẫn rất dài:

66 66 66 66 … 66 66 89 E5    mov %sp,%bp 

Bây giờ đó chỉ là ác.

https://web.archive.org/web/20131109063453/https://www.onlinedisassembler.com/blog/?p=23


Một hướng dẫn dài mà không lặp lại tiền tố

Trong một số trường hợp nó có thể mã hóa các hướng dẫn có giá trị vượt quá giới hạn độ dài 15 byte truyền thống. Ví dụ:

; 16-bit mode 
    F2 F0 36 66 67 81 84 24 disp32 imm32 = xaquire lock add [ss:esp*1+disp32],imm32 
    F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32 

    ; 16-bit mode 
    36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 10 84 24 disp32 imm32 = bextr eax,[ss:esp*1+disp32],imm32 

    ; 64-bit mode 
    64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 10 84 18 disp32 imm32 = bextr rax,[fs:eax+ebx+disp32],imm32 

http://www.sandpile.org/x86/opc_enc.htm

+0

Sự cố với câu trả lời này là gì? Tại sao bỏ phiếu xuống –

+0

Tập lệnh không áp đặt giới hạn về độ dài lệnh. Giới hạn được xác định bởi bộ giải mã lệnh –

+4

ISA cho 386 và sau đó áp đặt giới hạn 15 byte. 286 áp đặt giới hạn 10 byte. Điều "chiều dài" vô hạn chỉ hoạt động trên 8086, không phải x86 (hoặc x86-64), thậm chí không phải là một CPU x86 hiện đại ở chế độ thực. Phần thứ hai của câu trả lời của bạn nên nói "không hợp lệ". Bạn đã để lại phần cuối của chú thích đó, có nghĩa là ** Người dùng có thể tránh được những trường hợp này (và ngoại lệ #GP). ** –

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