This commit is contained in:
Пытков Роман
2025-09-23 01:24:01 +03:00
parent 8d019a59d7
commit 01c7a248ad
5 changed files with 167 additions and 2 deletions

29
even_odd/.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,29 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch x64",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/build/even_odd",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64",
},
{
"name": "(gdb) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/even_odd",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64"
},
{
"name": "(gdb+gcc) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/even_odd",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64+gcc"
}
]
}

53
even_odd/.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,53 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "asm64",
"type": "shell",
"command": [
"builddir=${workspaceFolder}/build;",
"mkdir -p $builddir;",
"rawfilename=$builddir/even_odd;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/even_odd.asm;",
"ld -g -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "asm64+gcc",
"type": "shell",
"command": [
"builddir=${workspaceFolder}/build;",
"mkdir -p $builddir;",
"rawfilename=$builddir/even_odd;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/even_odd.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

80
even_odd/even_odd.asm Normal file
View File

@@ -0,0 +1,80 @@
global _start
section .data
buff times 32 db 0
count dq 0
even db "Even"
evenCount dq $-even
odd db "Odd"
oddCount dq $-odd
section .text
default rel
_start:
call read_text
lea rsi, [buff]
add rsi, qword [count]
sub rsi, 2
mov rax, [rsi]
test rax, 0x1
jnz .even
.odd:
lea rsi, [even]
mov rdx, [evenCount]
jmp .write
.even:
lea rsi, [odd]
mov rdx, [oddCount]
.write:
call write_text
mov rax, 60
mov rdi, 0
syscall
; Функция читает текст в буффер
; Регистры не изменяет
read_text:
push rax
push rdi
push rsi
push rdx
mov rax, 0 ; sys_read
mov rdi, 0 ; stdin
lea rsi, [rel buff] ; адрес буфера
mov rdx, 256 ; количество байт
syscall
mov [count], rax
pop rdx
pop rsi
pop rdi
pop rax
ret
; Функция выводит buff
; In:
; - RSI - начало буфера
; - RDX - размер буфера
; Регистры не изменяет
write_text:
push rax
push rdi
push rsi
push rdx
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
syscall
mov [count], rax
pop rdx
pop rsi
pop rdi
pop rax
ret

View File

@@ -6,6 +6,9 @@
{
"path": "sum"
},
{
"path": "even_odd"
},
{
"path": "docs"
}

View File

@@ -1,7 +1,7 @@
global _start
section .data
buff times 256 db 0
buff times 32 db 0
buffend:
count dq 0
@@ -151,4 +151,4 @@ print_num_to_buf:
sub rdi, rsi
inc rdi
mov [count], rdi
ret
ret