Консультация № 178549
21.05.2010, 18:00
43.65 руб.
0 1 1
Уважаемые эксперты! Требуется написать программу(с комментариями) Ввести с клавиатуры две строки. Определить, равны ли они. Ввод строк с клавиатуры и команды пакетной обработки (строковые команды) в языке Assebmler. С клавиатуры вводятся только символы латинского алфавита. При выполнении каждого задания необходимо использовать команды пакетной обработки.Бонусное задание: оформить задания в виде функции, корректно передав ей параметры через стек. Буду признателен за бонус.)
Платформа DOS, ассемблер TASM.

Обсуждение

давно
Посетитель
7438
7205
22.05.2010, 17:12
общий
это ответ
Здравствуйте, Филимонов Алексей Викторович.
Можно сделать, например, так:
Код:

.model tiny, C
.data
;Зададим два буфера для ввода строки по ф-и 0ah
max1 db 129 ;максимальная длина строки1
len1 db 0 ;реальная длина строки1
buf1 db 129 dup (?) ;сама строка1, в конце код 0dh

max2 db 129 ;максимальная длина строки2
len2 db 0 ;реальная длина строки2
buf2 db 129 dup (?) ;сама строка1, в конце код 0dh

Prompt1 db 'Enter first string: $' ;Подсказка 1
Prompt2 db 0dh,0ah,'Enter second string: $' ;Подсказка 2
Msg1 db 0dh,0ah,'Strings are equals!$' ;Сообщение, что строки равны
Msg2 db 0dh,0ah,'Strings are NOT equals!$' ;не равны
Any db 0dh,0ah,'Press any key$' ;понятно :)

.code
.startup ;точка входа
.286
;Вводим первую строку
call GetString, offset prompt1, offset max1
;Вводим вторую строку
call GetString, offset prompt2, offset max2
;сравниваем
call CmpStrings, offset buf1, offset buf2
;сообщение, что равны
lea dx, msg1
;результат в ax (=0 -> равны)
test ax, ax
jz PrMessage
;сообщение, что не равны
lea dx, msg2
PrMessage:
mov ah, 9
int 21h ;выводим

lea dx, Any
mov ah, 9
int 21h ;Any key

mov ah, 0
int 16h ;Ждем any key

mov ax, 4c00h
int 21h ;выходим

;вводим строку
;параметры:
;pPrompt - адрес строки подсказки
;pData - адрес буфера для ввода
GetString proc pPrompt:word, pData:word
mov dx, pPrompt
mov ah, 9
int 21h ;подсказка
mov dx, pData
mov ah, 0ah
int 21h ;вводим
ret
GetString endp

;сравниваем две строки по адресам pStr1 и pStr2
;результат: ax=0 - равны, ax=1 - не равны
CmpStrings proc pStr1:word, pStr2:word
mov ax, 1 ;считаем пока, что не равны
mov si, pStr1 ;адрес первой строки
mov di, pStr2 ;адрес второй строки
CmpLoop:
cmpsb ;сравниваем один байт [ds:si] и [es:di],si=si+1,di=di+1
jne CmpRet ;если не равно, сразу на выход
cmp byte ptr [si-1], 0dh ;если равно, то проверим проверенный байт,
jne CmpLoop ; дошли ли до конца строк, признаком конца является байт 0dh
xor ax, ax ; и если 0dh и равно, значит строки равны!
CmpRet:
ret
CmpStrings endp

end
5
Спасибо вам!)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа