Показать сообщение отдельно
Саша Герасимов
в Бане
Сообщения: 12,864
Регистрация: 11.01.2008
Откуда: Кокчетав
Старый пост, нажмите что бы добавить к себе блог 23 января 2010, 22:12
ВКонтакте Отправить сообщение через twitter для Саша Герасимов
  #331 (ПС)
-Цитата от Илья Имлав Посмотреть сообщение
Была подобная лаба, вот глянь.

Образовать строку, повторив фрагмент исходной строки с за¬данной позиции данной длины требуемое число раз.
Показать скрытый текст

.386
.MODEL FLAT, STDCALL

; прототипы внешних процедур описываются директивой EXTERN,
; после знака @ указывается общая длина передаваемых параметров,
; после двоеточия указывается дистанция «ближняя» – NEAR

EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN ReadConsoleA@20:NEAR
EXTERN ExitProcess@4:NEAR ; функция выхода из программы
EXTERN lstrlenA@4:NEAR ; функция определения длины строки

; includelib user32.lib
; includelib kernel32.lib

; сегмент данных
.DATA
H_OUT DD ? ; дескриптор вывода (директива DD резервирует память

; объемом 32 бита (4 байта))

H_IN DD ? ; дескриптор ввода
STRN1 DB "Введите строку: ",13,10,0 ; выводимая строка,
STRN2 DB "Введите начальную позицию: ",13,10,0 ; выводимая строка,
STRN3 DB "Введите длину сегмента: ",13,10,0 ; выводимая строка,
STRN4 DB "Введите количество повторений: ",13,10,0 ; выводимая строка,

; управляющие символы: 13 – возврат каретки, 10 – переход на новую
; строку, 0 – конец строки (с использованием директивы DB
; резервируется массив байтов)

LEN_BUF DW ?
LEN DW ?
IN_BUF DB 200 dup (?); буфер для вводимой строки
OUT_BUF DB 200 dup (?); буфер для выводимой строки
STR_TMP DB 20 dup (?); буфер для выводимой строки

POS DD ?
LENG DD ?
COUNT DD ?


; сегмент кода
.CODE
START:

; метка точки входа
; перекодируем строку

PUSH OFFSET STRN1 ; OFFSET – операция, возвращающая смещение
PUSH OFFSET STRN1
CALL CharToOemA@8

PUSH OFFSET STRN2 ; OFFSET – операция, возвращающая смещение
PUSH OFFSET STRN2
CALL CharToOemA@8

PUSH OFFSET STRN3 ; OFFSET – операция, возвращающая смещение
PUSH OFFSET STRN3
CALL CharToOemA@8

PUSH OFFSET STRN4 ; OFFSET – операция, возвращающая смещение
PUSH OFFSET STRN4
CALL CharToOemA@8


; получить дескриптор ввода

PUSH -10
CALL GetStdHandle@4
MOV H_IN, EAX

; получить дескриптор вывода

PUSH -11
CALL GetStdHandle@4
MOV H_OUT, EAX

; определение длины строки

PUSH OFFSET STRN1 ; в стек помещается указатель на строку
CALL lstrlenA@4 ; длина в EAX

; вызов функции WriteConsoleA для вывода строки STRN

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH EAX ; 3-й параметр
PUSH OFFSET STRN1 ; 2-й параметр
PUSH H_OUT ; 1-й параметр
CALL WriteConsoleA@20

; ввод строки

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN_BUF ; 4-й параметр
PUSH 200 ; 3-й параметр
PUSH OFFSET IN_BUF ; 2-й параметр
PUSH H_IN ; 1-й параметр
CALL ReadConsoleA@20

PUSH OFFSET STRN2 ; в стек помещается указатель на строку
CALL lstrlenA@4 ; длина в EAX

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH EAX ; 3-й параметр
PUSH OFFSET STRN2 ; 2-й параметр
PUSH H_OUT ; 1-й параметр
CALL WriteConsoleA@20

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH 200 ; 3-й параметр
PUSH OFFSET STR_TMP ; 2-й параметр
PUSH H_IN ; 1-й параметр
CALL ReadConsoleA@20

push offset POS
push offset STR_TMP
call _StrToINT@8

PUSH OFFSET STRN3 ; в стек помещается указатель на строку
CALL lstrlenA@4 ; длина в EAX

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH EAX ; 3-й параметр
PUSH OFFSET STRN3 ; 2-й параметр
PUSH H_OUT ; 1-й параметр
CALL WriteConsoleA@20

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH 200 ; 3-й параметр
PUSH OFFSET STR_TMP ; 2-й параметр
PUSH H_IN ; 1-й параметр
CALL ReadConsoleA@20

push offset LENG
push offset STR_TMP
call _StrToINT@8

PUSH OFFSET STRN4 ; в стек помещается указатель на строку
CALL lstrlenA@4 ; длина в EAX

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH EAX ; 3-й параметр
PUSH OFFSET STRN4 ; 2-й параметр
PUSH H_OUT ; 1-й параметр
CALL WriteConsoleA@20

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH 200 ; 3-й параметр
PUSH OFFSET STR_TMP ; 2-й параметр
PUSH H_IN ; 1-й параметр
CALL ReadConsoleA@20

push offset COUNT
push offset STR_TMP
call _StrToINT@8

; проведение операций над строками

push COUNT ; 5й параметр количество повторений
push LENG ; 4й параметр длина сегмента
push POS ; 3й параметр позиция сегмента
push offset OUT_BUF ; 2й параметр указатель на примник
push offset IN_BUF ; 1й параметр указатель на источник
call _Ololo@20

; вывод полученной строки

PUSH OFFSET OUT_BUF ; в стек помещается указатель на строку
CALL lstrlenA@4 ; длина в EAX

; вызов функции WriteConsoleA для вывода строки STRN

PUSH 0 ; в стек помещается 5-й параметр
PUSH OFFSET LEN ; 4-й параметр
PUSH EAX ; 3-й параметр
PUSH OFFSET OUT_BUF ; 2-й параметр
PUSH H_OUT ; 1-й параметр
CALL WriteConsoleA@20

; небольшая задержка

MOV ECX,01FFFFFFFH
L1:
LOOP L1

; выход из программы

PUSH 0 ; параметр: код выхода
CALL ExitProcess@4

_StrToINT@8 proc ; перегонка строки в число
push ebp
mov ebp,esp
mov esi,[ebp+8]
mov edi,[ebp+12]

push esi
call lstrlenA@4 ; длина в EAX
mov ecx, eax
add esi, ecx
mov ebx, 1

@p1loop:
dec esi
mov al,[esi]
mov ah, 0
cmp al,10
je @p1next
cmp al,0
je @p1next
cmp al,13
je @p1next
sub al,30h
imul eax, ebx
add [edi], eax
imul ebx, 10
@p1next:
loop @p1loop

@p1end:
pop ebp
ret 8
_StrToINT@8 endp


; функция дублирования
; параметры
; указатель на строку от куда
; указатель на строку куда
; 4 байта позиция
; 4 байта длина
; 4 байта количество раз
; размер парметров 20байт

_Ololo@20 proc
push ebp
mov ebp,esp
mov esi,[ebp+8]
mov edi,[ebp+12]
mov eax,[ebp+16]
add esi, eax
dec esi
mov eax, esi
mov edx,[ebp+20]
mov ebx,[ebp+24]
; загрузили все параметры

@p0count_next:
cmp ebx, 0
je @p0end
dec ebx
mov ecx, edx
mov esi, eax
@p0next:
movsb
loop @p0next
jmp @p0count_next

@p0end:
pop ebp
ret 20
_Ololo@20 endp


END START

спасибо конечно,но она не компится,я в ассемблере не одной команды не знаю
писать заставляют в этом говне

offline
Ответить с цитированием