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 choMOV moffs8, AL
08
là bộ nhớ tự bù đắp, có kích thước 1 byte00 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?
Tôi lấy thuộc tính kích thước địa chỉ của lệnh ở đâu? – ForceBru
@ForceBru tùy thuộc vào chế độ và sự hiện diện của tiền tố ghi đè địa chỉ – harold
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