2017-09-18 14 views
5

Từ Sách hướng dẫn dành cho nhà phát triển phần mềm Intel (được gọi là ISDM trong bài đăng này) và x86 Instruction Set Reference (mà tôi cho là chỉ là bản sao cũ), chúng tôi biết rằng hướng dẫn mov có thể di chuyển dữ liệu từ eax/ax/al sang độ lệch bộ nhớ và ngược lại.NASM và sự nhầm lẫn bù đắp bộ nhớ 8 bit

Ví dụ: mov moffs8, al di chuyển nội dung của số đăng ký al sang một số 8-bit bộ nhớ bù trừ moffs8.

Bây giờ, moffs8 là gì? Trích dẫn ISDM (3.1.1.3):

moffs8, moffs16, moffs32, moffs64 - Một biến bộ nhớ đơn giản (bộ nhớ bù đắp) kiểu byte, word, hoặc doubleword được sử dụng bởi một số biến thể của MOV chỉ dẫn. Địa chỉ thực tế được đưa ra bởi một bù đắp đơn giản liên quan đến cơ sở phân đoạn. Không có ModR/M byte nào được sử dụng trong lệnh. Số được hiển thị với moffs cho biết kích thước của nó là, được xác định bởi thuộc tính kích thước địa chỉ của lệnh.

tôi nhấn mạnh câu nói rằng moffs8 là loại byte và là 8 bit trong kích thước.

Tôi là người mới bắt đầu trong hội đồng, vì vậy, ngay sau khi đọc xong, tôi bắt đầu chơi xung quanh với lệnh mov moffs8, al sử dụng NASM. Dưới đây là đoạn code tôi đã viết:

; File name: mov_8_bit_al.s 
USE32 

section .text 
    mov BYTE [data], al 

section .bss 
    data resb 2 

Đây là những gì nasm -f bin mov_8_bit_al.s sản xuất (trong hex):

A2 08 00 00 00 

Dưới đây là làm thế nào tôi hiểu được điều này:

  • A2 là opcode cho MOV moffs8, AL
  • 08 là bộ nhớ tự bù đắp, có kích thước 1 byte
  • 00 00 00 là một số rác

Dường như 08 00 00 00 được bộ nhớ bù đắp, nhưng trong trường hợp này, đó là một moffs32, không moffs8! Vì vậy, CPU sẽ chỉ đọc một byte khi thực hiện A2 và xử lý 00 làm hướng dẫn ADD hoặc một thứ khác không được dự định.

Hiện tại, dường như với tôi rằng NASM đang tạo mã byte không hợp lệ ở đây, nhưng tôi đoán đó là tôi đã hiểu nhầm điều gì đó ... Có lẽ NASM không tuân theo IDSM? Nếu vậy, mã của nó sẽ không được thực hiện đúng trên CPU Intel, vì vậy nó phải được làm theo nó!

Bạn có thể giải thích tôi đã sai ở đâu không?

Trả lời

7

Hậu tố kích thước sau moffs thực sự đề cập đến kích thước toán hạng, chứ không phải kích thước của chính địa chỉ đó. Điều này phản ánh ý nghĩa của hậu tố kích thước sau r/m.

Sổ tay thực sự nói như vậy trong một lưu ý:

GHI CHÚ:
* Các moffs8, moffs16, moffs32 và moffs64 toán hạng chỉ định một đơn giản ô liên quan đến cơ sở phân đoạn, nơi 8, 16, 32 và 64 tham chiếu đến kích thước của dữ liệu. Thuộc tính kích thước địa chỉ của lệnh xác định kích thước của offset, 16, 32 hoặc 64 bit.

+0

Tôi lấy thuộc tính kích thước địa chỉ của lệnh ở đâu? – ForceBru

+0

@ForceBru tùy thuộc vào chế độ và sự hiện diện của tiền tố ghi đè địa chỉ – harold

+0

ah, vì vậy, nếu tôi đang chạy ở chế độ 32 bit và không có tiền tố '0x67', địa chỉ sẽ chiếm 4 byte, phải không? – ForceBru

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