Tại sao lệnh nopl
trong tệp thực thi x86 có một toán hạng? Đừng nops chỉ làm, tốt, không có gì?Tại sao lệnh x86 nopl thực hiện một toán hạng?
nopl 0x0(%rax)
Tại sao lệnh nopl
trong tệp thực thi x86 có một toán hạng? Đừng nops chỉ làm, tốt, không có gì?Tại sao lệnh x86 nopl thực hiện một toán hạng?
nopl 0x0(%rax)
Nhiều bộ giảng dạy nhị phân vi xử lý có nhiều cách để đại diện cho hướng dẫn chức năng giống hệt nhau. Ví dụ, tập lệnh ARM gốc bao gồm các lệnh để tải R0 với bất kỳ giá trị nào của biểu mẫu b << n
trong đó b
là giá trị 0 đến 255 và n
là số chẵn từ 0 đến 24. Nếu muốn tải R0 với giá trị 256 , người ta có thể tải hướng dẫn tải nó với 1<<8
hoặc người ta có thể sử dụng hướng dẫn cho 4<<6
, 16<<4
hoặc 64<<2
. Các hướng dẫn để tải các giá trị khác nhau tất cả đều có mã hóa nhị phân khác nhau, mặc dù cả bốn hướng dẫn đều có cùng tác dụng.
Các trình biên dịch cho một số trình biên dịch không được cung cấp để cung cấp các phương thức yêu cầu các hướng dẫn có vẻ giống hệt như một đoạn mã nên sử dụng. Mặc dù điều này thường không quan trọng, đôi khi bạn có thể muốn tránh sử dụng các giá trị byte nhất định trong một đoạn mã hoặc có thể đôi khi các sửa đổi đối với một số byte nhất định trong một đoạn mã sẽ có tác dụng cụ thể. Ví dụ, tám bit trong các hướng dẫn ARM nói trên được sử dụng để xác định giá trị của b
. Nếu mã đã ghi đè phần b
của một trong các hướng dẫn ở trên với giá trị 12, giá trị được nạp vào R0 sẽ phụ thuộc vào việc sử dụng bốn lệnh gốc ban đầu nào; nó có thể là 0x0C00, 0x0300, 0x00C0 hoặc 0x0030. Mặc dù các bộ lắp ráp cho 8x86 thường không thể phân biệt rõ ràng giữa tất cả các mã lệnh có thể, có thể có một số ngữ cảnh có thể xác định giá trị byte nào nên được bao gồm trong một lệnh có thể hữu ích. Ví dụ, một cách tiếp cận để xử lý các ngoại lệ sẽ là kiểm tra định kỳ, khi một ngoại lệ xảy ra, cho dù lệnh tại địa chỉ trả về là một dạng NOP cụ thể nào đó và, nếu có, giải thích toán hạng của nó như là địa chỉ của một cấu trúc dữ liệu giữ thông tin liên quan đến ngoại lệ. Trong thực tế, hầu hết các ngôn ngữ 8x86 hỗ trợ các ngoại lệ sử dụng các phương thức khác để xử lý chúng, nhưng phương pháp nói trên sẽ làm chậm chức năng bình thường theo thời gian cần thiết để lấy và thực thi NOP dài, nhưng có thể xử lý các lối thoát đặc biệt tương đối hiệu quả các ngôn ngữ sử dụng một cách tiếp cận chậm hơn để xử lý các ngắt liên quan đến việc tránh chi phí thực hiện NOP trong trường hợp không có ngoại lệ, nhưng các ngôn ngữ khác có thể chọn làm những việc khác nhau).
Trong trường hợp này, trong trường hợp này sẽ hữu ích hơn khi toán hạng thay đổi độ dài của lệnh, như được hiển thị bởi câu trả lời của [nrz] (http://stackoverflow.com/a/12564044/) trong liên kết trùng lặp trong các chú thích . – ughoavgfhw
@ughoavgfhw: Nếu người ta chỉ cần NOP tùy ý với độ dài thích hợp, người ta có thể chỉ đơn giản xác định 'nop',' nop2', 'nop3', v.v. hoặc người khác có cách ghi nhớ cho" tạo chuỗi n-byte nhanh nhất " đối số của nó là kích thước cần thiết. Nếu chỉ cần một ví dụ, ví dụ: một NOP 7 byte sẽ không cần phải chỉ định một giá trị để đi vào bốn trong số các byte đó. – supercat
Đôi khi tôi sử dụng các bước nhảy khi gỡ lỗi. Nếu tôi biết làm thế nào một cái gì đó đi sai nhưng nó đòi hỏi hàng ngàn breakpoint breakpoint để khám phá tôi viết mã mà kiểm tra cho nó. Nó có thể giống như thế này (mã C-style):
if (condition_occurred)
{
asm("nop");
}
Khi tôi đặt một breakpoint trên "asm" dòng debugger sẽ thiết lập một DRX đăng ký với địa chỉ tuyến tính (vật lý) (tương ứng với địa chỉ ảo) của nop. Khi vị trí này đạt đến một ngắt điểm ngắt xảy ra và bạn nhập trình gỡ lỗi. Nếu bạn đang thực thi mà không có trình gỡ lỗi thì nop sẽ được xử lý (không có gì xảy ra). Vì vậy, ở đây tôi muốn có một hướng dẫn mà không chính xác gì và nó có ý nghĩa rằng nó (không).
Dưới đây là một ví dụ về nơi "không làm gì cả" hướng dẫn nop thực sự làm điều gì đó ... dù gián tiếp.
Xem trang 8 trong this paper và lưu ý hướng dẫn đầu tiên (trên cùng) của vòng lặp trong ví dụ 3 (là sự phát triển của ví dụ 2).Ngoài ra chú thích ở dưới cùng bên phải của trang.
Tác giả gợi ý rằng cảnh sát bổ sung có thể tăng tốc quá trình thêm.
Vì vậy, các cảnh quay chắc chắn có mục đích sử dụng của họ.
Bản sao có thể có của http://stackoverflow.com/questions/12559475/what-does-nopl-do-in-x86-system – Hazzit
Bạn có thể "không làm gì" với một đối số, phải không? '90 nop' cũng có đối số, nó thực sự là' xchg eax, eax'. – harold
Tôi hỏi vì trình biên dịch ngược tôi đang sử dụng đang phân loại nó như một lệnh chi nhánh. Bất kỳ lý do gì có thể xảy ra? – RouteMapper