2016-06-05 19 views
5

Lệnh LEA có hỗ trợ chuyển vị âm?số học lắp ráp số học Lệnh LEA

mov rax, 1 
lea rsi, [rsp - rax] 

Khi tôi sử dụng đoạn mã trên trong file asm của tôi, tôi đã nhận lỗi:

$ nasm -f macho64 test.asm 
$ error: invalid effective address 

tôi biết rằng chúng tôi có thể làm một cái gì đó như thế này trong C:

void foo(char *a, size_t b) { 
    *(a - b) = 1; 
} 

sau đó tôi giả sử rằng:

lea rsi, [rsp - rax]  

sẽ hoạt động .

Và tôi cũng cố gắng để xem những gì các trình biên dịch GCC làm bằng cách sử dụng:

$ gcc -S foo.c // foo.c has the function foo(above) in it 

nhưng knowleage asm của tôi là không đủ cho tôi hiểu ra asm từ trình biên dịch GCC.

bất cứ ai có thể giải thích lý do tại sao:

lea rsi, [rsp - rax] ;; invalid effective address 

không hoạt động. Và tôi đang sử dụng chúng để đạt được samething:

;; assume rax has some positive number 
neg rax  
lea rsi, [rsp + rax] 
neg rax 

hoặc

sub rsp, rax 
mov rsi, rsp 
add rsp, rax 

một cách tiêu chuẩn hơn để làm việc đó là gì?

Tôi đang sử dụng NASM phiên bản 2.11.08 được biên soạn vào ngày 26 tháng 11 năm 2015 trên MAC OSX 10.11

Cảm ơn bạn đã trợ giúp!

+2

Vì CPU không hỗ trợ loại hoạt động như vậy? – MikeCAT

+1

Làm thế nào về 'mov rsi, rsp \ sub rsi, rax' – harold

+0

@MikeCAT đơn giản là đủ, bạn có thể làm điều này làm câu trả lời. Cảm ơn bạn! – user62453

Trả lời

7

Hướng dẫn lea không quan tâm đến dấu hiệu của dịch chuyển. Nhưng bạn cần phải luôn luôn thêm các thành phần lại với nhau.

mov rax, -1 
lea rsi, [rsp + rax] 

Hãy nhớ trừ 1 cũng giống như thêm -1.