chức năng của NOPL trong máy x86 là gì? Nó cảm thấy như nó không làm bất cứ điều gì, nhưng tại sao nó luôn luôn trong mã lắp ráp?NOPL làm gì trong hệ thống x86?
Trả lời
NOP
là hoạt động "không làm gì" một byte, có nghĩa đen là "không hoạt động". NOPW, NOPL, vv .. là các thông báo tương đương, nhưng lấy từ và các byte có kích thước dài.
ví dụ:
NOP // 1byte opcode
NOP // 1byte opcode
tương đương với làm
NOPW // 2byte opcode.
Họ rất tiện dụng cho đệm điều trên do đó, một chuỗi mã bắt đầu từ ngày một ranh giới bộ nhớ đặc biệt, bằng cách tham gia một vài byte của không gian hướng dẫn, tuy nhiên không thực sự làm bất cứ điều gì.
hiệu lực duy nhất NOP về CPU là để tăng IP
/EIP
bằng 1. Các khoản tương đương NOPx sẽ làm như vậy cho 2, 4, vv ...
Tôi chưa bao giờ nghe về hoạt động NOPW và NOPL trong tập lệnh của x86 .. cũng không chúng xuất hiện trong Intel Reference Design Reference :) Có lẽ bạn đang trộn các kiến trúc khác nhau – Jack
@Jack có mùi như AT & T cú pháp cho tôi – harold
@harold Không biết .. gcc than phiền nếu tôi sử dụng nopw/nopl thay vì nop – Jack
Edit: thêm tài liệu tham khảo để gas
tài liệu và mã hóa gas
cho khác nhau nop
hình thức:
Theo John Fremlin's blog: Operands to NOP on AMD64, nopw
, nopl
vv là gas
cú pháp, không AT & cú pháp T.
Dưới đây là mã hóa lệnh được tạo bởi gas
cho các số khác nhau nop
từ gas
source cho độ dài lệnh từ 3 đến 15 byte. Lưu ý rằng một số giống với các mẫu được đề nghị của Intel là nop
(xem bên dưới), nhưng không phải tất cả. Cụ thể, trong dài hơn nop
's gas
sử dụng nhiều tiền tố (2) liên tiếp 0x66
ở các dạng khác nhau nop
, trong khi các biểu mẫu nop
được đề xuất của Intel không bao giờ sử dụng nhiều tiền tố hoạt động 0x66
trong bất kỳ hướng dẫn nào được đề xuất nop
.
nop
mã hóa từ gas
source (định dạng lại cho dễ đọc):
/* nopl (%[re]ax) */
static const char alt_3[] = {0x0f,0x1f,0x00};
/* nopl 0(%[re]ax) */
static const char alt_4[] = {0x0f,0x1f,0x40,0x00};
/* nopl 0(%[re]ax,%[re]ax,1) */
static const char alt_5[] = {0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_6[] = {0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopl 0L(%[re]ax) */
static const char alt_7[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax,%[re]ax,1) */
static const char alt_8[] = {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopw 0L(%[re]ax,%[re]ax,1) */
static const char alt_9[] = {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_10[] = {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_11[] = {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_12[] = {0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_13[] = {0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_14[] = {0x66,0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* data16
data16
data16
data16
data16
nopw %cs:0L(%[re]ax,%[re]ax,1) */
static const char alt_long_15[] = {0x66,0x66,0x66,0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
/* nopl 0(%[re]ax,%[re]ax,1)
nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_short_11[] = {0x0f,0x1f,0x44,0x00,0x00,0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1)
nopw 0(%[re]ax,%[re]ax,1) */
static const char alt_short_12[] = {0x66,0x0f,0x1f,0x44,0x00,0x00,0x66,0x0f,0x1f,0x44,0x00,0x00};
/* nopw 0(%[re]ax,%[re]ax,1)
nopl 0L(%[re]ax) */
static const char alt_short_13[] = {0x66,0x0f,0x1f,0x44,0x00,0x00,0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax)
nopl 0L(%[re]ax) */
static const char alt_short_14[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
/* nopl 0L(%[re]ax)
nopl 0L(%[re]ax,%[re]ax,1) */
static const char alt_short_15[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
Intel sử dụng cú pháp khác nhau, và có nop
's sẵn cho tất cả độ dài hướng dẫn 1-9 byte. Có một số khác nhau của nop
's, như tất cả nop
' s dài hơn hai byte chấp nhận 1 toán hạng. Một byte nop
(0x90
) đồng nghĩa với xchg (e)ax,(e)ax
.
Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z, CHAPTER 4: INSTRUCTION SET REFERENCE, M-Z danh sách đề nghị nop
hình thức cho độ dài hướng dẫn khác nhau:
Table 4-12. Recommended Multi-Byte Sequence of NOP Instruction
Length Assembly Byte Sequence
2 bytes 66 NOP 66 90H
3 bytes NOP DWORD ptr [EAX] 0F 1F 00H
4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H
5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H
6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H
7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H
8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H
9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H
Vì vậy, ngoài những nop
's khuyến cáo của Intel, có rất nhiều khác nop
' s quá. Ngoài việc căn chỉnh một hướng dẫn đến một ranh giới bộ nhớ cụ thể, như Marc B đề cập đến trong câu trả lời của mình, cũng rất hữu ích trong việc tự sửa đổi mã, gỡ lỗi và kỹ thuật đảo ngược.
Lưu ý rằng trên amd64, 'nop' không còn đồng nghĩa với' xchg eax, eax'. 'nop' không nằm ngoài 32 bit trên cùng của' eax', nhưng 'xchg eax, eax' thì không. – fuz
Thực tế, NOP sẽ được sử dụng trong mã lắp ráp khi mã cần được vá.
Do kích thước của hướng dẫn mới có thể khác với hướng dẫn cũ, cần có đệm.
Hướng dẫn đệm phải hoạt động giống như NOP, mặc dù nó có thể chiếm nhiều byte.
Lý do chúng tôi chèn một lệnh phức tạp hơn, như 66 90, thay vì một số NOP, là một lệnh thường thực hiện nhanh hơn nhiều NOP.
Bạn hỏi "tại sao mã này luôn nằm trong mã lắp ráp?" - thông thường bạn không tìm thấy nhiều NOP trong mã assembly. Có một số mã cụ thể mà bạn đang xem có nhiều NOP không? – ugoren
Người đàn ông, tôi ước tôi có thể "cảm nhận" mã nào! –
http://stackoverflow.com/questions/6776385/what-is-faster-jmp-or-string-of-nops/6777644 –