2011-12-15 34 views
6

Hãy nói rằng tôi muốn đọc từ địa chỉ tuyệt đối gs:$30 trong chế độ 64bit, vì vậy mã asm trông giống như sau:Làm thế nào để đọc dữ liệu từ địa chỉ tuyệt đối trong delphi XE2

asm 
    mov rax, gs:[$30] 
end; 

... và trình biên dịch dịch này code to ...

65 48 8B 05 30 00 00 00  mov rax,gs:[rel $00000030] 

Nhưng tôi không muốn sử dụng địa chỉ tương đối (rip + $30). Tôi muốn trình biên dịch sử dụng địa chỉ tuyệt đối và biên dịch theo cách này:

65 48 8B 04 25 30 00 00 00 mov rax,gs:[+$0030] 

(Nó là như nhau, nếu tôi sử dụng gs: tiền tố hay không!)

Làm thế nào để làm điều này?

EDIT:

tôi biết công việc xung quanh. Tôi hỏi nếu tồn tại bất kỳ comand để nói với trình biên dịch để địa chỉ như là tuyệt đối thay vì tương đối.

EDIT

Cho đến nay rất tốt ... :)

drhirsch giúp tôi tìm ra lệnh, và bây giờ là trình biên dịch:

mov rax, gs:[abs qword ptr $30] 
or 
mov rax, gs:[abs $30] 

này:

6548A13000000000000000 mov rax,[qword $0000000000000030] 

Đó là alm ost ok :) Bởi vì tôi muốn opcode 32bit ngắn (xem mã opcodes trên) dài hơn opcode 64bit.

Có cách nào để yêu cầu trình biên dịch sử dụng mã địa chỉ 32 bit ngắn thay vì dài không?

+0

Tôi không có 64-bit Delphi trong tầm tay, chỉ cần một đoán - sử dụng thanh ghi thay vì giá trị bằng chữ như sau: 'mov RAX, $ 30; mov RAX, gs: [RAX] ' – kludg

+0

@Serg: Chắc chắn, nhưng đây là một công việc xung quanh! Tôi hỏi nếu tồn tại bất kỳ comand để nói với trình biên dịch để địa chỉ như là tuyệt đối thay vì tương đối. –

+0

Tại sao bạn không hỏi ở nơi đầu tiên – hirschhornsalz

Trả lời

4

Bạn cần sử dụng hướng dẫn movabs.

movabs rax, gs:[$30] 

Edit: rip tương đối quyết là chế độ mặc định, trên một số nhà lắp ráp bạn có thể để buộc 32 bit địa chỉ tuyệt đối với

mov rax, gs:[dword $30] #nasm, tasm 
mov rax, gs:[abs $30] #yasm 
+0

Hmm, nhưng trình biên dịch nhấn mạnh: '[Lỗi DCC] Project1.dpr (20): E2003 Mã định danh không khai báo: 'movabs'' –

+0

Và đối với hai phương pháp khác nhấn mạnh:' [DCC Error] Project1.dpr (21): E2105 Inline assembler lỗi cú pháp' –

+0

Thanx đúng cách là: 'mov rax, gs: [abs qword ptr addr]' nhưng trình biên dịch sử dụng mã opcode 64 bit dài insted mã opcode 32 bit ngắn. Bất kỳ ý tưởng làm thế nào để giải quyết điều này? –

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