Задачи
Задача 1.
Вычислить выражение: (a + b) * c - d, где a=5, b=3, c=4, d=8. Результат вывести в консоль.
global main
extern printf
section .data
cura dd 5
curb dd 3
curc dd 4
curd dd 8
mymsg db "%d",10,0
section .text
main:
mov eax, 0
add eax, [cura]
add eax, [curb]
mov edx, [curc]
mul dword [curc]; in ax (a+b)*c
sub eax, [curd]
mov rsi, rax ; print results
mov rax, 0
mov rdi, mymsg
call printf
ret
Проверяет: Работу с регистрами, базовые арифметические операции.
Задача 2.
Перевернуть строку "Hello!" и вывести. Не использовать внешние функции кроме системных вызовов.
global _start
section .data
msg db "abcdefg",10,0
msg_full_len equ $-msg
msg_half_len equ (msg_full_len - 2)/2
section .text
_start:
; mirroring string
mov rcx, msg_half_len
mov r8, msg_full_len - 3
mov r9, 0
mov rsi, msg
loop:
mov bl, [rsi + r8]
mov dl, [rsi + r9]
mov [rsi + r9], bl
mov [rsi + r8], dl
dec r8
inc r9
dec rcx
jnz loop
; printing string
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_full_len-1
syscall
mov rax, 60
mov rdi, 0
syscall
Проверяет: Работу с памятью, циклами, обработку строк.
Задача 3.
В массиве чисел [7, 2, 9, 1, 5] найти максимальный элемент и вывести его.
global main
extern printf
section .data
nums db 7, 2, 9, 1, 5
nums_len equ $-nums
infostr db "Max number: %d",10,0
section .text
main:
mov rcx, nums_len
mov rax, 0
mainloop:
cmp byte [nums + rcx-1], al
ja new_max
dec rcx
jnz mainloop
jmp progend
new_max:
mov al, [nums + rcx -1]
dec rcx
jnz mainloop
progend:
mov rsi, rax
mov rax, 0
mov rdi, infostr
call printf
mov rax, 60
syscall
Проверяет: Работу с массивами, условные переходы.
Задача 4.
Реализуйте рекурсивную функцию вычисления факториала для n=5
Проверяет: Понимание стека, рекурсии, соглашений о вызовах.
Задача 5.