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": "even_odd"
|
||||
},
|
||||
{
|
||||
"path": "docs"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
global _start
|
||||
|
||||
section .data
|
||||
buff times 256 db 0
|
||||
buff times 32 db 0
|
||||
buffend:
|
||||
count dq 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user