kvs/jumps/длин_тест3.квс
2025-11-08 20:42:59 +03:00

196 lines
8.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; длин_тест3.квс
; Тест: четыре длинных перехода и четыре мусорных сегмента
.текст
.глобал _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:
; --- ВЫВОД ЦЕЛЕВОГО СООБЩЕНИЯ ---
вывести_сообщение:
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, msg_success
переместить_имм рдикс, len_msg_success
вызов_системы
; --- ЗАВЕРШЕНИЕ ---
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
.данные
; Перемешиваем строки и константы
; "Успех!\n" = 5 букв * 2 + 1 (!) + 1 (\n от .строкауль) = 10 + 2 = 12 байт. len = 12
msg_success: .строкауль "Успех!\n"
.константа len_msg_success = 12
; "Мертвый код 4!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строкауль) = 14 + 4 + 1 = 19 байт. len = 19
msg_dead_4: .строкауль "Мертвый код 4!"
.константа len_msg_dead_4 = 19
; "Мертвый код 3!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строкауль) = 14 + 4 + 1 = 19 байт. len = 19
msg_dead_3: .строкауль "Мертвый код 3!"
.константа len_msg_dead_3 = 19
; "Мертвый код 2!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строкауль) = 14 + 4 + 1 = 19 байт. len = 19
msg_dead_2: .строкауль "Мертвый код 2!"
.константа len_msg_dead_2 = 19
; "Мертвый код 1!" = 7 букв * 2 + 4 символа * 1 + 1 (\n от .строкауль) = 14 + 4 + 1 = 19 байт. len = 19
msg_dead_1: .строкауль "Мертвый код 1!"
.константа len_msg_dead_1 = 19