2012-04-10 24 views
8

tôi gần đây đã bắt đầu lập trình lắp ráp cho lõi lõi. Bản trình diễn nhỏ đầu tiên của tôi, chỉ với phần .text, chạy mà không có bất kỳ vấn đề gì.di chuyển nội bộ không cố định lên

Là phần mở rộng hợp lý, tôi muốn cấu trúc mã trình lắp ráp thành các phần thông thường: .text, .data, .bss.

Vì vậy, tôi đã viết chương trình đơn giản sau đây:

.globl _start 

.section .text 

_start: 
    b main 
    b . 
    b . 
    b . 
    b . 
    b . 
    b . 
    b . 


main: 
    ldr r0, x 
    nop 

.section .data 

x: .word 0xf0f0f0f0 

.end 

Nhưng

/opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o 

thoát với lỗi

prog.s: Assembler messages: 
prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up 
make: *** [prog.o] Error 1 

tôi không có đầu mối tại sao lắp ráp phàn nàn về di dời, vì tôi nghĩ đó là nhiệm vụ của mối liên kết. Tôi có thể tưởng tượng rằng tôi phải nói với người lắp ráp rằng phần .data của tôi không nằm ở vị trí bộ nhớ cuối cùng ở giai đoạn lắp ráp, nhưng tôi không thể tìm thấy bất cứ điều gì liên quan.

Mặc dù tôi tìm thấy một cách để lấy mã lắp ráp một cách chính xác, bằng cách thay thế

.section .data 

bởi

.org . 

đó không phải là một giải pháp thỏa mãn. Đặc biệt là trong thực tế là các tài liệu khí nêu bật ý nghĩa của phần này.

Có lẽ ai đó của bạn các chuyên gia có thể giúp tôi đạt được một số trí tuệ

Trả lời

13

Có vẻ như cách duy nhất bạn có thể làm điều đó là bằng cách lấy địa chỉ của biến và tải một giá trị từ địa chỉ đó.

ldr r1,=x ; get address of x 
ldr r0,[r1] ; load from that address 

Nói cách khác, điều này cũng hợp lý. Sau khi tất cả, nếu địa chỉ của x (sau khi liên kết) là quá xa cho một máy tính truy cập tương đối? Vì trình biên dịch (không thực hiện liên kết) không biết phần dữ liệu có thể từ phần văn bản đến mức nào, nó sẽ từ chối biên dịch mã đó trong trường hợp nó không thể truy cập được.

Bằng cách sử dụng cách gián tiếp này để truy cập biến, đảm bảo rằng biến sẽ có thể truy cập được (hoặc ít nhất trình biên dịch có thể chắc chắn liệu biến đó có thể truy cập được hay không).

Mã được điều chỉnh từ http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

Cảm ơn bạn đã giải thích và ví dụ. Điều này hoặc một cái gì đó tương tự nên đi vào phần cánh tay của tài liệu binutils. Tôi sẽ ghi nhớ rằng các mối liên kết không quy mô lớn và coder quy mô nhỏ di dời. Nếu tôi có thêm thời gian, tôi sẽ nghiên cứu một số chương trình c đã bị tháo rời và hy vọng có được một số thông tin chi tiết hơn ... – user1146332

+0

đây có phải là câu trả lời được chấp nhận không? – aditya