diff --git a/is_digit/.vscode/launch.json b/is_digit/.vscode/launch.json new file mode 100644 index 0000000..3215459 --- /dev/null +++ b/is_digit/.vscode/launch.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/is_digit/.vscode/tasks.json b/is_digit/.vscode/tasks.json new file mode 100644 index 0000000..70c95a1 --- /dev/null +++ b/is_digit/.vscode/tasks.json @@ -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 + }, + } + ] +} \ No newline at end of file diff --git a/is_digit/is_digit.asm b/is_digit/is_digit.asm new file mode 100644 index 0000000..02b2fb7 --- /dev/null +++ b/is_digit/is_digit.asm @@ -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 \ No newline at end of file diff --git a/min/.vscode/launch.json b/min/.vscode/launch.json new file mode 100644 index 0000000..d5e55e6 --- /dev/null +++ b/min/.vscode/launch.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/min/.vscode/tasks.json b/min/.vscode/tasks.json new file mode 100644 index 0000000..40e188e --- /dev/null +++ b/min/.vscode/tasks.json @@ -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 + }, + } + ] +} \ No newline at end of file diff --git a/min/min.asm b/min/min.asm new file mode 100644 index 0000000..8f5bd39 --- /dev/null +++ b/min/min.asm @@ -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 diff --git a/nasm.code-workspace b/nasm.code-workspace index 6e71d7c..999dc31 100644 --- a/nasm.code-workspace +++ b/nasm.code-workspace @@ -12,6 +12,12 @@ { "path": "repeat_str" }, + { + "path": "min" + }, + { + "path": "is_digit" + }, { "path": "docs" },