2012-05-08 12 views

Odpowiedz

16

Jest to NOP. Dodaje zawartość% esi i 0x0, i umieszcza wynik w% esi. Ktoś albo ma niezgrabny generator kodu albo musi wypełnić N bajtów, gdzie ta instrukcja ma odpowiedni rozmiar.

Instrukcje LEA wykonują się dość szybko (zwykle 1 zegar), więc jest to znacznie lepsze niż N nops.

X86 jest tak dziwaczny, jak jest, ma wiele instrukcji, które skutecznie nie robią niczego poza wypełnieniem różnych liczb bajtów. Możesz znaleźć inne niepotrzebne instrukcje o różnych długościach. Zwykle znajdziesz instrukcje, które są długie, ale wykonuj je w 1 zegar lub mniej.

Podręcznik AMD x86-64 zawiera sugestie dotyczące tego, co należy stosować w przypadku NOP; sugerują jeden z kodów przedrostkowych powtarzanych kilka razy przed rzeczywistym NOP, IIRC. Takie opcodes prefix są bardzo szybko zużywane przez silnik pobierania instrukcji; przeważnie ich koszt jest ukryty w pobieraniu instrukcji, a nie w czasie wykonywania instrukcji.

+1

Ten ostatni, chyba że GCC jest niezdarnym generatorem kodu. Dziękuję za szybką odpowiedź. – Brian

+3

Interesujące jest to, że 'lea 0x0 (% esi),% esi' jest operacją" no-op "tylko w 32-bitowym kodzie. W 64-bitowym kodzie ta instrukcja dodatkowo zeruje wyższe podwójne słowo '% rsi'. Do tej pory widziałem, jak GCC wstawiał takie instrukcje tylko w 32-bitowym kodzie. – Eugene

+3

.... stąd punkt AMD "polecam wielopłytowe NOP". –