2015-12-16 16 views
5

Ai đó có thể giải thích mã sau không?Lệnh lắp ráp x86 này làm gì (addsd xmm0, ds: __ xmm @ 41f00000000000000000000000000000 [edx * 8])?

addsd xmm0, ds:[email protected][edx*8] 

Tôi nhận thấy rằng một số giá trị được thêm vào thanh ghi nổi xmm0, nhưng ý nghĩa của hằng số __xmm @ 41f00000000000000000000000000000 là gì? Có tài liệu nào mà tôi có thể đọc về nó không?

Dưới đây là đoạn đầy đủ các mã mà tôi đang cố gắng để hiểu:

cvtsi2sd xmm0, [ebp+var_2C8] 
mov  edx, [ebp+var_2C8] 
shr  edx, 1Fh 
addsd xmm0, ds:[email protected][edx*8] 

ebp + var_2C8 là giá trị số nguyên unsigned.

  1. ebp + var_2C8 được chuyển thành nổi và chuyển đến xmm0 đăng ký
  2. ebp + var_2C8 được chuyển đến edx và phải chuyển sang 31 bit
  3. một cái gì đó có nguồn gốc từ chuyển dịch này sẽ được thêm vào xmm0.

Chính xác những gì được thêm vào xmm0? Có mục đích nào có thể tính toán này?

Cập nhật.
Đây là tháo liệu cho mã này:

cvtsi2sd xmm0,dword ptr [ebp-2C8h] 
mov   edx,dword ptr [ebp-2C8h] 
shr   edx,1Fh 
addsd  xmm0,mmword ptr [edx*8+2685CC0h] 

Hình như một số giá trị tăng gấp đôi từ mảng các hằng số được thêm vào xmm0 ...

+2

Đó là bảng hoặc mảng tra cứu. Hằng số ngớ ngẩn chỉ là một sản phẩm của bộ tách rời của bạn (cũng có thể là một biểu tượng), xem xét việc tháo gỡ thô để xem địa chỉ thực tế. – Jester

Trả lời

9

Đây là việc chuyển đổi số nguyên unsigned sẽ tăng gấp đôi.

Làm thế nào nó hoạt động là nó lần đầu tiên chuyển đổi nó như đã ký kết, có nghĩa là bit dấu có một trọng lượng -2 , nhưng nó phải được chưa được ký nơi các bit đầu có trọng lượng của 2 . Vì vậy, nếu ký hiệu được đặt, nó sẽ thêm +2 = 4294967296.0 (41f0000000000000 làm đôi) để bù. Nó làm như vậy bằng cách dịch chuyển sang phải, đặt bit trên vào bit dưới cùng và xóa mọi thứ khác, và sau đó nó sử dụng nó như một chỉ số bảng vào một bảng chứa 0 và 4294967296.0.

+0

Không thể cảm ơn đủ cho giải thích kỹ lưỡng này! – leo

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