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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2010, 20:37   #1
Masha1990
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 32
Смех Об'яcните строки программы

Вот задания
Разработать программу,которая должна позволять ввести две строки S1 и S2 произвольной одинаковой длины. Сформировать строку C в обратном порядке,а потом четные элементы строки S1 в прямом порядке.Разпечатать исходные строки S1 и S2,а также результующую строку С.


Вот код

Цитата:
.486
.model flat, stdcall
option casemap:none

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12

.data?
data_string1 db 2000 dup (?)
data_string2 db 2000 dup (?)
len_str1 dd ?
len_str2 dd ?

data_stringC db 2000 dup (?)
data_stringChet db 2000 dup (?)

handle_output dd ?
handle_input dd ?

G_temp dd ?
I_temp dd ?

.data
text_inp1 db 'Ввести строку S1:',00Dh,00Ah,000h
text_inp2 db 'Ввести строку S2:',00Dh,00Ah,000h
out_text db 'Press Enter to exit',00Dh,00Ah,000h
End_str db 00Dh,00Ah,000h

.code
;-----------------------------------------------------------------------------
start:
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov [handle_output], eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov [handle_input], eax

invoke WriteConsoleA, [handle_output], offset [text_inp1], (SIZEOF text_inp1)-1, offset [G_temp], 0
invoke ReadConsoleA, [handle_input], offset [data_string1], 2000, offset [G_temp], 0
mov ecx, [G_temp]
sub ecx, 2
mov [len_str1], ecx
lea esi, [data_string1]
add esi, ecx
mov byte ptr [esi], 0
invoke WriteConsoleA, [handle_output], offset [text_inp2], (SIZEOF text_inp2)-1, offset [G_temp], 0
invoke ReadConsoleA, [handle_input], offset [data_string2], 2000, offset [G_temp], 0
mov ecx, [G_temp]
sub ecx, 2
mov [len_str2], ecx
lea esi, [data_string2]
add esi, ecx
mov byte ptr [esi], 0

lea esi, [data_string1]
lea edi, [data_stringC]
mov ecx, [len_str1]
add esi, ecx
dec esi
next_fieldC:
cmp ecx, 0
je end_fieldC
mov al, byte ptr [esi]
mov byte ptr [edi], al
dec esi
inc edi
dec ecx
jmp next_fieldC
end_fieldC:
mov byte ptr [edi], 0

lea esi, [data_string1]
lea edi, [data_stringChet]
mov ecx, [len_str1]
inc esi
dec ecx
next_fieldChet:
cmp ecx, 0
jle end_fieldChet
mov al, byte ptr [esi]
mov byte ptr [edi], al
add esi, 2
inc edi
sub ecx, 2
jmp next_fieldChet
end_fieldChet:
mov byte ptr [edi], 0

invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_string1]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_string1], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_string2]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_string2], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_stringC]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_stringC], [len_str1], offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_stringChet]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_stringChet], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0

exit_proga:
invoke WriteConsoleA, [handle_output], offset [out_text], (SIZEOF out_text)-1, offset [G_temp], 0
invoke ReadConsoleA, [handle_input], offset [I_temp], 1, offset [G_temp], 0
invoke ExitProcess, 0
end start
напишите пожалуста коментари к коду!!!
Masha1990 вне форума Ответить с цитированием
Старый 07.06.2010, 22:56   #2
Masha1990
Пользователь
 
Регистрация: 02.06.2010
Сообщений: 32
По умолчанию

Цитата:
Цитата.486 ; тип процессора
.model flat, stdcall ; модель памяти flat(стандарт для windows) stdcall - порядок расположения параметров в стеке
option casemapnone

include masm32includeuser32.inc ; подключаем файлы с прототипами функций из user32.dll
include masm32includekernel32.inc ; и kernel32.dll

includelib masm32libuser32.lib ; подключаем соответствующие статические библиотеки
includelib masm32libkernel32.lib
; макрозамены
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
; определяем данные
.data
data_string1 db 2000 dup ()
data_string2 db 2000 dup ()
len_str1 dd
len_str2 dd

data_stringC db 2000 dup ()
data_stringChet db 2000 dup ()

handle_output dd
handle_input dd

G_temp dd
I_temp dd

.data
text_inp1 db 'Ввести строку S1',00Dh,00Ah,000h
text_inp2 db 'Ввести строку S2',00Dh,00Ah,000h
out_text db 'Press Enter to exit',00Dh,00Ah,000h
End_str db 00Dh,00Ah,000h

.code
;-----------------------------------------------------------------------------
start ;точка входа
invoke GetStdHandle, STD_OUTPUT_HANDLE ; получаем хендл консоли (устройства вывода)
mov [handle_output], eax ; сохраняем его
invoke GetStdHandle, STD_INPUT_HANDLE ; то же - устройства ввода
mov [handle_input], eax

invoke WriteConsoleA, [handle_output], offset [text_inp1], (SIZEOF text_inp1)-1, offset [G_temp], 0 ; выводим строку
invoke ReadConsoleA, [handle_input], offset [data_string1], 2000, offset [G_temp], 0
; считываем строку
mov ecx, [G_temp] ; кол-во введенных символов
sub ecx, 2 ; убираем служебные символы(enter)
mov [len_str1], ecx ; сохраняем реальное кол-во введенных символов
lea esi, [data_string1] ; адрес введенной строки
add esi, ecx ; + кол-во символов
mov byte ptr [esi], 0 ; в конец строки запишем нуль терминатор
invoke WriteConsoleA, [handle_output], offset [text_inp2], (SIZEOF text_inp2)-1, offset [G_temp], 0
; выводим строку обратно на экран
invoke ReadConsoleA, [handle_input], offset [data_string2], 2000, offset [G_temp], 0;
mov ecx, [G_temp];
sub ecx, 2;
mov [len_str2], ecx;
lea esi, [data_string2];
add esi, ecx;
mov byte ptr [esi], 0;
; без комментариев - описаны выше аналогичные действия
lea esi, [data_string1] ; загрузить первую строку в esi
lea edi, [data_stringC] ; вторую в edi
mov ecx, [len_str1] ; длина первой строки
add esi, ecx ; перейдем в конец первой троки
dec esi ; указатель - на последний символ
next_fieldC ; запускаем цикл
cmp ecx, 0 ; дошли до начала строки
je end_fieldC ; да - выйти из цикла
mov al, byte ptr [esi] ; загрузим символ с конца строки
mov byte ptr [edi], al ; запишем во вторую строку
dec esi ; в первой строке - указатель уменьшим
inc edi ; во второй увеличим
dec ecx ; и декрементируем счетчик
jmp next_fieldC ; циклим
end_fieldC
mov byte ptr [edi], 0 ; запишем в конец строки нуль
;все - я устал( короче - тут в цикле переписываются символы через один (только четные). в конце все выводится на экранпервая строка,вторая, первая строка задом наперед, через один символ и выходим
lea esi, [data_string1]
lea edi, [data_stringChet]
mov ecx, [len_str1]
inc esi
dec ecx
next_fieldChet
cmp ecx, 0
jle end_fieldChet
mov al, byte ptr [esi]
mov byte ptr [edi], al
add esi, 2
inc edi
sub ecx, 2
jmp next_fieldChet
end_fieldChet
mov byte ptr [edi], 0

invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_string1]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_string1], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_string2]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_string2], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_stringC]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_stringC], [len_str1], offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0
invoke lstrlen, addr [data_stringChet]
inc eax
invoke WriteConsoleA, [handle_output], offset [data_stringChet], eax, offset [G_temp], 0
invoke WriteConsoleA, [handle_output], offset [End_str], 2, offset [G_temp], 0

exit_proga
invoke WriteConsoleA, [handle_output], offset [out_text], (SIZEOF out_text)-1, offset [G_temp], 0
invoke ReadConsoleA, [handle_input], offset [I_temp], 1, offset [G_temp], 0
invoke ExitProcess, 0
end start
Можете еще что-то добавить? Что узнала то написала)))
Masha1990 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Строки неправильное выполнение программы ArniLand Общие вопросы C/C++ 3 30.03.2010 01:23
Delphi: запуск программы из командной строки с параметрами kaa1977 Помощь студентам 6 22.03.2010 10:03
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
расшифруйте две строки программы Cooler Общие вопросы Delphi 1 22.11.2006 14:54