2012-08-27 14 views
5

Tôi đang cố gắng tìm hiểu thêm về lắp ráp và tháo gỡ. Mục tiêu của tôi là sửa đổi cách một địa chỉ cụ thể được viết bằng trình gỡ lỗi (olly). Tốt hơn là bằng cách tăng nó bằng một số (20, 50, vv ..), tôi có thể xác định địa chỉ của số dấu phẩy động (trong trường hợp này là 33B7420C).FSTP DWORD PTR DS: [ESI + 1224] làm gì?

Khi tôi đặt một breakpoint trên truy cập bộ nhớ viết nó mang lại cho tôi để 00809B2E trong đó có việc lắp ráp sau:

FSTP DWORD PTR DS:[ESI+1224]

gì chính xác là nó làm ở địa chỉ này? Tôi biết rằng thanh ghi FPU có số tôi đang tìm kiếm nhưng không chắc chắn tất cả các địa chỉ này đang làm gì.

Gần nhất tôi đến googling là: What does MOV EAX, DWORD PTR DS:[ESI] mean and what does it do?

Một bản sao của các thanh ghi cho thấy như sau:

EAX 00000000 
ECX 00A16E40 EZ.00A16E40 
EDX FFFFFFFF 
EBX 33B74578 
ESP 0018FA90 
EBP 00000000 
ESI 33B72FE8 
EDI 33B74578 
EIP 00809B2E <EZ.Breakpoint for time> 
C 0 ES 002B 32bit 0(FFFFFFFF) 
P 0 CS 0023 32bit 0(FFFFFFFF) 
A 0 SS 002B 32bit 0(FFFFFFFF) 
Z 0 DS 002B 32bit 0(FFFFFFFF) 
S 0 FS 0053 32bit 7EFDD000(FFF) 
T 0 GS 002B 32bit 0(FFFFFFFF) 
D 0 
O 0 LastErr ERROR_SUCCESS (00000000) 
EFL 00210202 (NO,NB,NE,A,NS,PO,GE,G) 
ST0 valid 1150.0000000000000000 
ST1 zero 0.0 
ST2 zero 0.0 
ST3 empty 64.951911926269531250 
ST4 empty -13.250000000000000000 
ST5 empty 64.951911926269531250 
ST6 empty 64.951911926269531250 
ST7 empty 0.0239995196461677551 
      3 2 1 0  E S P U O Z D I 
FST 2927 Cond 0 0 0 1 Err 0 0 1 0 0 1 1 1 (LT) 
FCW 027F Prec NEAR,53 Mask 1 1 1 1 1 1 

Bất kỳ trợ giúp sẽ được đánh giá cao, Cảm ơn bạn!

+9

Bạn sẽ nhận được một bản sao của tài liệu tham khảo lắp ráp x86 cho lời giải thích của các hướng dẫn cụ thể. Yêu cầu SO mỗi khi bạn gặp một lệnh không mở rộng tốt. –

Trả lời

14

FSTP lưu trữ số dấu chấm động từ đầu ngăn xếp đăng ký dấu chấm động (ST0) vào vùng bộ nhớ được chỉ định. Sử dụng công cụ sửa đổi DWORD có nghĩa là một phao 32 bit sẽ được viết. Hậu tố P cho biết rằng ngăn xếp đăng ký dấu chấm động sẽ xuất hiện sau khi thao tác.

Vì vậy, trong thực tế, hướng dẫn này đưa 1150.0 (như một phao 32-bit) tại DS:[ESI+1224], sau đó bật đăng ký stack (gây ST0 = 0.0, ST1 = 0.0, ST2 = <empty>, vv).

+0

Cảm ơn như @raymond đã nói, tôi sẽ phải đọc thêm về hội đồng x86. Tôi đang cố gắng để thêm giá trị của ngăn xếp đó bằng 50., nhưng tôi không biết làm thế nào để đạt được điều này trong hội đồng. Là nó tải đăng ký và sử dụng 'FADD' trỏ đến một số địa chỉ bộ nhớ có chứa 50.? Tôi đoán tôi sẽ phải đọc thêm về lắp ráp: ( –

1

Lưu trữ ST0 (1150.0) ở độ chính xác đơn đến địa chỉ của bạn. Và popping cho biết giá trị từ ngăn xếp FPU.

-3

Để thêm 50 (0x32 là hex cho 50):

mov eax, dword[ds:esi+0x1224] 
add eax, 0x32 
mov dword[ds:esi+0x1224], eax