![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() ![]() |
![]() |
Rocket |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Вот задание: Ввести с клавиатуры две строки. Сравнить их. Вывести на экран какая из строк больше и насколько. Какие мысли есть по реализации данной программы? Как осуществить сравнение строк?
|
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Что значит "строка больше"? По длине?
-------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Rocket |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#4
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Та по длине походу... сравнивать количество символов...как реализовать- до сих пор загадка.. При чем тут загадка? Не понимаю. Если по длине, то функция Length(s) решает все проблемы. ![]() Но если требуется все-таки лексикографическое сравнение, то тогда действительно загадка. То есть само сравнение будет еще проще (типа s1<s2), но совершенно непонятно, что значит "на сколько" [орфография моя]. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Rocket |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
При чем тут загадка? Не понимаю. Если по длине, то функция Length(s) решает все проблемы. Но если требуется все-таки лексикографическое сравнение, то тогда действительно загадка. То есть само сравнение будет еще проще (типа s1<s2), но совершенно непонятно, что значит "на сколько" [орфография моя]. В ассемблере есть функция length(s)?...в мои познания этого языка данная функция ещё не входит... |
Lapp |
![]()
Сообщение
#6
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
В ассемблере есть функция length(s)?...в мои познания этого языка данная функция ещё не входит... Упс! погорячился... ![]() А как организаешь строки? Паскалевсие или нуль-терминированные? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
мисс_граффити |
![]()
Сообщение
#7
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Ввод строк сделал? Проблемы только с определением длины?
Могу попробовать вечером набросать код... но неохота тупо выкладывать готовую работу. Lapp, что значит "паскалевские строки" применительно к асму? -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Rocket |
![]()
Сообщение
#8
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Ввод строк сделал? Проблемы только с определением длины? Могу попробовать вечером набросать код... но неохота тупо выкладывать готовую работу. Lapp, что значит "паскалевские строки" применительно к асму? Не большой пример про ввод строки я видел, выглядит примерно вот так: buffer db 11 ; Нулевой байт буфера
entered db (?) ; Число введенных символов
string db 11 dup (?) ; Введенные символы
Сам ввод выполняется командами:
lea dx, buffer ; Адрес буфера в dx
mov ah, 0ah ; Номер функции в аh
int 21h ; Вызов функции
Что изменится при вводе двух строк? А набросанный код пришёлся бы очень кстати) всё равно и в нём нужно будет разобраться |
мисс_граффити |
![]()
Сообщение
#9
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Ну например...
.model small
.stack 512
.data
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer$'
mes2 db 'Second is longer$'
.code
;заносим адрес сегмента данных в DX
mov AX, @data
mov DS, AX
lea dx,buf1 ;куда считываем первую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
mov bx,0
int 21h
mov len1,ax ;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)
lea dx,buf2 ;куда считываем вторую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
mov bx,0
int 21h
cmp ax,len1
jge m2
mov ah,9 ;выводим сообщение
lea dx,mes1
int 21h
jmp finish ;всё...
m2: mov ah,9 ;выводим сообщение
lea dx,mes2
int 21h
finish: mov ax,4c00h
int 21h
end
Длина строк маленькая (см. объявление переменных). НА СКОЛЬКО они отличаются - не считаю (думаю, с арифм операциями как-нибудь разберешься). Вариант равенства длин не предусмотрен. Ну и косяки могут быть - ассемблер я не знаю практически. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Rocket |
![]()
Сообщение
#10
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Ну например... всё отлично, большое спасибо) вот только вывод сообщения отказывается работать... Я вот так немного переделал:
data segment
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer$'
mes2 db 'Second is longer$'
data ends
code segment
assume cs:code, ds:data
start: mov AX, data
mov DS, AX
lea dx,buf1 ;куда считываем первую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
mov bx,0
int 21h
mov len1,ax ;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)
lea dx,buf2 ;куда считываем вторую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
mov bx,0
int 21h
cmp ax,len1
jge m2
lea dx,mes1
mov ah,09h ;выводим сообщение
int 21h
jmp finish ;всё...
m2: lea dx,mes2
mov ah,09h ;выводим сообщение
int 21h
finish: mov ax,4c00h
int 21h
code ends
end start
Сообщение отредактировано: volvo - 14.01.2009 0:26 |
мисс_граффити |
![]()
Сообщение
#11
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
У меня работает все.
Да ты по сути ничего в этой сфере вроде и не изменил. Строки местами поменял - и все? Если assume написал - убери mov AX, data
mov DS, AX
оно у тебя уже делается. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Rocket |
![]()
Сообщение
#12
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Rocket,
Чем компилируешь, если не секрет? Приведенный тобой в 10-м сообщении код прекрасно отрабатывает после сборки ДОСовским TASM-ом версии 3.0... Отладчиком не смотрел, на каком этапе у тебя проблема? |
Rocket |
![]()
Сообщение
#14
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Rocket, Чем компилируешь, если не секрет? Приведенный тобой в 10-м сообщении код прекрасно отрабатывает после сборки ДОСовским TASM-ом версии 3.0... Отладчиком не смотрел, на каком этапе у тебя проблема? Проблема в том, что не выводит сообщение в Turbo Debugger'е (версия 3.1). Tasm у меня версии 1.0... |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Цитата Проблема в том, что не выводит сообщение в Turbo Debugger'е (версия 3.1) А может, ты его просто не видишь? ![]() |
Rocket |
![]()
Сообщение
#16
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
|
Rocket |
![]()
Сообщение
#17
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Всё-таки как организовать вывод сообщеия о том насколько отличаются строки?
Вот как я делаю:
data segment
buf1 db 10 dup(?)
buf2 db 10 dup(?)
len1 dW (?)
mes1 db 'First is longer!$'
mes2 db 'Second is longer!$'
X dw ?
data ends
code segment
assume cs:code, ds:data
start: mov AX, data
mov DS, AX
lea dx,buf1 ;куда считываем первую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
;mov bx,0
int 21h
mov len1,ax ;кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)
lea dx,buf2 ;куда считываем вторую строку символов
mov ah,3Fh ;ввод с клавиатуры целой строки
;mov bx,0
int 21h
cmp ax,len1
jge m2
sub ax,len1
mov X,ax
lea dx,X
mov ah,02h ; вот здесь что-то неправильно...
int 21h
lea dx,mes1
mov ah,09h ;выводим сообщение
int 21h
jmp finish ;всё...
m2:
sub ax,len1
mov X,ax
lea dx,X
mov ah,02h ;оно же
int 21h
lea dx,mes2
mov ah,09h ;выводим сообщение
int 21h
finish: mov ax,4c00h
int 21h
code ends
end start
|
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Ну, и кто тебе сказал, что
lea dx, X
преобразует тебе число в его символьное представление? Функция 02H прерывания 21H ведь выводит символ, код которого хранится в DX, а у тебя в DX что хранится? Убери из сегмента данных X, и добавь вместо него len2... lea dx, buf1 ;куда считываем первую строку символов
mov ah, 3Fh ; ввод с клавиатуры целой строки
int 21h
mov len1, ax ; кол-во реально введенных символов+2 (0Ah и ODh - то есть Enter)
lea dx, buf2 ; куда считываем вторую строку символов
mov ah, 3Fh ; ввод с клавиатуры целой строки
int 21h
mov len2, ax
cmp ax, len1
jge m2
mov ax, len1
sub ax, len2
add ax, 48 ; переводим в CHAR
mov dx, ax ; заносим в DX
mov ah, 02h ; печатаем
int 21h
lea dx, mes1
mov ah, 09h ; выводим сообщение
int 21h
jmp finish ; всё...
m2:
mov ax, len2
sub ax, len1
add ax, 48
mov dx, ax
mov ah, 02h
int 21h
lea dx,mes2
mov ah,09h ; выводим сообщение
int 21h
finish:
|
Rocket |
![]()
Сообщение
#19
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
А если у нас не 10 символом максимальный размер, а 100, то как тогда вывести разность длин строк? (то есть проблема с выводом двузначного числа,к примеру)
И функция 3Fh, что она делает? Сообщение отредактировано: volvo - 14.01.2009 0:27 |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Значит, придется написать процедуру вывода десятичного числа:
; В сегменте данных:
count_of_digits dw 4 ; число будет отображаться в четырех позициях
; ...
writeDEC proc
; выводим содержимое AX
push ax
push bx
push cx
push dx
push di ; здесь будем хранить признак знака
xor cx, cx
mov bx, 10
xor di, di ; 0 = число положительное
or ax, ax ; Проверим, не отрицательное ли число в AX
jns next_digit ; Не отрицательное... Переходим дальше
inc di ; Отрицательное. Выставляем DI в 1 (число отрицательное) ...
neg ax ; ... и меняем знак числа
next_digit:
xor dx, dx ; DX обнуляется. Чтобы можно было делить DWORD на WORD
div bx ; Делмм DX:AX на BX (т.е. на 10) ...
push dx ; ... остаток забрасываем в стек ...
inc cx ; Увеличим счетчик цифр
or ax, ax
jnz next_digit ; ... и продолжаем этот цикл пока AX <> 0
mov dx, count_of_digits
sub dx, cx ; вычисляем, сколько пробелов надо вывести перед числом
or di, di
jz _zer
dec dx ; если ранее был установлен "признак отрицательности"
; то уменьшаем число пробелов еще на 1, поскульку надо еще вывести "-"
_zer:
push cx ; сохраним число цифр в стеке
mov cx, dx
mov al, ' ' ; и напечатаем необходимое число пробелов
next_space:
int 29h ; прерывание 29h - вывод на консоль
loop next_space
pop cx ; вернем число цифр
or di, di
jz next_char
mov al, '-'
int 29h ; если нужен минус - выводим его
next_char:
pop ax ; остатки от деления возвращаем в AX
add al, '0' ; преобразуем в символ (добавляя код '0')
int 29h ; и выводим на консоль
loop next_char
pop di ; восстанавливаем все регистры
pop dx
pop cx
pop bx
pop ax
ret ; и выходим из процедуры
writeDEC endp
, и вызывать вот так: ; ...
mov ax, len1
sub ax, len2
call writeDEC ; печатаем разность
lea dx, mes1
mov ah, 09h ; выводим сообщение, что первая строка длиннее
int 21h
jmp finish ; на выход
m2:
mov ax, len2
sub ax, len1
call writeDEC ; печатаем разность
lea dx, mes2
mov ah,09h ; выводим сообщение, что длиннее вторая строка
int 21h
finish:
; ...
Цитата И функция 3Fh, что она делает? Ну ты даешь... ![]() Сообщение отредактировано: volvo - 28.11.2008 1:09 |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 2:32 |