Не получается написать вторую часть программы.
Вот это получилось:
Написать программу, выполняющую следующую функцию. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2.
А вот это нет:
Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1.
Как я понимаю нужно при несовпадении строк вывести символы 2-ой строки не совпавшие с символами 1 строки.
Вот что у меня получилось по первой половине программы:
Код:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
;Директива EQU присваивает метке значение, которое определяется
;как результат целочисленного выражения в правой части.
;Результатом этого выражения может быть целое число, адрес или любая строка символов
Asize equ 60
;------------------------Инициализация переменных------------------------
.data ;эта секция наиболее универсальная мы резервируем память под данные и сразу же объявляем их
msg1 db "Vvedite 1 stroky: ",0dh,0ah ;0dh,0ah перевод на новую строку
msg2 db "Vvedite 2 stroky: ",0dh,0ah
msg3 db "---Stroki sovpali---" ,0dh,0ah,0dh,0ah,0dh,0ah
msg4 db "---Stroki ne sovpali---" ,0dh,0ah,0dh,0ah,0dh,0ah
.data? ;в данной секции мы нельзя инициализировать переменные
str1 db 32 dup (' '),'$' ;Введенные символы
str2 db 32 dup (' '),'$' ;Введенные символы
stdin dd ? ;dd - 4 байта - 2 слова =8 символам
stdout dd ?
cRead dd ?
cWritten dd ?
res dd ?
.code
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE ;Дескриптор стандартного устройства ввода данных.
;Вначале, это - дескриптор консольного буфера ввода
mov stdout,eax ;копирует значение переменной stdin в регистр eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax;
invoke WriteConsoleA,stdout,ADDR msg1,SIZEOF msg1,ADDR cWritten,NULL
invoke ReadConsole,stdin,ADDR str1,Asize,ADDR cRead,NULL ;считываем 1 строку с консоли
invoke WriteConsoleA,stdout,ADDR msg2,SIZEOF msg2,ADDR cWritten,NULL
invoke ReadConsole,stdin,ADDR str2,Asize,ADDR cRead,NULL ;считываем 2 строку с консоли
;-----------------------------------процесс сравнения строк-----------------------------------
CLD ;направление вперед(с начала в конец)
MOV ECX,32 ;длина строки
LEA ESI,str1 ;загрузка в esi смещения str1(адрес 1 элемента 1 строки)
LEA EDI,str2 ;загрузка в edi смещения str2(адрес 1 элемента 2 строки)
REPE CMPSB ;само сравнение repe-префикс повторения;
;CMPSB-сравнение строк, расположенных по адресам, содержащимся в регистрах ESI и EDI
;JNE-переходит тогда,когда приемник!=источнику
JNE NE_SOVPALO ;если не совпали бежим в NO_SOVPALO
JMP _SOVPALO ;если совпали бежим в _SOVPALO
NE_SOVPALO: ;если не совпали
invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL ;выводим что строки не совпали
invoke Sleep,INFINITE ;не закрываем консоль после выполнения
invoke ExitProcess,0 ;выходим из прогрмаммы
_SOVPALO: ;если совпали
invoke WriteConsoleA,stdout,ADDR msg3,SIZEOF msg3,ADDR cWritten,NULL
MOV ECX,32
LEA ESI,str1 ;загрузка в esi смещения str1(адрес 1 элемента 1 строки)
LEA EDI,res
L1:
MOV AL,[ESI]
MOV [EDI],AL
INC EDI ;увеличиваем на 1 адрес 1 строки
INC ESI ;увеличиваем на 1 адрес 2 строки
LOOP L1
invoke Sleep,INFINITE ;не закрываем консоль после выполнения
invoke ExitProcess,0 ;выход
end start
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!
Модератор.