375 lines
17 KiB
Plaintext
375 lines
17 KiB
Plaintext
; длин_тест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
|
||
переместить_имм рдиай, 2
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 3
|
||
переместить_имм рдиай, 3
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 4
|
||
переместить_имм рдиай, 4
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 5
|
||
переместить_имм рдиай, 5
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 6
|
||
переместить_имм рдиай, 6
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 7
|
||
переместить_имм рдиай, 7
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 8
|
||
переместить_имм рдиай, 8
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 9
|
||
переместить_имм рдиай, 9
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 10
|
||
переместить_имм рдиай, 10
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 11
|
||
переместить_имм рдиай, 11
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 12
|
||
переместить_имм рдиай, 12
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 13
|
||
переместить_имм рдиай, 13
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 14
|
||
переместить_имм рдиай, 14
|
||
переместить_имм рсиай, msg_dead_1
|
||
переместить_имм рдикс, len_msg_dead_1
|
||
вызов_системы
|
||
переместить_имм раикс, 15
|
||
переместить_имм рдиай, 15
|
||
переместить_имм рсиай, 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
|