Перенос stepik в подпапку

This commit is contained in:
Пытков Роман
2025-09-23 17:48:53 +03:00
parent 6a90ff02c8
commit 184eeb8525
22 changed files with 282 additions and 35 deletions

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
stepik_base/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
},
}
]
}

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

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

53
stepik_base/is_digit/.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/is_digit;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/is_digit.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/is_digit;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/is_digit.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

View File

@@ -0,0 +1,79 @@
global _start
section .data
g_buff times 10 db 0
g_buffLen dq 0
g_digit db "Digit"
g_digitLen dq $-g_digit
g_notDigit db "Not a digit"
g_notDigitLen dq $-g_notDigit
section .text
default rel
_start:
call read_text
movzx rax, byte [g_buff] ; первый символ
cmp rax, '0'
jl .notDigit
cmp rax, '9'
jg .notDigit
.digit:
lea rsi, [g_digit]
mov rdx, [g_digitLen]
jmp .write
.notDigit:
lea rsi, [g_notDigit]
mov rdx, [g_notDigitLen]
.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 g_buff] ; адрес буфера
mov rdx, 256 ; количество байт
syscall
mov [g_buffLen], 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 [g_buffLen], rax
pop rdx
pop rsi
pop rdi
pop rax
ret

29
stepik_base/macro/.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/macro",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64",
},
{
"name": "(gdb) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/macro",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64"
},
{
"name": "(gdb+gcc) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/macro",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64+gcc"
}
]
}

53
stepik_base/macro/.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/macro;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/macro.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/macro;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/macro.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

View File

@@ -0,0 +1,27 @@
; Макрос для вывода сообщения
; In:
; - %1 - указатель на буффер с сообщением
; - %2 - длина сообщения
%macro PRINT_MSG 2
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, %1
mov rdx, %2
syscall
%endmacro
global _start
section .data
g_msg db "Hello, Stepic!"
g_msg_len dq $-g_msg
section .text
default rel
_start:
PRINT_MSG g_msg, [g_msg_len]
mov rax, 60
mov rdi, 0
syscall

29
stepik_base/min/.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/min",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64",
},
{
"name": "(gdb) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/min",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64"
},
{
"name": "(gdb+gcc) Launch x64",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/min",
"cwd": "${workspaceFolder}/build",
"preLaunchTask": "asm64+gcc"
}
]
}

53
stepik_base/min/.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/min;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/min.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/min;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/min.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

94
stepik_base/min/min.asm Normal file
View File

@@ -0,0 +1,94 @@
global _start
section .data
arr db 5, 7, 3, 1, 2
arrEnd:
buff times 32 db 0
buffend:
count dq 0
section .text
default rel
_start:
mov al, 0xFF
lea rsi, [arr]
lea rdi, [arrEnd]
.while:
movzx rbx, byte [rsi] ; текущее число
cmp rbx, rax
cmovl rax, rbx
inc rsi
cmp rsi, rdi
jne .while
call print_num_to_buf
mov rdx, [count]
call write_text
mov rax, 60
mov rdi, 0
syscall
; Функция выводит 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
; Функция выводит число в buff
; In: RAX
; Out: RSI - указатель на начало строки
print_num_to_buf:
lea rsi, [buffend]
dec rsi
mov rdi, rsi ; сохранить последний адрес
mov byte [rsi], 0 ; вписать нуль
dec rsi
mov byte [rsi], 0xA ; вписать перенос строки
dec rsi
mov byte [rsi], '0'
test rax, rax
jz .return
mov rcx, 10 ; десятичный делитель
.while:
xor rdx, rdx
test rax, rax
jz .break
div rcx
or dl, 0x30
mov [rsi], dl
dec rsi
jmp .while
.break:
inc rsi
.return:
sub rdi, rsi
inc rdi
mov [count], rdi
ret

View File

@@ -0,0 +1,30 @@
{
"folders": [
{
"path": "sum"
},
{
"path": "even_odd"
},
{
"path": "repeat_str"
},
{
"path": "min"
},
{
"path": "is_digit"
},
{
"path": "macro"
},
{
"path": "../docs"
},
],
"settings": {
"debug.allowBreakpointsEverywhere": true,
"debug.inlineValues": "on",
"editor.codeLens": false,
}
}

View File

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

View File

@@ -0,0 +1,53 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "asm64",
"type": "shell",
"command": [
"builddir=${workspaceFolder}/build;",
"mkdir -p $builddir;",
"rawfilename=$builddir/repeat_str;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/repeat_str.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/repeat_str;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/repeat_str.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

View File

@@ -0,0 +1,130 @@
global _start
section .data
buff times 256 db 0
buffSize dq $-buff
count dq 0
section .text
default rel
_start:
lea rsi, [buff]
lea rdi, [count]
mov rdx, [buffSize]
call read_text
mov al, 0xA
lea rdi, [buff]
mov rcx, [count]
repne scasb
; Теперь rdi указывает на символ после \n
; Вычисляем длину строки: rdi - buff
lea rax, [buff]
sub rdi, rax
mov [count], rdi ; Сохраняем длину строки в count
; rsi уже установлен на buff + длина строки, т.е. на числе
mov rsi, rax
add rsi, rdi
mov rdx, 256
call read_num
mov rcx, rax
jrcxz .return
.while:
lea rsi, [buff]
mov rdx, [count]
call write_text
loop .while
.return:
mov rax, 60
mov rdi, 0
syscall
; Функция читает текст в буффер
; In:
; - RSI - указатель на буффер
; - RDI - указатель на адрес для сохранения длины
; - RDX - длина буффера
; Регистры не изменяет
read_text:
push rax
push rdi
mov rax, 0 ; sys_read
mov rdi, 0 ; stdin
syscall
pop rdi
mov [rdi], rax
pop rax
ret
; Функция выводит buff
; In:
; - RSI - начало буфера
; - RDX - размер буфера
; Регистры не изменяет
write_text:
push rcx
push rax
push rsi
push rdx
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
syscall
pop rdx
pop rsi
pop rax
pop rcx
ret
; Функция читает число из буфера
; In:
; - RSI - указатель на буффер
; - RDX - длина буффера
; Out:
; - RAX - число
read_num:
push rbx
push rcx
xor rbx, rbx ; обнулить регистр для символов
xor rax, rax ; обнулить аккумулирующий регистр
mov rcx, 10 ; множитель для сдвига
mov rdi, rsi
add rdi, rdx
.while:
cmp rsi, rdi ; сначала проверяем границы, чтобы не читать за пределами
jge .return
mov bl, [rsi] ; прочитать текущий символ
cmp bl, 0xA ; если конец строки (\n) - закончить
je .return
cmp bl, 0x0 ; если null (\0) - закончить
jz .return
cmp bl, ' ' ; если пробел - закончить
jz .return
mul rcx
and bl, 0x0F
add rax, rbx
inc rsi
jmp .while
.return:
pop rcx
pop rbx
ret

21
stepik_base/sum/.vscode/launch.json vendored Normal file
View File

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

53
stepik_base/sum/.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/sum;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/sum.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/sum;",
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/sum.asm;",
"gcc -o $rawfilename $rawfilename.o;"
],
"problemMatcher": {
"pattern": {
"regexp": "error"
}
},
"presentation": {
"focus": true,
"panel": "dedicated",
"reveal": "silent",
"clear": true
},
}
]
}

154
stepik_base/sum/sum.asm Normal file
View File

@@ -0,0 +1,154 @@
global _start
section .data
buff times 32 db 0
buffend:
count dq 0
section .text
default rel
_start:
call read_text
lea rsi, [rel buff] ; поставить указатель на начало буфера
call read_num
mov rbx, rax
inc rsi
call read_num
mov rdi, rax
mov rsi, rbx
call calculate_sum
call print_num_to_buf
mov rdx, [count]
call write_text
mov rax, 60
mov rdi, 0
syscall
; Функция складывает два значения
; In: RDI, RSI
; Out: RAX
calculate_sum:
lea rax, [rdi + rsi]
ret
; Функция читает текст в буффер
; Регистры не изменяет
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
; Функция читает число из stdin
; Out: RAX
read_num:
push rbx
push rcx
xor rbx, rbx ; обнулить регистр для символов
xor rax, rax ; обнулить аккумулирующий регистр
mov rcx, 10 ; множитель для сдвига
lea rdi, [rel buff] ; rdi - конец данных
add rdi, [count]
.while:
cmp rsi, rdi ; сначала проверяем границы, чтобы не читать за пределами
jge .return
mov bl, [rsi] ; прочитать текущий символ
cmp bl, 0xA ; если конец строки (\n) - закончить
je .return
cmp bl, 0 ; если null (\0) - закончить
jz .return
cmp bl, ' ' ; если пробел - закончить
jz .return
mul rcx
and bl, 0x0F
add rax, rbx
inc rsi
jmp .while
.return:
pop rcx
pop rbx
ret
; Функция выводит число в buff
; In: RAX
; Out: RSI - указатель на начало строки
print_num_to_buf:
lea rsi, [buffend]
dec rsi
mov rdi, rsi ; сохранить последний адрес
mov byte [rsi], 0 ; вписать нуль
dec rsi
mov byte [rsi], 0xA ; вписать перенос строки
dec rsi
mov byte [rsi], '0'
test rax, rax
jz .return
mov rcx, 10 ; десятичный делитель
.while:
xor rdx, rdx
test rax, rax
jz .break
div rcx
or dl, 0x30
mov [rsi], dl
dec rsi
jmp .while
.break:
inc rsi
.return:
sub rdi, rsi
inc rdi
mov [count], rdi
ret