; длин_тест2.квс ; Тест: три длинных перехода и три мусорных сегмента .текст .глобал _start _start: ; Инициализация регистров переместить_имм раикс, 10 ; rax = 10 переместить_имм рбикс, 5 ; rbx = 5 переместить_имм рсикс, 10 ; rcx = 10 (для проверки ZF в jz) ; ПЕРВЫЙ ПЕРЕХОД: переход_если_не_ноль ; ZF=0 (так как rax=10), значит jnz сработает ; Прыгаем к метке 'проверка_2', пропуская мертвый_код_1 переход_если_не_ноль проверка_2 ; --- МЕРТВЫЙ КОД 1 --- ; Этот код НЕ должен выполниться переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_1 переместить_имм рдикс, len_msg_dead_1 вызов_системы ; --------------------- проверка_2: ; ВТОРОЙ ПЕРЕХОД: переход_если_равно (и безусловный) ; Сравниваем rax (10) и rbx (5) -> ZF=0 сравнить раикс, рбикс ; ZF=0, значит je НЕ сработает. ; Мы хотим прыгнуть МИМО мертвого кода 2, если ZF=0. ; Используем: je skip_jmp_2 (переход НЕ сработает); jmp мимо_мертвого_кода_2 (переход СРАБОТАЕТ) переход_если_равно skip_jmp_2 ; Добавляем "мусор" из нет_операции для увеличения расстояния нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции переход мимо_мертвого_кода_2 skip_jmp_2: ; --- МЕРТВЫЙ КОД 2 --- ; Этот код НЕ должен выполниться (так как ZF=0) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_2 переместить_имм рдикс, len_msg_dead_2 вызов_системы ; --------------------- мимо_мертвого_кода_2: ; ТРЕТИЙ ПЕРЕХОД: переход_если_меньше (и безусловный) ; Сравниваем rax (10) и rbx (5) -> rax > rbx, SF=0, OF=0 сравнить раикс, рбикс ; SF=0, OF=0. Условие jl: SF != OF (0 != 0 - ложь). jl НЕ сработает. ; Мы хотим прыгнуть МИМО мертвого кода 3, если jl НЕ сработает (т.е. если rax >= rbx). ; Используем: jl skip_jmp_3 (переход НЕ сработает); jmp мимо_мертвого_кода_3 (переход СРАБОТАЕТ) переход_если_меньше skip_jmp_3 ; Добавляем "мусор" из нет_операции для увеличения расстояния нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции нет_операции переход мимо_мертвого_кода_3 skip_jmp_3: ; --- МЕРТВЫЙ КОД 3 --- ; Этот код НЕ должен выполниться (так как jl не сработал) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_3 переместить_имм рдикс, len_msg_dead_3 вызов_системы ; --------------------- мимо_мертвого_кода_3: ; --- ВЫВОД ЦЕЛЕВОГО СООБЩЕНИЯ --- вывести_сообщение: переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_success переместить_имм рдикс, len_msg_success вызов_системы ; --- ЗАВЕРШЕНИЕ --- переместить_имм раикс, 60 переместить_имм рдиай, 0 вызов_системы .данные ; Перемешиваем строки и константы msg_success: .строка_нуль "Успех!\n" .константа len_msg_success = 12 ; Длина "Успех!\n" в UTF-8 без нулевого байта ; "Мертвый код 3!" = 12 букв * 2 байта (UTF-8) + 1 (!) + 1 (\n от .строка_нуль) = 24 + 2 = 26 байт. len = 25 (без \0) msg_dead_3: .строка_нуль "Мертвый код 3!" .константа len_msg_dead_3 = 25 ; Длина "Мертвый код 3!" в UTF-8 без нулевого байта ; "Мертвый код 2!" = 12 букв * 2 байта (UTF-8) + 1 (!) + 1 (\n от .строка_нуль) = 24 + 2 = 26 байт. len = 25 (без \0) msg_dead_2: .строка_нуль "Мертвый код 2!" .константа len_msg_dead_2 = 25 ; Длина "Мертвый код 2!" в UTF-8 без нулевого байта ; "Мертвый код 1!" = 12 букв * 2 байта (UTF-8) + 1 (!) + 1 (\n от .строка_нуль) = 24 + 2 = 26 байт. len = 25 (без \0) msg_dead_1: .строка_нуль "Мертвый код 1!" .константа len_msg_dead_1 = 25 ; Длина "Мертвый код 1!" в UTF-8 без нулевого байта