Wdrażam tłumaczenie binarne i mam do czynienia z sekwencjami NOP (0x90) o długości około 16 opkodów. Czy na początku takich sekwencji lepiej jest umieścić JMP (do końca)?Co jest szybsze: JMP lub ciąg NOPów?
Odpowiedz
Jeśli NOP
s mają wyrównać strumień, to mają większą wartość niż zwykłe NIE. jeśli zależy Ci na czystej prędkości, zobacz Agner Fog's Optimization Manuals Vol. 4.
Będąc tłumaczeniem binarnym, zacznę od przetłumaczenia (ich odpowiedniki w systemie docelowym). Gdy wszystko działa, zoptymalizuj martwy kod. W tym samym czasie, ponieważ ten ciąg instrukcji przykuł twoje oko, spróbuj zrozumieć, po co tu są, może czekaj na sprzęt, aby coś zrobić, i upewnij się, że twój przetłumaczony system działa tak samo.
Intel Architecture Software developer's guide, volume 2B (instructions N-Z) zawiera się w poniższej tabeli (str 4-12) o NOP
:
Tabela 4-9. Zalecana Sequence Multi-Byte z NOP Instrukcji
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
To pozwala skonstruować "wyściółkę" NOP
niektórych rozmiarach. W przypadku dwóch z nich można mostkować 16 bajtów, ale proponuję sprawdzić przewodniki optymalizacji (dla procesora, na który kierujesz procesor), czy numer JMP
jest szybszy od dwóch takich NOPs
.
Czy istnieje jakiś powód, dla którego nie można po prostu usunąć NOP? – DaMacc