Программное обеспечение
Асемблер(tasm) помогите прогу пределть в прогу с подпрограммой
Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает содержится ли одна в другой и сколько раз. data segment prompt1 db 'Введите 1 строку:',13,10,'$' prompt2 db 13,10,'Введите 2 строку:' crlf db 13,10,'$' txtno db 13,10,'Не ' txtyes db 'содержится $' buf1 db 255 len1 db ? str1 db 255 dup (?) buf2 db 255 len2 db ? str2 db 255 dup (?) counter db ? data ends code segment assume cs:code,ds:data;,ss:stack; start: mov ax,data mov ds,ax mov es,ax mov ah,9 lea dx,prompt1 int 21h mov ah,10 lea dx,buf1 int 21h mov ah,9 lea dx,prompt2 int 21h mov ah,10 lea dx,buf2 int 21h mov cl,len1 sub cl,len2 jb No inc cl xor ch,ch mov counter,ch lea di,str1 m1: push cx push di lea si,str2 mov cl,len2 xor ch,ch repe cmpsb jne m2 inc byte ptr [counter] m2: pop di inc di pop cx loop m1 cmp byte ptr [counter],0 jne Yes No: lea dx,txtno mov ah,9 int 21h jmp quit Yes: lea dx,crlf mov ah,9 int 21h lea dx,txtyes int 21h mov al,counter xor ah,ah mov bx,300Ah div bl add bh,ah xor ah,ah div bl mov dx,3030h add dx,ax mov ah,2 int 21h mov dl,dh int 21h mov dl,bh int 21h quit: mov ah,8 int 21h mov ax,4C00h int 21h code ends ;stack segment; ;dw 256 dup (?); ;stack ends; end start
Вариант с подпрограммой, которой передаются только адреса строк.
Длины строк передаются неявно в байте, предыдущем началу строк, точно так же, как их возвращает функция DOS 0Ah.
data segment
prompt1 db 'Введите 1 строку: ',13,10,'$'
prompt2 db 13,10,'Введите 2 строку: '
crlf db 13,10,'$'
txtno db 13,10,'Не содержится$'
txtyes db 'Содержится $'
buf1 db 255,?
str1 db 255 dup (?)
buf2 db 255,?
str2 db 255 dup (?)
data ends
code segment
assume cs:code,ds:data
;=======================================
;Подпрограмма подсчёта кол-ва вхождений
;подстроки [si] в строку [di].
;Длины строк должны находиться по адресам
;[si-1] и [di-1] соответственно, как в Паскале.
;Кол-во вхождений возвращается в al
subroutine proc
xor al,al
mov cl,[di-1]
sub cl,[si-1]
jb Exit
inc cl
mov ch,al; или xor ch,ch
m1: push cx
push di
push si
mov cl,[si-1]
xor ch,ch
repe cmpsb
jne m2
inc al
m2: pop si
pop di
inc di
pop cx
loop m1
Exit: ret
subroutine endp
;=======================================
start: mov ax,data
mov ds,ax
mov es,ax
mov ah,9
lea dx,prompt1
int 21h
mov ah,10
lea dx,buf1
int 21h
mov ah,9
lea dx,prompt2
int 21h
mov ah,10
lea dx,buf2
int 21h
lea di,str1
lea si,str2
call subroutine; вызов подпрограммы
or al,al; или cmp al,0
jne Yes
No: lea dx,txtno
mov ah,9
int 21h
jmp quit
Yes: push ax
lea dx,crlf
mov ah,9
int 21h
lea dx,txtyes
int 21h
pop ax
xor ah,ah
mov bx,300Ah
div bl
add bh,ah
xor ah,ah
div bl
mov dx,3030h
add dx,ax
mov ah,2
int 21h
mov dl,dh
int 21h
mov dl,bh
int 21h
quit: xor ah,ah
int 16h
mov ah,4Ch
int 21h
code ends
end start
Длины строк передаются неявно в байте, предыдущем началу строк, точно так же, как их возвращает функция DOS 0Ah.
data segment
prompt1 db 'Введите 1 строку: ',13,10,'$'
prompt2 db 13,10,'Введите 2 строку: '
crlf db 13,10,'$'
txtno db 13,10,'Не содержится$'
txtyes db 'Содержится $'
buf1 db 255,?
str1 db 255 dup (?)
buf2 db 255,?
str2 db 255 dup (?)
data ends
code segment
assume cs:code,ds:data
;=======================================
;Подпрограмма подсчёта кол-ва вхождений
;подстроки [si] в строку [di].
;Длины строк должны находиться по адресам
;[si-1] и [di-1] соответственно, как в Паскале.
;Кол-во вхождений возвращается в al
subroutine proc
xor al,al
mov cl,[di-1]
sub cl,[si-1]
jb Exit
inc cl
mov ch,al; или xor ch,ch
m1: push cx
push di
push si
mov cl,[si-1]
xor ch,ch
repe cmpsb
jne m2
inc al
m2: pop si
pop di
inc di
pop cx
loop m1
Exit: ret
subroutine endp
;=======================================
start: mov ax,data
mov ds,ax
mov es,ax
mov ah,9
lea dx,prompt1
int 21h
mov ah,10
lea dx,buf1
int 21h
mov ah,9
lea dx,prompt2
int 21h
mov ah,10
lea dx,buf2
int 21h
lea di,str1
lea si,str2
call subroutine; вызов подпрограммы
or al,al; или cmp al,0
jne Yes
No: lea dx,txtno
mov ah,9
int 21h
jmp quit
Yes: push ax
lea dx,crlf
mov ah,9
int 21h
lea dx,txtyes
int 21h
pop ax
xor ah,ah
mov bx,300Ah
div bl
add bh,ah
xor ah,ah
div bl
mov dx,3030h
add dx,ax
mov ah,2
int 21h
mov dl,dh
int 21h
mov dl,bh
int 21h
quit: xor ah,ah
int 16h
mov ah,4Ch
int 21h
code ends
end start
Вместо цикла m1..loop m1 надо сделать вызов процедуры через call, параметр counter и указатели на строки передавать через стек.
Похожие вопросы
- помогите найти прогу!! как называется прога,которая переделывает из формата avi в wmv,кроме total video converter.
- Помогите исправить диск. Накосячил прогой Acronis Disk Director Home
- Помогите создать слайдшоу, подскажите прогу
- есть утилиты или проги- удалить все проги и игры, оставить чистую операционку?
- Народ, плиз помогите, скажите где скачать прогу для изменения форматов рисунков JPEG и других.
- Как записать iso на диск (винду), при записи все проги его просто проги не видят?
- Существует ль реально мощная толковая прога для удаления прог без единого хвоста в реестре
- Уважаемые хакеры. Помогите пожалуйста найти прогу чтобы с ее помощью подобрать пароль к файлу - установке
- Помогите плиз. . у мя слетела прога, и даже после переустановки не пашет... что делать?
- Где скачать такую прогу и как вобще она называется!? Помогите мне пожалуйста!!!