Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Код:
; fasm1 ver. 1.73.30
; Linux x86_64 executable
format ELF64 executable 3
EOLN fix 0xa
kb fix *1024
Mb fix *1048576
struc STRA text& { . db text, 0 }
segment executable
entry $
push 12
xor rdi, rdi
pop rax
syscall
push 12
mov rbx, rax
lea rdi, [rax + 1 Mb]
pop rax
syscall
mov rcx, [rsp]
lea rdx, [rsp + 8]
push 1 Mb
push rbx
push rdx
push rcx
call main
push 60
xor rdi, rdi
pop rax
syscall
print: ; rax = Handle; rdx = String
push rdi
push rsi
push 1
push rax
mov rdi, rdx
xor al, al
or rcx, -1
repne scas byte [rdi]
sub rdi, rdx
mov rsi, rdx
lea rdx, [rdi - 1]
pop rdi
pop rax
syscall
pop rsi
pop rdi
retn
read: ; rax = Handle; rdx = Buffer; rcx = Length
push rdi
push rsi
push 0
mov rsi, rdx
mov rdx, rcx
mov rdi, rax
pop rax
syscall
pop rsi
pop rdi
retn
main:
virtual at rbp-.loclen
label .locvar
.buff db 64 dup ?
label .loclen at ( 0 - 16 ) and ( $ - .locvar + 15 )
rq 2
label .argvar
.argc dq ?
.argv dq ?
.memo dq ?
.size dq ?
label .arglen at ( 0 - 16 ) and ( $ - .argvar + 15 )
end virtual
enter .loclen, 0
push 1
lea rdx, [.hello]
pop rax
call print
push 0
mov rcx, [.size]
mov rdx, [.memo]
pop rax
call read
mov r9, rsp
push 1
mov ebx, eax
mov rsi, [.memo]
lea rdx, [rsi + rax]
xor r11, r11
xor r10, r10
pop r8
cmp eax, 1
ja .loop
push 1
lea rdx, [.empty]
pop rax
call print
leave
retn .arglen
.loop:
lea rdi, [.delim]
mov rcx, .count
lods byte [rsi]
nop
repne scas byte [rdi]
jz .next_word
inc r11
cmp al, '0'
jb @f
cmp al, '9'
ja @f
inc r10
@@:
cmp rsi, rdx
jl .loop
.next_word:
cmp al, ' '
jnz @f
dec ebx
@@:
cmp r10, 1
jle @f
push r8
@@:
cmp r11, 0
jle @f
inc r8
@@:
xor r10, r10
xor r11, r11
cmp rsi, rdx
jl .loop
cmp ebx, 1
ja @f
push 1
lea rdx, [.space]
pop rax
call print
leave
retn .arglen
@@:
lea rsi, [r9 - 8]
mov dword [.buff + 60], 0
cmp rsi, rsp
jge .number
leave
retn .arglen
.number:
std
mov rcx, 10
lods qword [rsi]
lea rdi, [.buff + 59]
@@:
cqo
div rcx
xchg al, dl
add al, '0'
stos byte [rdi]
xchg al, dl
test rax, rax
jnz @b
cld
push 1
lea rdx, [rdi + 1]
pop rax
call print
cmp rsi, rsp
jl @f
push 1
lea rdx, [.comma]
pop rax
call print
jmp .number
@@:
push 1
lea rdx, [.newln]
pop rax
call print
leave
retn .arglen
.hello STRA 'Введите строку: '
.empty STRA 'Вы ввели пустую строку!', EOLN
.space STRA 'Вы ввели строку из одних пробелов!', EOLN
.comma STRA ', '
.newln STRA EOLN
.delim db ' .,:;'
.count = $ - .delim
Код:
$ make
fasm -m 102400 ./main.asm ./main.x86_64
flat assembler version 1.73.30 (102400 kilobytes memory, x64)
2 passes, 658 bytes.
readelf -h ./main.x86_64
Заголовок ELF:
Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
Класс: ELF64
Данные: дополнение до 2, от младшего к старшему
Version: 1 (current)
OS/ABI: UNIX - GNU
Версия ABI: 0
Тип: EXEC (Исполняемый файл)
Машина: Advanced Micro Devices X86-64
Версия: 0x1
Адрес точки входа: 0x400078
Начало заголовков программы: 64 (байт в файле)
Начало заголовков раздела: 0 (байт в файле)
Флаги: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 1
Size of section headers: 64 (bytes)
Number of section headers: 0 (64)
Section header string table index: 0
$ ./main.x86_64
Введите строку:
Вы ввели строку из одних пробелов!
$ ./main.x86_64
Введите строку:
Вы ввели пустую строку!
$ ./main.x86_64
Введите строку: 1234567890:abracadabra Привет мир; 100 процентов, этого не может быть.999
1, 5, 11
$ ./main.x86_64 < main.asm
Введите строку: 2, 6, 7, 15, 16, 17, 27, 29, 32, 68, 78, 86, 103, 111, 121, 123, 164, 165, 166, 183, 185, 195, 196, 198, 199, 201, 202, 203, 222, 231, 236
Последний раз редактировалось macomics; 20.04.2023 в 16:35.
|