Код в фильмах: Кракен 2025

Не собирался смотреть этот фильм, но надысь Баженов выложил на него обзор, и на одном из кадров мелькнул фрагмент, по очертаниям очень похожий на ассемблерный код. Пришлось ознакомиться.
Весь фильм, то тут, то там показывают разного рода мониторы, но ничего конкретного на них не разобрать. Жуткое мыло.
Но в конце, в ключевой сцене таки случилось интересное.
Сцена запуска мандулы “супер-оружия”:

Внизу чётко виден ассемблерный код. Это фрагмент из учебника по программированию. Рисуем на экране девять звёздочек в ряд.
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
После такой годной зацепки становится возможным разобрать мыльные фрагменты.
Сцена с таймером самоуничтожения:

Фрагмент с кодом очень размытый:

но, благодаря подсказке в предыдущей сцене, его получается идентифицировать. Слева код из того же учебника, вычисляет и выводит на экран сумму чисел 3 и 4. А справа код чуть сложнее: вычисляется сумма чисел 12345 и 23456 в двоично-десятичном представлении.
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax,'3'
sub eax, '0'
mov ebx, '4'
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,sum
mov edx, 1
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db "The sum is:", 0xA,0xD
len equ $ - msg
segment .bss
sum resb 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov esi, 4 ;pointing to the rightmost digit
mov ecx, 5 ;num of digits
clc
add_loop:
mov al, [num1 + esi]
adc al, [num2 + esi]
aaa
pushf
or al, 30h
popf
mov [sum + esi], al
dec esi
loop add_loop
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,5 ;message length
mov ecx,sum ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'The Sum is:',0xa
len equ $ - msg
num1 db '12345'
num2 db '23456'
sum db ' '
Теперь можно попробовать по смутным очертаниям догадаться, что там было в середине фильма, в сцене, где герои пытались деактивировать своё “супер-оружие”:

Тут сложнее! Так просто не деактивировать! Слева вычисляем факториал числа 3. А в правом фрагменте - пример модификации строк в памяти на примере замены имени: “Zara” -> “Nuha”. Программа выводит “Zara Ali Nuha Ali”.
Да, авторы учебника - индусы.
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov bx, 3 ;for calculating factorial 3
call proc_fact
add ax, 30h
mov [fact], ax
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,1 ;message length
mov ecx,fact ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
proc_fact:
cmp bl, 1
jg do_calculation
mov ax, 1
ret
do_calculation:
dec bl
call proc_fact
inc bl
mul bl ;ax = al * bl
ret
section .data
msg db 'Factorial 3 is:',0xa
len equ $ - msg
section .bss
fact resb 1
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
;writing the name 'Zara Ali'
mov edx,9 ;message length
mov ecx, name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov [name], dword 'Nuha' ; Changed the name to Nuha Ali
;writing the name 'Nuha Ali'
mov edx,8 ;message length
mov ecx,name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
name db 'Zara Ali '
А в сцене стрельбы из этого оружия теперь становится понятно, что вычисления нужны те же, что и для самоуничтожения: посчитать сумму 3 и 4. И сложить 12345 с 23456.
