Консультация № 192344
08.01.2018, 18:33
0.00 руб.
0 8 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
задача: написать программу, находящую максимальный или минимальный символ в исходной строке.
написал код, который вроде как должен найти максимальный символ. пожалуйста, помогите, завтра к утру уже нужно сдавать. правильно ли я вообще написал код? и вывод не пойму как правильно сделать


Приложение:
.model small
.stack 100h
.data
szStr EQU 250
msg1 db 'Stroka:',10,13, '$'
Maxstr db szStr ; максимальная длина строки второй байт
Lenstr db ? ; фактическая длина строки второй байт
Stroka db szStr dup(?) ; строка третий байт
NextLine db 13,10,'$'
.code
mov ax, @data
mov ds, ax
mov es, ax


; вывод 1-го сообщения
mov ah, 09h
mov dx, offset msg1
int 21h

; ввод строки
mov ah,3fh ;функция DOS для чтения с ручного ввода
mov bx,0 ;описание стандартного ввода
mov cx,szStr ;считываем строку до максимально установленной длины
mov dx,OFFSET Stroka
int 21h

; следующая строка
lea dx, nextLine
mov ah, 9
int 21h

; ищем символ
lea si, Stroka
mov al, [si]
inc si
mov bl, [si]

sleduiushii_simvol:
; переход на следующий символ
or al, al ; это ноль (конец строки)?
jnz proverka ; переход, если не 0
jmp konec

proverka:
; сравниваем символы
cmp al, bl ; сравниваем символы
ja first_or_equally
jb second
je first_or_equally

first_or_equally:
inc si
mov bl, [si]
jmp sleduiushii_simvol

second:
mov al,bl
inc si
mov bl,[si]
jmp sleduiushii_simvol

konec:
; ??? вывод символа al

; завершение программы
mov ah, 04Ch
int 21h
end

Обсуждение

давно
Посетитель
7438
7205
08.01.2018, 18:52
общий
Адресаты:
Так максимальный или минимальный символ надо искать?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.01.2018, 18:59
общий
Адресаты:
Любопытно, приготовили буфер для ввода строки с помощью функции 0ah,
а вводите при помощи функции чтения ah = 3fh (bx=0). Вы бы определились...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401611
4
08.01.2018, 19:11
общий
Нужно найти и тот, и другой. Очень плохо разбираюсь. У преподавателя вопросов не возникало, поэтому делаю как получается, плохо конечно не разбираться...
давно
Посетитель
7438
7205
08.01.2018, 19:18
общий
Адресаты:
Если будем вводить при помощи 3fh, то надо убрать лишнее (нужное для 0ah)
Ух, был бы я у Вас преподом... Уж я бы назадавал вопросов...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.01.2018, 19:20
общий
Адресаты:
Кстати, с чего Вы взяли, что в конце введенного текста будет 0?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401611
4
08.01.2018, 19:46
общий
0 - знак конца строки
давно
Посетитель
7438
7205
08.01.2018, 19:53
общий
08.01.2018, 20:02
Адресаты:
0 - знак конца строки
Это замечательно, но в конце введенной строки по 3fh нуля нет.
Будет добавлена пара 0dh, 0ah
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.01.2018, 19:59
общий
это ответ
Здравствуйте, bukety.sedobnye!
Держите программу, сравните со своей...
[code lang=asm h=200];написать программу, находящую максимальный или минимальный символ в исходной строке.
.model small
.stack 100h
.data
szStr EQU 250
msg1 db 'Stroka:',10,13, '$'
NextLine db 13,10,'$'
MsgMax db 'Max = $'
MsgMin db 13,10,'Min = $'
MsgPustaya db 'Net stroki!$'
Stroka db szStr dup(?) ; строка
.code
start:
mov ax, @data
mov ds, ax
mov es, ax

; вывод 1-го сообщения
mov ah, 09h
mov dx, offset msg1
int 21h

; ввод строки
mov ah, 3fh ;функция DOS для чтения с ручного ввода
mov bx, 0 ;описание стандартного ввода
mov cx, szStr ;считываем строку до максимально установленной длины
mov dx, OFFSET Stroka
int 21h ;в AX - длина введенной строки, в конце коды 0dh,0ah

; следующая строка
lea dx, nextLine
mov ah, 9
int 21h

; ищем символ
lea si, Stroka
mov bx, 00ffh ;bh - max, bl - min (сначала самые большой и маленький код!)

sleduiushii_simvol:
mov al, [si]
inc si
cmp al, 0dh ;при вводе при помощи ф-и 3fh в конце строки будут коды 0dh и 0ah!
je konez
; сравниваем символы
cmp al, bl ;сравним с минимальным
jae cmp_max ;если больше или равно, то на сравнение с максимальным
mov bl, al ;сохраним, как новый минимальный
cmp_max:
cmp al, bh ;сравним с максимальным
jbe sleduiushii_simvol ;если меньше или равно, то на чтение следующего символа
mov bh, al ;иначе - сохраним, как максимальный
jmp sleduiushii_simvol

konez: ;выведем результат
cmp bx, 00ffh ;сначала сравним, была ли введена строка
je Pustaya_stroka ;если макс и мин не изменились, то ничего введено не было!

mov dx, offset MsgMax
mov ah, 9
int 21h ;сообщение и макс символе
mov dl, bh ;значение
mov ah, 2
int 21h ;выводим символ

mov dx, offset MsgMin ;аналогично для минимального
mov ah, 9
int 21h
mov dl, bl
mov ah, 2
int 21h

lea dx, nextLine
mov ah, 9
int 21h

; завершение программы
exit:
mov ah, 0 ;подождем нажатие на клавишу, чтобы окно сразу не закрылось
int 16h

mov ah, 04Ch
int 21h

Pustaya_stroka:
mov dx, offset MsgPustaya
mov ah, 9
int 21h
jmp exit
end start
[/code]
5
Огромное спасибо! Теперь вижу, что делал неправильно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа