Tôi đã gỡ lỗi một số mã C++ (WinCE 6 trên nền tảng ARM), và tôi tìm thấy một số hành vi kỳ lạ:hành vi kỳ lạ của ldr [pc, #VALUE]
4277220C mov r3, #0x93, 30
42772210 str r3, [sp]
42772214 ldr r3, [pc, #0x69C]
42772218 ldr r2, [pc, #0x694]
4277221C mov r1, #0
42772220 ldr r0, [pc, #0x688]
Dòng 42772214 ldr r3, [pc, #0x69C]
được sử dụng để nhận được một số liên tục từ phần .DATA, ít nhất tôi nghĩ vậy.
Điều lạ lùng theo mã r2 nên được lấp đầy với bộ nhớ từ địa chỉ pc = 0x42772214 + 0x69C = 0x427728B0, nhưng theo nội dung bộ nhớ, nó được tải từ 0x427728B8 (8bytes +), nó cũng xảy ra cho các tập lệnh ldr khác.
Có phải lỗi của trình gỡ rối hoặc sự hiểu biết của tôi về ldr/pc không? Một vấn đề khác mà tôi không nhận được - tại sao truy cập vào phần .data liên quan đến mã được thực thi? Tôi thấy nó hơi lạ.
Và một vấn đề nữa: tôi không thể tìm cú pháp của lệnh mov 1 (bất kỳ ai có thể chỉ cho tôi một đặc điểm kỹ thuật optype cho Thumb (1C2))
Xin lỗi vì sự mô tả người bên lương, nhưng tôi chỉ cần làm quen với các hội đồng.
Điều đó không giống như mã 'thumb', nhưng giống như mã' ARM'.Các địa chỉ của tất cả các lệnh đều cách nhau 4 byte - chỉ có một vài chỉ dẫn 'thumb' 4 byte. –
Trong hầu hết các kiến trúc tôi đã thấy bộ đếm chương trình được tăng lên * trước * lệnh được thực thi. Trong khi thực hiện lệnh, bộ đếm chương trình sẽ chứa địa chỉ của * đầu * của lệnh hiện tại. –