2011-11-15 23 views
10

Tôi làm theo hướng dẫn này như một bước đột phá đầu tiên vào phát triển bootloader/OS cho x86 sử dụng NASM:x86 NASM 'org' nghĩa

http://joelgompert.com/OS/TableOfContents.htm

Và tôi trên Lesson 4, mà là làm cho tôi bootloader in chuỗi "Hello, world". Tôi không hiểu ý nghĩa của lệnh org (chỉ thị?).

Như tôi đã hiểu, org xác định nơi chương trình đang được thực thi được tải vào bộ nhớ. Điều này là cần thiết khi sử dụng bất kỳ loại nhãn hoặc địa chỉ tương đối nào trong chương trình.

Giả sử tôi có một chuỗi định nghĩa với một nhãn như thế này trong chương trình của tôi:

szHello db 'Hello, world!', 0 

Và sau đó tôi sau cố gắng tham chiếu nhãn như thế này (chỉ có đoạn có liên quan):

org 0x7c00 
xor ax, ax 
mov ds, 0 
... 
mov si, szHello 
lodsb 
... 
int 0x10 ; Print first character of szHello 

Câu hỏi của tôi là, tại sao điều đó không tương đương với điều này? :

org 0 
mov ds, 0x7c00 
... 
mov si, szHello 
lodsb 
... 
int 0x10 

Khi tôi chạy ví dụ đầu tiên, chuỗi của tôi xuất hiện chính xác. Ví dụ thứ hai không hoạt động.

Con trỏ đến tài liệu liên quan cũng sẽ được đánh giá cao, nếu vấn đề là một vấn đề khái niệm về phía tôi.

Trả lời

8

0000: 7C00 không tương đương với 7C00: 0000. Phần phân đoạn được tính theo các đoạn văn, không tính theo byte. Hãy thử thay thế này:

mov ax, 0x7c0 
mov ds, ax 
+0

Tuyệt vời, hoạt động, cảm ơn bạn. Tuy nhiên, tôi không chắc tôi hoàn toàn hiểu. 'Org' có sử dụng địa chỉ phân đoạn hoặc bù đắp vào phân đoạn không? –

+1

Đó là một khoảng trống trong phân đoạn hiện tại. –

+0

'mov ds, 0x7c0' không phải là lệnh hợp lệ. Có lẽ bạn có nghĩa là một cái gì đó như 'mov ax, 0x7c0'' mov ds, ax' –

13

org xác định vị trí chương trình được đề cập EXPECTS được tải vào bộ nhớ. Không phải nơi nó thực sự được tải - được điều khiển bởi bất kỳ ai tải - nhưng nơi mà nó dự kiến ​​sẽ được nạp.

+0

Thú vị. Điều gì xảy ra với chương trình của tôi nếu nó được tải ở một nơi khác? Và sau đó, tại sao 'org' tồn tại? –

+0

Nếu nó được tải ở một nơi khác, các bù đắp được tính toán bởi người lắp ráp (chẳng hạn như địa chỉ của nhãn szHello) sẽ sai và những gì xảy ra tiếp theo là dự đoán của bất kỳ ai. –

+1

Được nói ở một dạng khác: địa chỉ tuyệt đối sẽ sai. – ninjalj

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