Apakah beberapa kode NOP diperlakukan berbeda dari yang lain?

12

Saya ingin tahu tentang ini, katakanlah saya punya:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Apakah dieksekusi persis sama dengan ini?

00000000001 0F1F00                          nop        dword [ds:rax]

Apa dampak yang dimiliki contoh kedua sebagai lawan yang pertama?

Tom Boobas
sumber
1
Saya akan cenderung berpikir yang kedua akan mengeksekusi lebih cepat daripada yang pertama karena ini adalah satu instruksi daripada 3. Mungkin saja pipelining modern akan mengubahnya.
Loren Pechtel
1
Mengapa ini ditandai c ?
Keith Thompson
Google untuk multi byte nop, menghasilkan beberapa hasil.
phant0m
1
@KeithThompson - Saya menarik tag C dan coding-style; mereka bukan milik.
@ phant0m - apakah Anda akan memasukkan komentar itu ke dalam jawaban dan merangkum beberapa hasil yang lebih relevan? Tidak semua dari kita memiliki latar belakang untuk memahami dengan benar apa yang akan kembali dari permintaan pencarian itu.

Jawaban:

2

Itu tergantung pada arsitektur mesin. KA-10 klasik (pdp-10) memiliki banyak kode nop, mungkin konsekuensi dari set instruksi yang sangat teratur, dan fakta bahwa semuanya diimplementasikan oleh komponen descrete, bukan oleh mikrokode. Beberapa NOP merujuk memori, ada yang melewati tes yang tidak pernah dilewati, tetapi tetap menguji kondisi yang mungkin menyebabkan lompatan, dan sebagainya. "JFCL 0," diiklankan di manual sebagai nomor tercepat.

ddyer
sumber
Saya bekerja pada assembler (8085?) Sekaligus yang menawarkan opsi untuk mengganti beberapa NOP dengan instruksi JMP tunggal. Anda mendapatkan keberpihakan yang Anda inginkan tanpa membayar penalti kinerja. Berguna ketika Anda memiliki string dalam PIC, tidak begitu berguna jika Anda memiliki loop timing berbasis CPU (itulah sebabnya ia mati secara default).
TMN
Seringkali instruksi NOP digunakan untuk menyisipkan jeda singkat, biasanya sebagai akibat dari beberapa ketergantungan perangkat keras atau errata perangkat yang bekerja. Penalti kinerja adalah alasan untuk menggunakan NOP.
uɐɪ
1
nops memiliki banyak kegunaan aesoterik. Beberapa arsitektur memiliki persyaratan byte-alignment untuk lompatan. Kode modifikasi diri (horor!) Menggunakan nops sebagai titik sambungan. Sistem bug menggunakan nops untuk menyimpan informasi tentang pernyataan yang gagal.
ddyer
@ddyer: Beberapa prosesor memiliki instruksi (kadang-kadang didokumentasikan, kadang tidak) yang akan mengambil byte memori dan mengabaikan nilai yang diambil sepenuhnya, atau tidak melakukan apa-apa dengannya kecuali menetapkan flag yang mungkin tidak dipedulikan oleh programmer. Pada 6502, cukup umum untuk menggunakan instruksi "BIT abs" sebagai cara melahap dua byte berikutnya; ada juga beberapa opcode tidak berdokumen yang berperilaku sama kecuali mereka tidak memperbarui bendera apa pun. Satu peringatan dengan trik semacam itu, meskipun: mereka akan menyebabkan byte ruang alamat untuk dibaca. Beberapa 6502 periferal dapat bereaksi terhadap operasi baca.
supercat
0

Tampaknya contoh kedua harus berjalan lebih cepat daripada yang pertama. Pada contoh pertama, tiga instruksi terpisah akan dieksekusi. Dalam yang kedua, hanya satu instruksi. NOP multi-byte dimaksudkan untuk digunakan untuk "petunjuk" CPU (tepatnya bagaimana dan kapan tampaknya rahasia ). Mereka dapat berguna untuk tujuan pelurusan (untuk memulai loop ketat pada garis cache), tetapi saat ini mereka tidak memiliki kegunaan lain. Tidak jelas apakah CPU benar-benar mengevaluasi argumen, sehingga tidak mungkin untuk mengatakan apakah CPU meningkatkan waktu decoding instruksi atau menimbulkan penalti akses memori. Adakah yang memiliki ICE baik ingin menguji salah satunya dan melihat alamat apa yang muncul pada jejak bus?

TMN
sumber
Meskipun banyak 6502 perakit menggunakan mnemonic "NOP" untuk opcode tidak berdokumen yang melakukan pengambilan memori (mis. NOP $ 1FF9) akan menjadi instruksi dua-byte yang bertuliskan alamat 0x1FF9 dan mengabaikan nilai baca), saya tidak akan mengharapkan pembuat chip untuk gunakan istilah "nop" untuk instruksi yang melakukan apa pun di luar kemajuan penghitung program / petunjuk instruksi karena tidak ada jaminan prosesor tidak akan terhubung ke perangkat keras yang memicu tindakan (misalnya beralih ke bank kode 1) ketika alamat tertentu (seperti 0x1FF9 ) diakses, dan pemicu seperti itu tidak persis "tidak ada operasi" ,.
supercat