2012-04-21 35 views
18

Đối với một số lý do, khi tôi cố gắng biên dịch chút mã này, trình biên dịch nói syscall.s:72:invalid constant (0x172) after fixup:Hằng số không hợp lệ sau khi sửa lỗi?

.globl _mach_msg_trap$MACH 
_mach_msg_trap$MACH: 
    stmfd sp!, {r4,r7} 
    mov r7, #370 /* this is line 72 */ 
    svc 0 
    ldmfd sp!, {r4, r7} 
    bx lr 

Tôi không biết tại sao nó làm nó. Khi tôi đặt một hằng số nhỏ hơn vào r7, nó hoạt động tốt. Nhưng với số cao hơn, nó phun ra lỗi này. Tôi đã tạm thời sửa lỗi bằng cách thực hiện mov r7, #300add r7, #70, đạt được hiệu quả mong muốn. Vẫn không chắc chắn những gì gây ra lỗi mặc dù.

Trả lời

35

Hướng dẫn ARM chỉ có thể tải một phạm vi giới hạn các giá trị tức thời với mov. Vấn đề là giá trị phải được mã hóa trong chính lệnh mov. Vì tất cả các lệnh ARM đều rộng 32-bit, hướng dẫn ban đầu được thiết lập cho ARMv5 chỉ có tổng cộng 8 + 4 bit để mã hóa ngay lập tức. Với 8 bit đầu tiên có thể tải bất kỳ giá trị 8 bit int nào trong khoảng 0-255 và 4 bit là xoay đúng theo các bước 2 từ 0 đến 30.

Vì vậy, bạn có thể tải các giá trị như :

#0 
#122 
#121 ror #24 = 30976 
#230 ror #12 = 241172480 

Tuy nhiên, # 370 không thể tải với lược đồ này, yêu cầu #185 ror #31 không thể thực hiện được.

Có hai cách để tải giá trị tức thì của bạn.

  1. Cách bạn đã giải quyết nó bằng cách tạo giá trị theo nhiều bước.
  2. Bằng cách tải giá trị từ bộ nhớ bằng ldr: ldr r7,=#370 Trình kết hợp sau đó sẽ tạo một hồ bơi không đổi và tải giá trị từ đó qua địa chỉ liên quan đến máy tính.

Thông thường bạn nên xây dựng các hằng số với tối đa 2 hướng dẫn, nếu không thể (hoặc giá trị phải di dời) sử dụng ldr.

Bắt đầu với ARMv7 bạn cũng có thể sử dụng movw để tải bất kỳ giá trị 16 bit nào trong nửa dưới của thanh ghi trong khi zeroing nửa trên và movt để tải giá trị 16 bit khác lên nửa trên mà không chạm vào nửa dưới.

+0

Tôi có cùng vấn đề, nhưng sử dụng armv4. Tôi muốn tải 0x0000ffff trong một thanh ghi. movw và movt không được hỗ trợ trong chế độ cánh tay này. Và tôi không thể sử dụng ldr r3, = # 0000ffff –

+1

Bạn phải tải ldr r3, = # 0x0000ffff không = # 0000ffff. Việc sửa chữa là do bộ lắp ráp. Bạn cũng có thể chỉ cần mov r3, # 255 - orr r3, r3, # 65280 –

+0

Tôi không thể đặt giá trị đó vào thanh ghi. Nó không phải là một hướng, nó là một hằng số tôi muốn lưu trữ trong bộ nhớ, ở một vị trí được cho bởi biến v1 (trong C lệnh là: iowrite32 (v1, 0x0000FFFF) Thông báo là: Không thể xử lý yêu cầu phân trang hạt nhân tại địa chỉ ảo 0000ffff –

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