Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2023, 11:02   #1
LeeHan
Пользователь
 
Регистрация: 23.03.2023
Сообщений: 10
По умолчанию Задание на строки

Определить номера слов в которых содержится больше одной цифры. Ввести строку символов (предусмотреть ввод пустой строки или строки из одних пробелов) Разделителями слов в строке могут быть (пробел , точка, запятая , двоеточие, точка с запятой). предусмотрет пользование множества для разделителей .
LeeHan вне форума Ответить с цитированием
Старый 20.04.2023, 15:06   #2
macomics
Участник клуба
 
Регистрация: 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.
macomics вне форума Ответить с цитированием
Старый 24.04.2023, 11:36   #3
LeeHan
Пользователь
 
Регистрация: 23.03.2023
Сообщений: 10
По умолчанию

macomics, pascalabc?)
LeeHan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание на строки :) zirko_o Паскаль, Turbo Pascal, PascalABC.NET 7 23.02.2014 18:02
Задание на строки scafandr Помощь студентам 0 14.05.2012 18:52
Строки задание britannia C# (си шарп) 3 25.03.2011 15:39
задание на строки Hikari Помощь студентам 8 29.10.2009 08:09