в Бане
Сообщения: 12,864
Регистрация: 11.01.2008 Откуда: Кокчетав |
23 января 2010, 22:12
| | |
#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 спасибо конечно,но она не компится,я в ассемблере не одной команды не знаю
писать заставляют в этом говне |