Больше или меньше 10
This commit is contained in:
29
stepik_base/less_greater_10/.vscode/launch.json
vendored
Normal file
29
stepik_base/less_greater_10/.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/less_greater_10",
|
||||||
|
"cwd": "${workspaceFolder}/build",
|
||||||
|
"preLaunchTask": "asm64",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "(gdb) Launch x64",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/less_greater_10",
|
||||||
|
"cwd": "${workspaceFolder}/build",
|
||||||
|
"preLaunchTask": "asm64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "(gdb+gcc) Launch x64",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/less_greater_10",
|
||||||
|
"cwd": "${workspaceFolder}/build",
|
||||||
|
"preLaunchTask": "asm64+gcc"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
53
stepik_base/less_greater_10/.vscode/tasks.json
vendored
Normal file
53
stepik_base/less_greater_10/.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/less_greater_10;",
|
||||||
|
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/less_greater_10.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/less_greater_10;",
|
||||||
|
"nasm -gdwarf -f elf64 -o $rawfilename.o ${workspaceFolder}/less_greater_10.asm;",
|
||||||
|
"gcc -o $rawfilename $rawfilename.o;"
|
||||||
|
],
|
||||||
|
"problemMatcher": {
|
||||||
|
"pattern": {
|
||||||
|
"regexp": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"focus": true,
|
||||||
|
"panel": "dedicated",
|
||||||
|
"reveal": "silent",
|
||||||
|
"clear": true
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
108
stepik_base/less_greater_10/less_greater_10.asm
Normal file
108
stepik_base/less_greater_10/less_greater_10.asm
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
; Макрос для вывода сообщения
|
||||||
|
; In:
|
||||||
|
; - %1 - указатель на буффер с сообщением
|
||||||
|
; - %2 - длина сообщения
|
||||||
|
%macro PRINT_MSG 2
|
||||||
|
mov rsi, %1
|
||||||
|
mov rdx, %2
|
||||||
|
mov rdi, 1 ; stdout
|
||||||
|
|
||||||
|
mov rax, 1 ; sys_write
|
||||||
|
syscall
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
global _start
|
||||||
|
|
||||||
|
section .data
|
||||||
|
g_buff times 32 db 0
|
||||||
|
g_buff_end:
|
||||||
|
g_len dq 0
|
||||||
|
|
||||||
|
g_less_or_equal db "Less than or equal to 10"
|
||||||
|
g_less_or_equal_len dq $-g_less_or_equal
|
||||||
|
g_greater db "Greater than 10"
|
||||||
|
g_greater_len dq $-g_greater
|
||||||
|
|
||||||
|
section .text
|
||||||
|
default rel
|
||||||
|
|
||||||
|
_start:
|
||||||
|
call read_text
|
||||||
|
|
||||||
|
lea rsi, [rel g_buff] ; поставить указатель на начало буфера
|
||||||
|
call read_num
|
||||||
|
|
||||||
|
cmp rax, 10
|
||||||
|
jle .le
|
||||||
|
.g:
|
||||||
|
lea rdi, [g_greater]
|
||||||
|
mov rdx, [g_greater_len]
|
||||||
|
jmp .print
|
||||||
|
.le:
|
||||||
|
lea rdi, [g_less_or_equal]
|
||||||
|
mov rdx, [g_less_or_equal_len]
|
||||||
|
|
||||||
|
.print:
|
||||||
|
PRINT_MSG rdi, rdx
|
||||||
|
|
||||||
|
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_len], 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, [g_buff] ; rdi - конец данных
|
||||||
|
add rdi, [g_len]
|
||||||
|
|
||||||
|
.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
|
||||||
@@ -18,6 +18,9 @@
|
|||||||
{
|
{
|
||||||
"path": "macro"
|
"path": "macro"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "less_greater_10"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "../docs"
|
"path": "../docs"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user