2012-02-16 21 views

Trả lời

24

AT & T cú pháp chia tách movzx Intel instruction mnemonic thành các bản ghi nhớ khác nhau cho các kích thước nguồn khác nhau (movzb so với movzw). Trong cú pháp của Intel, đó là:

movzx eax, byte ptr [eax+ecx+1] 

tức là tải byte từ bộ nhớ tại eax + ecx + 1 và không mở rộng đến toàn bộ thanh ghi.

BTW, hầu hết các công cụ GNU giờ đây có tùy chọn chuyển đổi hoặc cấu hình để thích cú pháp Intel hơn. (Chẳng hạn như objdump -Mintel hoặc gcc -S -masm=intel, mặc dù sau này ảnh hưởng đến cú pháp được sử dụng khi biên dịch nội tuyến). Tôi chắc chắn sẽ khuyên bạn nên nhìn vào nó, nếu bạn không làm AT & T lắp ráp cho cuộc sống. Xem thêm tag wiki để biết thêm tài liệu và hướng dẫn.

+0

Hoàn toàn chính xác. –

+0

Đã hiểu: điều này sẽ tải byte từ địa chỉ '% eax +% ecx + 1' và mở rộng nó bằng số 0 đứng đầu. Cảm ơn rất nhiều! –

13

Ví dụ:

mov $0x, %eax 
mov $1, %bl 
movzbl %bl, %eax 
# %eax == 0000 0001 

mov $0x, %eax 
mov $-1, %bl 
movzbl %bl, %eax 
# %eax == 0000 00FF 

Các ghi nhớ là:

  • MOV
  • Zero, mở rộng
  • Byte (8-bit)
  • Long (32-bit)

Ngoài ra còn có phiên bản dành cho các kích cỡ khác:

  • movzbw: Byte (8-bit) sang Word (16-bit)
  • movzwl: Word (16-bit) để Long (32-bit)

Giống như hầu hết các hướng dẫn GAS, bạn có thể bỏ qua các nhân vật kích thước cuối cùng khi giao dịch với thanh ghi:

movzb %bl, %eax 

nhưng tôi không thể hiểu tại sao chúng ta không thể bỏ qua trước khi Lett cuối cùng er, ví dụ: sau thất bại:

movz %bl, %eax 

Tại sao không chỉ suy ra nó từ kích thước của toán hạng khi họ ghi như đối với mov và cú pháp của Intel?

Và nếu bạn sử dụng thanh ghi kích thước sai, nó thất bại trong việc biên dịch ví dụ .:

movzb %ax, %eax 

Runnable Intel example with assertions on GitHub.

+0

@downvoters vui lòng giải thích :-) –

+0

Nếu bạn xem [opcodes] (http://www.felixcloutier.com/x86/MOVZX.html), "kích thước toán hạng" điều khiển kích thước đích nhưng có các mã opcodes khác nhau cho các kích cỡ nguồn khác nhau. Vì vậy, nó có ý nghĩa đối với khí để xử lý 'movzb' như một lệnh riêng biệt từ' movzw'. (Đối với phần mở rộng đăng nhập, AMD thậm chí còn thêm một chú thích cú pháp mới của Intel cho 'movsxd r64, r/m32' thay vì tiếp tục quá tải' movsx'. IDK tại sao.) –

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