id_digit и min
This commit is contained in:
29
is_digit/.vscode/launch.json
vendored
Normal file
29
is_digit/.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/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
is_digit/.vscode/tasks.json
vendored
Normal file
53
is_digit/.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/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
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
79
is_digit/is_digit.asm
Normal file
79
is_digit/is_digit.asm
Normal 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
min/.vscode/launch.json
vendored
Normal file
29
min/.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/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
min/.vscode/tasks.json
vendored
Normal file
53
min/.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/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
min/min.asm
Normal file
94
min/min.asm
Normal 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
|
||||||
@@ -12,6 +12,12 @@
|
|||||||
{
|
{
|
||||||
"path": "repeat_str"
|
"path": "repeat_str"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "min"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "is_digit"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "docs"
|
"path": "docs"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user