Задачи
Задача 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.
global _start
extern printf
section .data
nums db 8, 4, 9, 3, 7, 6
nums_len equ $-nums
infostr db "Max number: %d"
section .text
_start:
mov rcx, nums_len
mov rax, 0
mainloop:
cmp [nums + rcx], rax
ja
loop mainloop
; print results
mov rsi, rax
mov rax, 0
mov rdi, infostr
call printf
mov rax, 60
syscall