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?
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
@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. –
Tại sao bạn không hỏi ở nơi đầu tiên – hirschhornsalz