Консультация № 132495
16.04.2008, 20:27
0.00 руб.
0 1 1
Уважаемые эксперты!
Помогите, пожалуйста, написать программу для реализации такой задачи:
Ввести с клавиатуры строку не более, чем из 20-ти символов. Заменить в строке каждую группу букв child группой children.

Обсуждение

Неизвестный
21.04.2008, 15:03
общий
это ответ
Здравствуйте, M-brace!

Текст программы для TASM смотрите в приложении.

Приложение:
;Ввести с клавиатуры строку не более, чем из 20-ти символов.;Заменить в строке каждую группу букв child группой children.LOCALS.186;строки завершаются нулем, размер строки не более 1 сегментаASSUME cs:code, ds:datadata SEGMENTconst_input_string_size = 14hsubstring1 DB ‘child‘,0const_substring1_size = $-substring1substring2 DB ‘children‘,0const_substring2_size = $-substring2n DB 0Dh,0Ah,‘$‘input_string DB const_input_string_size+2 DUP (?) DB 0 DB const_substring2_size-const_substring1_size DUP (0) data ENDScode SEGMENTentry_point:mov ax,SEG datamov ds,ax;ввод строкиlea dx,input_stringmov input_string,const_input_string_sizemov ah,0AhINT 21h;переход на следующую строкуlea dx,nmov ah,09hINT 21hxor ax,axlea dx,input_string+2;цикл замены подстрокreplace_all_substrings:push dspush OFFSET substring2push dspush OFFSET substring1push dsadd dx,axpush dxcall ReplaceSubstringtest ax,axjnz replace_all_substrings;вывод измененной строкиlea bx,input_string+2mov dx,bxpush dspush bxcall GetStringSizeadd bx,axdec bxmov BYTE PTR ds:[bx],‘$‘mov ah,09hINT 21hmov ax,4C00hINT 21h;--------------------------------------;подпрограмма замены подстроки в строке;--------------------------------------;(string_addr:DWORD - адрес строки, в которой производится замена подстроки,; substring1_addr:DWORD - адрес подстроки, которая заменяется; substring2_addr:DWORD - адрес подстроки, на которую заменяется substring1);буфер string должен иметь запас для расширенияReplaceSubstring PROCARG @@string_addr:DWORD, @@substring1_addr:DWORD, @@substring2_addr:DWORD = @@arg_sizeLOCAL @@end_of_replaced_substring_offset:WORD = @@local_sizepush bpmov bp,spsub sp,@@local_sizepush bxpush cxpush dxpush dspush sipush espush dipush WORD PTR @@substring1_addr+2push WORD PTR @@substring1_addrpush WORD PTR @@string_addr+2push WORD PTR @@string_addrcall FindSubstringcmp ax,-1jne substring_foundjmp @@exit_SUBSTRING_NOT_REPLACEDsubstring_found:mov bx,axpush WORD PTR @@substring1_addr+2push WORD PTR @@substring1_addrcall GetStringSizemov dx,axpush WORD PTR @@substring2_addr+2push WORD PTR @@substring2_addrcall GetStringSizemov @@end_of_replaced_substring_offset,bxadd @@end_of_replaced_substring_offset,axcmp dx,axje substring1_size_equ_substring2_sizeja substring1_size_above_substring2_size;GetStringSize(substring1) < GetStringSize(substring2)push axpush WORD PTR @@string_addr+2push WORD PTR @@string_addrcall GetStringSizesub ax,bxsub ax,dxmov cx,axpop axlds si,@@string_addradd si,bxadd si,dxsub sp,cxmov di,sppush dipush cxpush sspop escldrep movsblds si,@@substring2_addrmov cx,axles di,@@string_addradd di,bx ;es:di -> substring1rep movsbpop cxpop sipush cxmov ax,ssmov ds,axrep movsbpop cxadd sp,cxxor al,alstosbjmp @@exit_SUBSTRING_REPLACEDsubstring1_size_equ_substring2_size:;GetStringSize(substring1) = GetStringSize(substring2)lds si,@@substring2_addrles di,@@string_addradd di,bxmov cx,axrep movsbjmp @@exit_SUBSTRING_REPLACEDsubstring1_size_above_substring2_size:;GetStringSize(substring1) > GetStringSize(substring2)lds si,@@substring2_addrles di,@@string_addradd di,bxmov cx,axrep movsbmov si,dipush dxsub dx,axadd si,dxpop dx ;dx = GetStringSize(substring1)push WORD PTR @@string_addr+2push WORD PTR @@string_addrcall GetStringSizesub ax,bxsub ax,dxmov cx,axrep movsbxor al,alstosb@@exit_SUBSTRING_REPLACED:mov ax,@@end_of_replaced_substring_offsetjmp @@exit@@exit_SUBSTRING_NOT_REPLACED:xor ax,ax@@exit:pop dipop espop sipop dspop dxpop cxpop bxmov sp,bppop bpret @@arg_sizeReplaceSubstring ENDP;--------------------------------------;подпрограмма поиска подстроки в строке;--------------------------------------FindSubstring PROCARG @@string_addr:DWORD, @@substring_addr:DWORD = @@arg_sizepush bpmov bp,sppush dspush sipush espush dipush bxpush cxpush dxpush WORD PTR @@substring_addr+2push WORD PTR @@substring_addrcall GetStringSizemov dx,axpush WORD PTR @@string_addr+2push WORD PTR @@string_addrcall GetStringSizemov bx,axles di,@@string_addrpush difind_first_char:mov ax,dipop cxpush cxsub ax,cxmov cx,axmov ax,bxsub ax,cxcmp ax,dxjb @@exit_SUBSTRING_NOT_FOUNDlds si,@@substring_addrmov cx,axmov al,ds:[si]cldrepne scasbtest cx,cxjz @@exit_SUBSTRING_NOT_FOUNDdec dimov cx,dxrepe cmpsbjz @@exit_SUBSTRING_FOUNDdec dijmp find_first_char@@exit_SUBSTRING_FOUND:pop axsub di,dxsub di,axmov ax,dijmp @@exit@@exit_SUBSTRING_NOT_FOUND:pop axmov ax,-1@@exit:pop dxpop cxpop bxpop dipop espop sipop dspop bpret @@arg_sizeFindSubstring ENDP;---------------------------------------;подпрограмма определения размера строки;---------------------------------------GetStringSize PROCARG @@string_addr:DWORD = @@arg_sizepush bpmov bp,sppush espush dipush cxles di,@@string_addrxor al,almov cx,0FFFFhcldrepne scasbneg cxdec cxdec cxmov ax,cxpop cxpop dipop espop bpret @@arg_sizeGetStringSize ENDPcode ENDSstk SEGMENT stackDB 200h DUP (?)stk ENDSEND entry_point
Форма ответа