2013-03-15 20 views
6

set $eflags không thay đổi giá trị eflags.Làm thế nào để thay đổi giá trị đăng ký eflags trong GDB?

Giá trị cũ eflags vẫn còn sau ví dụ. =>$set $eflag=0x243 [đây chỉ là một ví dụ đầu vào].

Cách khác, có cách nào để đặt cờ riêng lẻ là eflags không?

Tôi đang tìm một cái gì đó như: set ZF[zero flag]. Có một lệnh gdb để làm điều đó?

+1

eflags [ZF] nên làm .. –

+2

Tôi nhận được "Undefined command:" eflags ". Try" help "." với "eflags [ZF]". Bạn có thể đưa ra một ví dụ về lệnh này? – snakeninny

Trả lời

6
set ($eflags)=0x243 

làm việc trong các thử nghiệm của tôi cho bất kỳ giá trị hex.

+0

Trong GDB 7.7.1, dấu ngoặc đơn dường như không bắt buộc: http://stackoverflow.com/a/31339372/895245 –

0
eflags [ ZF ] 

Và nếu bạn muốn thiết lập sử dụng giá trị tùy ý này

eflags 0x42

+4

Tôi nhận được lệnh 'Undefined:" eflags ". Hãy thử "trợ giúp" .' – Saphrosit

+3

Sử dụng 'set ($ eflags) | = 0x42' để đặt [ZF] (http://en.wikipedia.org/wiki/Zero_flag). Thử nghiệm. –

9

set $eflags mà không ngoặc làm việc trong GDB 7.7.1

Để thiết lập một lá cờ cá nhân, sử dụng chỉ số của nó. Ví dụ, ZF là bit thứ 6, vì vậy chúng tôi có thể thiết lập nó với:

set $ZF = 6 
set $eflags |= (1 << $ZF) 

Cũng vậy với tất cả các hoạt động Bitwise khác: How do you set, clear, and toggle a single bit?

# Clear 
set $eflags &= ~(1 << $ZF) 

# Toggle 
set $eflags ^= (1 << $ZF) 

gì gây nhầm lẫn là nhiều bit được hoặc dành riêng, không thể sửa đổi trực tiếp bằng bất kỳ lệnh nào hoặc không thể sửa đổi từ chế độ người dùng, xem thêm: Flags registers - Can we read or write them directly? và do đó GDB không chạm vào chúng.

Ví dụ:

(gdb) set $eflags = 0 
(gdb) i r eflags 
eflags   0x202 [ IF ] 
(gdb) set $eflags = 0xFFFFFFFF 
(gdb) i r eflags 
eflags   0x54fd7 [ CF PF AF ZF SF TF IF DF OF NT RF AC ] 

0x202 trong hệ nhị phân là:

0010 0000 0010 

0x54fd7 trong hệ nhị phân là:

0101 0100 1111 1101 0111 

TODO hiểu tại sao mỗi người trong số những bit được thiết lập hay không, bằng cách xem hướng dẫn sử dụng http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf và GDB s mã ource.

Ones rằng tôi hiểu:

  • tất cả các thanh ghi reserved bị bỏ tại giá trị cố định của họ: 1 cho bit 1 và 0 cho bit 3, 5, 15 và 22-31
+0

Lệnh $ eflags | = (1 << $ ZF) được đặt làm gì? Tại sao đặt $ ZF = 6 là không đủ? – user3364161

+0

@ user3364161 chỉ để tránh các hằng số ma thuật trong mã và tự động ghi lại ý nghĩa của chúng. ZF = 6 cũng sẽ hoạt động tốt. –

0

Đó là sai để đặt tất cả các cờ trong thanh ghi eflags. Vì vậy, một số bit được bảo lưu và phải bằng 0. (3,5,15,22 trở lên) bit 1 phải là 1. Có cả các thẻ rflags nữa. Nhưng tất cả dword hi là zerro. Vì vậy, không có nhu cầu sử dụng rflags thay vì eflags cho tất cả các hoạt động thay đổi cờ. Nhưng tôi biết dân tộc sử dụng bit miễn phí để sử dụng riêng. Rflags phù hợp hơn hi dword. Vì vậy, trong kiến ​​trúc 64 bit, đủ các thanh ghi miễn phí để sử dụng. Nhưng trong vòm 32 bit không. Vì vậy, mạnh mẽ khuyên bạn nên làm như vậy. Vì trong các vòm tương lai, một số bit này có thể được sử dụng. Nhưng lá cờ này không chạm vào hình thức thay đổi 32 bit vòm đến 64. Nó chỉ đăng ký có thể không thay đổi ở tất cả. Vì vậy, tất cả các lý do có thể cho bất kỳ trường hợp nào đã được sử dụng.Tôi không tưởng tượng bất kỳ tình huống có thể được sử dụng một số lá cờ bổ sung không được sử dụng cho đến bây giờ. Nó có thể là một số thay đổi kiến ​​trúc vi xử lý hồng y. Tôi không nghĩ rằng một số quyết định để làm như vậy vì lý do rõ ràng tất cả mềm phải được ném ra và viết lại từ đầu. Đó là công việc cực kỳ khó khăn và rất lớn ...

+1

Câu trả lời này có thể sử dụng một số đoạn văn và 'back-ticks' – GiantsLoveDeathMetal

+0

Áp phích ban đầu không nói rằng họ muốn đặt tất cả các bit, nhưng những cái cụ thể hoặc một nhóm (họ đã đưa ra ví dụ 0x243). Họ muốn có một cách sạch sẽ để thiết lập các cờ riêng lẻ. –

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