even_odd
This commit is contained in:
29
even_odd/.vscode/launch.json
vendored
Normal file
29
even_odd/.vscode/launch.json
vendored
Normal 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
53
even_odd/.vscode/tasks.json
vendored
Normal 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
80
even_odd/even_odd.asm
Normal 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
|
||||||
@@ -6,6 +6,9 @@
|
|||||||
{
|
{
|
||||||
"path": "sum"
|
"path": "sum"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "even_odd"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "docs"
|
"path": "docs"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
global _start
|
global _start
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
buff times 256 db 0
|
buff times 32 db 0
|
||||||
buffend:
|
buffend:
|
||||||
count dq 0
|
count dq 0
|
||||||
|
|
||||||
@@ -151,4 +151,4 @@ print_num_to_buf:
|
|||||||
sub rdi, rsi
|
sub rdi, rsi
|
||||||
inc rdi
|
inc rdi
|
||||||
mov [count], rdi
|
mov [count], rdi
|
||||||
ret
|
ret
|
||||||
|
|||||||
Reference in New Issue
Block a user