; сложный_тест6.квс ; Тест: семь переходов и семь мусорных сегментов .текст .глобал _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: ; ЧЕТВЁРТЫЙ ПЕРЕХОД: короткий_переход_если_больше ; Сравниваем rax (10) и rbx (5) -> rax > rbx, ZF=0, SF=0, OF=0 сравнить раикс, рбикс ; Условие jg: ZF=0 (истина) И SF=OF (0=0, истина). jg СРАБОТАЕТ. ; Мы хотим прыгнуть МИМО мертвого кода 4, если jg сработает (т.е. если rax > rbx). короткий_переход_если_больше мимо_мертвого_кода_4 ; --- МЕРТВЫЙ КОД 4 --- ; Этот код НЕ должен выполниться (так как jg сработал) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_4 переместить_имм рдикс, len_msg_dead_4 вызов_системы ; --------------------- мимо_мертвого_кода_4: ; ПЯТЫЙ ПЕРЕХОД: короткий_переход_если_меньше_или_равно (и безусловный) ; Сравниваем rax (10) и rbx (5) -> rax > rbx, ZF=0, SF=0, OF=0 сравнить раикс, рбикс ; Условие jle: ZF=1 ИЛИ SF != OF. ZF=0 (ложь), SF != OF (0 != 0, ложь). jle НЕ сработает. ; Мы хотим прыгнуть МИМО мертвого кода 5, если jle НЕ сработает (т.е. если rax > rbx). ; Используем: jle skip_jmp_5 (переход НЕ сработает); jmp мимо_мертвого_кода_5 (переход СРАБОТАЕТ) короткий_переход_если_меньше_или_равно skip_jmp_5 короткий_переход мимо_мертвого_кода_5 skip_jmp_5: ; --- МЕРТВЫЙ КОД 5 --- ; Этот код НЕ должен выполниться (так как jle не сработал) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_5 переместить_имм рдикс, len_msg_dead_5 вызов_системы ; --------------------- мимо_мертвого_кода_5: ; ШЕСТОЙ ПЕРЕХОД: короткий_переход_если_больше_или_равно ; Сравниваем rax (10) и rbx (5) -> rax > rbx, ZF=0, SF=0, OF=0 сравнить раикс, рбикс ; Условие jge: SF=OF. SF=0, OF=0, SF=OF (0=0). jge СРАБОТАЕТ. ; Мы хотим прыгнуть МИМО мертвого кода 6, если jge сработает (т.е. если rax >= rbx). короткий_переход_если_больше_или_равно мимо_мертвого_кода_6 ; --- МЕРТВЫЙ КОД 6 --- ; Этот код НЕ должен выполниться (так как jge сработал) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_6 переместить_имм рдикс, len_msg_dead_6 вызов_системы ; --------------------- мимо_мертвого_кода_6: ; СЕДЬМОЙ ПЕРЕХОД: короткий_переход_если_перенос ; Выполним вычитание, которое вызовет перенос: rbx - rax = 5 - 10 переместить_имм рбикс, 5 ; rbx = 5 переместить_имм раикс, 10 ; rax = 10 ; rbx - rax = 5 - 10 -> CF=1 вычесть рбикс, раикс ; rbx = rbx - rax = 5 - 10. Это вызовет перенос (CF=1). ; Условие jc: CF=1. CF=1. jc СРАБОТАЕТ. ; Мы хотим прыгнуть МИМО мертвого кода 7, если jc сработает (т.е. если был перенос). короткий_переход_если_перенос мимо_мертвого_кода_7 ; --- МЕРТВЫЙ КОД 7 --- ; Этот код НЕ должен выполниться (так как jc сработал) переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_dead_7 переместить_имм рдикс, len_msg_dead_7 вызов_системы ; --------------------- мимо_мертвого_кода_7: ; --- ВЫВОД ЦЕЛЕВОГО СООБЩЕНИЯ --- вывести_сообщение: переместить_имм раикс, 1 переместить_имм рдиай, 1 переместить_имм рсиай, msg_success переместить_имм рдикс, len_msg_success вызов_системы ; --- ЗАВЕРШЕНИЕ --- переместить_имм раикс, 60 переместить_имм рдиай, 0 вызов_системы .данные ; Перемешиваем строки и константы ; "Успех!\n" = 5 букв * 2 + 1 (!) + 2 (\n) = 13 байт на содержимое. len = 13 msg_success: .строка_нуль "Успех!\n" .константа len_msg_success = 13 ; "Мертвый код 7!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_7: .строка_нуль "Мертвый код 7!" .константа len_msg_dead_7 = 18 ; "Мертвый код 6!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_6: .строка_нуль "Мертвый код 6!" .константа len_msg_dead_6 = 18 ; "Мертвый код 5!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_5: .строка_нуль "Мертвый код 5!" .константа len_msg_dead_5 = 18 ; "Мертвый код 4!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_4: .строка_нуль "Мертвый код 4!" .константа len_msg_dead_4 = 18 ; "Мертвый код 3!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_3: .строка_нуль "Мертвый код 3!" .константа len_msg_dead_3 = 18 ; "Мертвый код 2!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_2: .строка_нуль "Мертвый код 2!" .константа len_msg_dead_2 = 18 ; "Мертвый код 1!" = 7 букв * 2 + 4 символа * 1 = 14 + 4 = 18 байт на содержимое. len = 18 msg_dead_1: .строка_нуль "Мертвый код 1!" .константа len_msg_dead_1 = 18