Mã hóa hướng dẫn đơn giản

Oct 07 2020

Hãy xem hướng dẫn lắp ráp sau:

add    %cl,%bl

Điều này được mã hóa dưới dạng:, 00 cbhoặc 00000000 11001011ở dạng nhị phân. Đưa cbvào các trường bit ModR / M, có vẻ như:

  1   1   0   0   1   0  1   1
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |    r/m    |
+---+---+---+---+---+---+---+---+

Và, nhà trọ tra cứu trường đăng ký ở đây, chúng tôi nhận được:

  • mod: 11(Đăng ký chế độ địa chỉ)
  • reg: 001(thanh ghi cl)
  • r / m: 011(thanh ghi bl)

Và, tôi tin rằng đó 000000dslà addhướng dẫn, và d=s=0vì chúng đều là các thanh ghi. Đó có phải là cách hiểu đúng về cách mã hóa lệnh này không? Ngoài ra, đối với lược đồ 'mã hóa đầy đủ', điều sau có chính xác không (tính bằng byte không phải bit):

[empty]         0x0         0b11001011     [empty]        [empty]          [empty]
_ _ _ _        _ _             _              _           _ _ _ _          _ _ _ _
Prefix      Instruction    Mod-reg-r/m      Scale       displacement      immediate

Có điều gì tôi còn thiếu ở đây trong nỗ lực 'giải mã' hướng dẫn không?

Trả lời

2 PeterCordes Oct 08 2020 at 04:14

Vâng, có vẻ đúng.

Các mô hình chung (để được hướng dẫn "di sản" ALU rằng ngày trở lại 8086) để mã hóa op r/m, rvs op r, r/m, và 8-bit vs 16/32 chút không sử dụng thấp 2 bit của byte opcode trong một mô hình bình thường, nhưng không có nhu cầu để dựa vào đó.

Intel ghi lại đầy đủ chính xác những gì đang xảy ra cho từng mã hóa của từng lệnh trong sách hướng dẫn tập 2 của họ. addVí dụ: xem cột Op / En và bảng Mã hóa toán hạng . (Xem thêmhttps://ref.x86asm.net/coder64.htmmà cũng chỉ định toán hạng nào là toán hạng cho mọi opcode). Cả hai đều cho bạn biết mã opcodes nào sử dụng một byte ModRM và mã nào không.

Tất nhiên, chúng sử dụng thứ tự cú pháp Intel. Bạn đang làm cho cuộc sống của mình trở nên phức tạp hơn bằng cách cố gắng làm theo các sách hướng dẫn và hướng dẫn trong khi sử dụng cú pháp AT&T đảo ngược thứ tự của danh sách toán hạng so với hướng dẫn sử dụng Intel và AMD.

Ví dụ: 00 /rđược liệt kê dưới dạng MRmã hóa toán hạng, từ bảng chúng ta có thể thấy toán hạng 1 = ModRM:r/m (r, w), vì vậy nó được đọc và ghi, và được mã hóa bởi r/mtrường. toán hạng 2 = ModRM:reg (r), vì vậy nó là nguồn chỉ đọc được mã hóa bởi regtrường.

Thực tế thú vị: 00 00là add [rax], al, hoặc AT&Tadd %al, (%rax)

Lưu ý rằng bạn có thể yêu cầu GAS chọn một trong hai kiểu mã hóa: sự khác biệt về mã quang x86 XOR

{load}  add    %cl,%bl        # 02 d9
{store} add    %cl,%bl        # 00 cb

Xem thêm Sự khác biệt giữa MOV r / m8, r8 và MOV r8, r / m8