IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Обработка символьной информации, с помощью функций DOS
Rocket
сообщение 28.11.2008 0:02
Сообщение #21


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 27.11.2008 23:12) *
Значит, придется написать процедуру вывода десятичного числа:


А можно более подробно объяснить логику данной подпрограммы?...не предполагал, что реализация будет столь замысловатой smile.gif

Сообщение отредактировано: volvo - 14.01.2009 0:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 28.11.2008 1:10
Сообщение #22


Гость






Цитата
А можно более подробно объяснить логику данной подпрограммы?
Комментарии добавлены в предыдущее сообщение...
 К началу страницы 
+ Ответить 
Rocket
сообщение 4.12.2008 23:25
Сообщение #23


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 28.11.2008 1:10) *

Комментарии добавлены в предыдущее сообщение...

Теперь всё стало на свои места, спасибо good.gif

А вот как организовать подпрограмму поиска одной введённой строки в другой строке? И ещё: вывод позиции, с которой подстрока содержится в строке...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.12.2008 12:24
Сообщение #24


Гость






Цитата
А вот как организовать подпрограмму поиска одной введённой строки в другой строке? И ещё: вывод позиции, с которой подстрока содержится в строке...
Вот тебе программа, которая это делает... В виде подпрограммы оформляй сам:

MODEL small

stack 100
.286

DATASEG
entrStr	db 13, 10, 'string:$'
entrSStr	db 13, 10, 'substring:$'
sNotFound	db 13, 10, 'substring was not found$'
sResult	db 13, 10, 'pos = $'

inpStr  db 200
inpStrLen db ?
inpStrDat db 200 dup(?)

inpSStr  db 200
inpSStrLen db ?
inpSStrDat db 200 dup(?)

count_of_digits  dw 6

CODESEG

writeDEC proc

	; ...

writeDEC endp

show_ax proc
	mov cx, 10
	xor di, di
@@conv:
	xor dx, dx
	div cx
        add dl, '0'
        inc di
	push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@conv
        ; выводим из стэка на экран
    @@show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@show
        ret
show_ax endp

start: 
	mov ax,@DATA
	mov ds, ax
	mov es, ax
	
	; вводим строку
	mov ah, 09h
	mov dx, offset entrStr
	int 21h
	mov ah, 0ah
	mov dx, offset inpStr
	int 21h
	
	; записываем '$' в конец строки
	mov di, offset inpStrDat
	xor ch, ch
	mov cl, inpStrLen
	add di, cx
	mov byte ptr[di], '$'
	
	; вводим подстроку
	mov ah, 09h
	mov dx, offset entrSStr
	int 21h
	mov ah, 0ah
	mov dx, offset inpSStr
	int 21h
	
	; Подготовка
	xor cx, cx
	mov di, offset inpStrDat
	mov si, offset inpSStrDat
	mov cl, inpStrLen
	
	; Ищем первый символ подстроки
FindFirstCh:
	mov al, [di] ;
	inc di
	cmp al, [si]
	jz beginCompare	; Нашли
	
nextCompare:
	loop FindFirstCh

	; Если цикл FindFirstCh закончился - значит подстроки нет
	mov ah, 09h
	mov dx, offset sNotFound
	int 21h
	jmp exit_prog
	
beginCompare:
	; Проверяем следующие за первым в подстроке символы
	push cx
	push si
	push di
	dec di
	mov cl, inpSStrLen
	
	; Проверка
yesCompare:
	mov al, [di]
	inc di
	cmp al, [si]
	jnz noCompare	; Очередной символ не совпал
	inc si
	loop yesCompare
	
	; Если здесь - значит все совпало
	jmp found
	
	; Не совпало - восстанавливаем данные и ищем дальше
	; первый символ подстроки в строке
noCompare:
	pop di
	pop si
	pop cx
	jmp short nextCompare
	
found:
	; Есть совпадение, выводим сообщение
	mov ah, 09h
	mov dx, offset sResult
	int 21h
	
	; вытягиваем из стека адрес первого символа
	pop di
	
	; и вычисляем его позицию
	mov dx, offset inpStrDat
	mov ax, di
	sub ax, dx
	call writeDEC	; Эту процедуру я показывал раньше
	
exit_prog:
	mov ah, 4ch
	int 21h
end start

(процедуру writeDEC возьми из предыдущих постов, я не стал ее опять копировать...)
 К началу страницы 
+ Ответить 
Rocket
сообщение 9.12.2008 0:36
Сообщение #25


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 7.12.2008 12:24) *
Вот тебе программа, которая это делает...

У меня возник ряд вопросов по реализации...
1) Использование "offset". Я так полагаю, что это полный аналог команды "lea" ?
2) inpStrDat что это за переменная, для чего она нужна?
3)
mov di, offset inpStrDat
что делает конструкция такого вида?
4) Как определяется размер строки? т.е.
mov cl, inpStrLen
почему в cl сразу помещается размер строки?
5) При переходе на метку
beginCompare:
, где мы должны проверять последующие за первой буквы, мы снова проверяем совпадение первых букв, так ли это?
6) Когда мы из стека вытаскиваем di, разве он сразу не указывает на позицию, с которой начинается подстрока в строке? Как вообще происходит тогда вычисление позиции?

Сообщение отредактировано: volvo - 14.01.2009 0:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.12.2008 1:08
Сообщение #26


Гость






Цитата(Rocket @ 8.12.2008 23:36) *
1) Использование "offset". Я так полагаю, что это полный аналог команды "lea" ?
Правильно полагаешь...

; можно вот так получить смещение inpStrDat
; в сегменте данных
mov di, offset inpStrDat

; а можно - вот так:
lea di, inpStrDat
В обоих случаях смещение этого массива от начала сегмента будет занесено в регистр DI...

Цитата(Rocket @ 8.12.2008 23:36) *
2) inpStrDat что это за переменная, для чего она нужна?
Как это "для чего"? А строку ты что, в воздухе хранить будешь? Вообще-то для нее надо место выделять. Вот я и выделил 200 байт.

Вообще обрати внимание, для ввода строки используется функция 0AH прерывания 21H... А она требует для работы вот чего:
Цитата(Абель)
LABEL представляет собой директиву с атрибутом BYTE. Первый байт содержит максимальную длину вводимых данных. Так как это однобайтовое поле, то возможное максимальное значение его - FFh или 255. Второй байт необходим DOS для занесения в него действительного числа введенных символов. Третьим байтом начинается поле, которое будет содержать введенные символы.
 	NAMEPAR	LABEL BYTE	; Список параметров:
	MAXLEN	DB 20		; Максимальная длина
	ACTLEN	DB ?		; Реальная длина
	NAMEFLD	DB 20 DUP (' ')	; Введенные символы

Так как в списке параметров директива LABEL не занимает места, то NAMEPAR и MAXLEN указывают на один и тот же aдрес памяти. В трансляторе MASM для определения списка параметров в виде структуры может использоваться также директива STRUC. Однако, в связи с тем, что ссылки на имена, определенные внутри, требуют специальной адресации, воздержимся cейчас от рассмотрения данной темы до гл. 24 "Директивы ассемблера".
Для запроса на ввод необходимо поместить в регистр AH номер функции - 10 (шест. 0Ah), загрузить адрес списка параметров (NAMEPAR в нашем примере) в регистр DX и выполнить INT 21H
Вот так... А поскольку я не описывал LABEL (ленивый я, не люблю набирать лишние символы smile.gif ), то в DX загружал смещение inpStr, то есть, первого из необходимых параметров...

Я надеюсь, вопрос
Цитата(Rocket @ 8.12.2008 23:36) *
4) Как определяется размер строки? т.е.
mov cl, inpStrLen
почему в cl сразу помещается размер строки?
исчерпан? Я там, в цитате, выделил ответ на него...

Цитата(Rocket @ 8.12.2008 23:36) *
5) При переходе на метку
beginCompare:
, где мы должны проверять последующие за первой буквы, мы снова проверяем совпадение первых букв, так ли это?
Так, но почему тебя это пугает? Я же уменьшаю DI перед проверкой, то есть, DI указывает именно на первый, совпавший символ в строке...

Цитата(Rocket @ 8.12.2008 23:36) *
6) Когда мы из стека вытаскиваем di, разве он сразу не указывает на позицию, с которой начинается подстрока в строке? Как вообще происходит тогда вычисление позиции?
Нет, он указывает на смещение относительно начала сегмента... А для того, чтобы вычислить позицию, надо из этого самого смещения, которое хранится в DI, вычесть смещение первого символа строки, которое я и заношу в DX... После вычитания в AX имеем позицию подстроки в строке...
 К началу страницы 
+ Ответить 
Rocket
сообщение 10.12.2008 0:24
Сообщение #27


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Всё стало на свои места! Спасибоsmile.gif
Так, вот ещё несколько вопросов вопросов :
1) процедура show_ax для чего предназначена? мы вроде её не используем нигде...
2) Зачем записывать $ конец введённой строки? Я знаю, что это признак конца строки...
3) Как это в виде процедуры оформить? Я полагаю, что после ввода строки и подстроки и после соответствующих подготовок. Нужно что-нибудь передавать в процедуру или прятать в стек?

Сообщение отредактировано: volvo - 14.01.2009 0:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.12.2008 0:46
Сообщение #28


Гость






Цитата(Rocket @ 9.12.2008 23:24) *
1) процедура show_ax для чего предназначена? мы вроде её не используем нигде...
Это я забыл удалить, она не нужна тут...

Цитата(Rocket @ 9.12.2008 23:24) *
2) Зачем записывать $ конец введённой строки? Я знаю, что это признак конца строки...
Ну, раз знаешь - чего спрашиваешь? smile.gif Допустим, ты ввел 20 символов, места выделено под 200, и тебе понадобилось распечатать введенную строку. Что делать будешь? Правило хорошего тона требует заполнить строку как положено (если этого не делает функция DOS - то это должен сделать программист, чтоб потом не отлавливать глюки). Раз строка должна заканчиваться символом "$", значит его надо добавить...

Цитата(Rocket @ 9.12.2008 23:24) *
3) Как это в виде процедуры оформить? Я полагаю, что после ввода строки и подстроки и после соответствующих подготовок. Нужно что-нибудь передавать в процедуру или прятать в стек?
Да, скорее всего надо в процедуре получать через DI адрес строки, через SI - адрес подстроки, и через CX - длину строки... А возвращать значение она должна через AX, как обычно, если AX = 0, то совпадений нет, иначе в AX содержится индекс первого элемента строки... Сохранять надо все регистры, которые изменяются внутри процедуры, опять же правило хорошего тона: не делай сам себе проблем, после возврата из процедуры содержимое регистров (кроме тех, через которые возвращаются результаты) должно быть точно таким же, как и до ее вызова...
 К началу страницы 
+ Ответить 
Rocket
сообщение 10.12.2008 12:42
Сообщение #29


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 10.12.2008 0:46) *

Да, скорее всего надо в процедуре получать через DI адрес строки, через SI - адрес подстроки, и через CX - длину строки... А возвращать значение она должна через AX, как обычно, если AX = 0, то совпадений нет, иначе в AX содержится индекс первого элемента строки... Сохранять надо все регистры, которые изменяются внутри процедуры, опять же правило хорошего тона: не делай сам себе проблем, после возврата из процедуры содержимое регистров (кроме тех, через которые возвращаются результаты) должно быть точно таким же, как и до ее вызова...


Я переделал следующим образом:

data segment
entrStr	   db 13, 10, 'string:$'
entrSStr	   db 13, 10, 'substring:$'
sNotFound db 13, 10, 'substring was not found$'
sResult	  db 13, 10, 'pos = $'

inpStr  db 100
inpStrLen db ?
inpStrDat db 100 dup(?)

inpSStr  db 100
inpSStrLen db ?
inpSStrDat db 100 dup(?)

count_of_digits  dw 2
data ends


code segment
assume cs:code, ds:data

writeDEC proc

	push ax
	push bx
	push cx
	push dx
	
	xor cx, cx
	mov bx, 10
		
 next_digit:
	xor dx, dx	
	div bx		
	push dx		
	inc cx		
	or ax, ax
	jnz next_digit	
		
next_char:
	pop ax		
	add al, '0'
	int 29h		
	loop next_char
	
	pop  dx
	pop  cx
	pop  bx
	pop  ax
	ret		

writeDEC endp


findSStr proc

push di
push si
push cx

; Ищем первый символ подстроки
FindFirstCh:
	mov al, [di] ;
	inc di
	cmp al, [si]
	jz beginCompare	; Нашли
	
nextCompare:
	loop FindFirstCh

	; Если цикл FindFirstCh закончился - значит подстроки нет
	mov ah, 09h
	lea dx, sNotFound
	int 21h
	jmp finish
	
beginCompare:
	; Проверяем следующие за первым в подстроке символы
	push cx
	push si
	push di
	dec di
	mov cl, inpSStrLen
	
	; Проверка
yesCompare:
	mov al, [di]
	inc di
	cmp al, [si]
	jnz noCompare	; Очередной символ не совпал
	inc si
	loop yesCompare
	
	; Если здесь - значит все совпало
	jmp found
	
	; Не совпало - восстанавливаем данные и ищем дальше
	; первый символ подстроки в строке
noCompare:
	pop di
	pop si
	pop cx
	jmp short nextCompare
	
found:
	; Есть совпадение, выводим сообщение
	mov ah, 09h
	lea dx, sResult
	int 21h
	
	; вытягиваем из стека адрес первого символа
	pop di
	
	; и вычисляем его позицию
	lea dx, inpStrDat
	mov ax, di
	sub ax, dx
	call writeDEC	; Эту процедуру я показывал раньше


ret
findSStr endp


start: 
 	mov ax,data
	mov ds, ax
	
	
	; вводим строку
	mov ah, 09h
	lea dx, entrStr
	int 21h
	mov ah, 0ah
	lea dx, inpStr
	int 21h
	
	; записываем '$' в конец строки
	lea di, inpStrDat
	xor ch, ch
	mov cl, inpStrLen
	add di, cx
	mov byte ptr[di], '$'
	
	; вводим подстроку
	mov ah, 09h
	lea dx, entrSStr
	int 21h
	mov ah, 0ah
	lea dx, inpSStr
	int 21h
	
	; Подготовка
	xor cx, cx
	lea di, inpStrDat
	lea si, inpSStrDat
	mov cl, inpStrLen
	
	call findSStr
		
finish:  mov ax,4c00h
	int 21h

code ends
end start


и всё-таки походу криво процедуру оформил... ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.12.2008 13:09
Сообщение #30


Гость






А я переделал вот так:
findSStr proc
	; Ищем первый символ подстроки
FindFirstCh:
	mov al, [di] ;
	inc di
	cmp al, [si]
	jz beginCompare	; Нашли
	
nextCompare:
	loop FindFirstCh
	
	xor ax, ax	; не найдено, вернем 0

	; Если цикл FindFirstCh закончился - значит подстроки нет
	jmp exit_proc
	
beginCompare:
	; Проверяем следующие за первым в подстроке символы
	push cx
	push si
	push di
	dec di
	mov cl, inpSStrLen
	
	; Проверка
yesCompare:
	mov al, [di]
	inc di
	cmp al, [si]
	;не совпало переход
	jnz noCompare	; Очередной символ не совпал
	inc si
	loop yesCompare
	
	; Если здесь - значит все совпало
	jmp found
	
	; Не совпало - восстанавливаем данные и ищем дальше
	; первый символ подстроки в строке
noCompare:
	pop di
	pop si
	pop cx
	jmp short nextCompare
	
found:
	; вытягиваем из стека адрес первого символа
	pop di
	
	; и вычисляем его позицию
	mov dx, offset inpStrDat
	mov ax, di
	sub ax, dx
	;call writeDEC	; Эту процедуру я показывал раньше
	
	pop si
	pop cx
	
exit_proc:
	ret
findSStr endp

; вызов:
	; Подготовка
	xor cx, cx
	mov di, offset inpStrDat
	mov si, offset inpSStrDat
	mov cl, inpStrLen
	
	call findSStr

	test ax, 0
	jnz not_found

	; Есть совпадение, выводим сообщение
	push ax
	mov ah, 09h
	mov dx, offset sResult
	int 21h
	pop ax
	call writeDEC
	jmp exit_prog
	
not_found:
	mov ah, 09h
	mov dx, offset sNotFound
	int 21h
	
exit_prog:
	mov ah, 4ch
	int 21h

, что я сделал не так? smile.gif

Опять же, замечание: у тебя процедура должна найти вхождение подстроки в строку. Только найти... Все, на этом ее работа закончилась. Выводить результаты - не ее дело, этим занимается вызывающая программа, если надо.
 К началу страницы 
+ Ответить 
Rocket
сообщение 10.12.2008 23:20
Сообщение #31


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот последняя вариация программы:

data segment
entrStr	   db 13, 10, 'string:$'
entrSStr	   db 13, 10, 'substring:$'
sNotFound db 13, 10, 'substring was not found$'
sResult	  db 13, 10, 'pos = $'

inpStr  db 100
inpStrLen db ?
inpStrDat db 100 dup(?)

inpSStr  db 100
inpSStrLen db ?
inpSStrDat db 100 dup(?)

count_of_digits  dw 2
data ends


code segment
assume cs:code, ds:data

writeDEC proc

	push ax
	push bx
	push cx
	push dx
	
	xor cx, cx
	mov bx, 10
		
 next_digit:
	xor dx, dx	
	div bx		
	push dx		
	inc cx		
	or ax, ax
	jnz next_digit	
		
next_char:
	pop ax		
	add al, '0'
	int 29h		
	loop next_char
	
	pop  dx
	pop  cx
	pop  bx
	pop  ax
	ret		

writeDEC endp


findSStr proc

; Ищем первый символ подстроки
FindFirstCh:
	mov al, [di] ;
	inc di
	cmp al, [si]
	jz beginCompare	; Нашли
	
nextCompare:
	loop FindFirstCh
	xor ax, ax	; не найдено, вернем 0

	; Если цикл FindFirstCh закончился - значит подстроки нет
	jmp exit_proc
	
beginCompare:
	; Проверяем следующие за первым в подстроке символы
	push cx
	push si
	push di
	dec di
	mov cl, inpSStrLen
	
	; Проверка
yesCompare:
	mov al, [di]
	inc di
	cmp al, [si]
	;не совпало переход
	jnz noCompare	; Очередной символ не совпал
	inc si
	loop yesCompare
	
	; Если здесь - значит все совпало
	jmp found
	
	; Не совпало - восстанавливаем данные и ищем дальше
	; первый символ подстроки в строке
noCompare:
	pop di
	pop si
	pop cx
	jmp short nextCompare
	
found:
	; вытягиваем из стека адрес первого символа
	pop di
	
	; и вычисляем его позицию
	mov dx, offset inpStrDat
	mov ax, di
	sub ax, dx
		
	pop si
	pop cx
	
exit_proc:
	ret

findSStr endp


start: 
 	mov ax,data
	mov ds, ax
	
	
	; вводим строку
	mov ah, 09h
	lea dx, entrStr
	int 21h
	mov ah, 0ah
	lea dx, inpStr
	int 21h
	
	; записываем '$' в конец строки
	lea di, inpStrDat
	xor ch, ch
	mov cl, inpStrLen
	add di, cx
	mov byte ptr[di], '$'
	
	; вводим подстроку
	mov ah, 09h
	lea dx, entrSStr
	int 21h
	mov ah, 0ah
	lea dx, inpSStr
	int 21h
	
	; Подготовка
	xor cx, cx
	mov di, offset inpStrDat
	mov si, offset inpSStrDat
	mov cl, inpStrLen
	
	call findSStr

	test ax, 0
	jnz not_found

	; Есть совпадение, выводим сообщение
	push ax
	mov ah, 09h
	mov dx, offset sResult
	int 21h
	pop ax
	call writeDEC
	jmp exit_prog
	
not_found:
	mov ah, 09h
	mov dx, offset sNotFound
	int 21h
	
exit_prog:
	mov ax, 4c00h
	int 21h
code ends
end start


и в ней присутствует косяк... Вобщем, когда подстроки нет в строке, то программа всё равно выводит сообщение с номером позиции...выводит 0. Мне кажется, что не происходит вот это:

xor ax, ax; не найдено, вернем 0
; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc




 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.12.2008 23:56
Сообщение #32


Гость






Цитата
Мне кажется, что не происходит вот это:

xor ax, ax; не найдено, вернем 0
; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc
Нет... Проблема не тут. Замени вот эти 2 строки:
	test ax, 0
	jnz not_found

на
	or ax, ax
	jz not_found
и проверь...
 К началу страницы 
+ Ответить 
Rocket
сообщение 11.12.2008 0:42
Сообщение #33


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 10.12.2008 23:56) *

Нет... Проблема не тут. Замени вот эти 2 строки:
	test ax, 0
	jnz not_found

на
	or ax, ax
	jz not_found
и проверь...

Идельно! Всё работает! Недеюсь больше по этой программе вопросов не возникнет)

Я решил в первой программе, которая определяла какая из двух строк больше и насколько, решил изменить функцию ввода с 3Fh на 0ah, я же теперь знаю особенности этой функции в отличии от функции 3Fh...
Всё бы ничего, только вот вывод цифры отказывается работать...
Вот собственно сама переделанная программа:

data segment
inpStr1 db 100
inpStrLen1 db ?
inpStrDat1 db 100 dup(?)
inpStr2 db 100
inpStrLen2 db ?
inpStrDat2 db 100 dup(?)

mes1 db 13, 10, 'First is longer!$'
mes2 db 13, 10, 'Second is longer!$'
mes3 db 13, 10, 'Enter the first string: $'
mes4 db 13, 10, 'Enter the second string: $'
outstr db 13, 10, '$' 
count_of_digits dw 2
data ends

code segment
assume cs:code, ds:data

start:	mov AX, data
	mov DS, AX
	
	lea dx,mes3
	mov ah,09h	
	int 21h	
	lea dx,inpStr1	
	mov ah,0ah	
	int 21h


	lea dx,mes4
	mov ah,09h	
	int 21h	
	lea dx,inpStr2	
	mov ah,0ah	
	int 21h

	xor cx,cx
	mov cl,inpStrLen2

	cmp cl, inpStrLen1
	jge m2
	
	xor cx,cx
 	mov cl,inpStrLen1
 	sub cl,inpStrLen2
	mov al, cl

 	call writeDEC	

 	lea dx,mes1
	mov ah,09h	
	int 21h	
   	
	jmp finish	
	
m2:          

      	 xor cx,cx
 	mov cl,inpStrLen1
 	sub cl,inpStrLen2
	mov al,cl

   call writeDEC	



   	lea dx,mes2
	mov ah,09h	
	int 21h		

	
finish: mov ax,4c00h
	int 21h

writeDEC proc

	push ax
	push bx
	push cx
	push dx
	
	xor cx, cx
	mov bx, 10
		
 next_digit:
	xor dx, dx	
	div bx		
	push dx		
	inc cx		
	or ax, ax
	jnz next_digit	
		
next_char:
	pop ax		
	add al, '0'
	int 29h		
	loop next_char
	
	pop  dx
	pop  cx
	pop  bx
	pop  ax
	ret		
writeDEC endp

code ends
end start


по-видимому, что-то с регистрами напутал...или стек?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.12.2008 1:39
Сообщение #34


Гость






Ты просто забыл кое что (например, очистить AX перед занесением в AL разности длин... Ну, младший байт занесется,а то, что было в старшем - останется... И чего ты напечатаешь тогда?), и ошибся при вычислении разности длин в нижнем фрагменте, там надо из второй длины вычитать первую, а ты 2 раза сделал одно и то же... Читай комментарии...


	; ТУТ был ввод двух строк, с ним все правильно...


	; сначала делаешь перевод строки, иначе число напечатается
	; в начале той же строки, где был курсор
	lea dx, outstr
	mov ah, 09h
	int 21h
	
	xor ax, ax	; вот ЭТОГО у тебя вообще не было !!!
	xor cx, cx
	
	mov cl, inpStrLen2
	cmp cl, inpStrLen1
	jge m2	; вторая строка длиннее
	
	xor cx, cx
 	mov cl, inpStrLen1	; от первой
 	sub cl, inpStrLen2	; отнимаем вторую
	mov al, cl
 	call writeDEC	

 	lea dx,mes1
	mov ah, 09h	
	int 21h	
   	
	jmp finish	
	
m2: 
	xor cx, cx
	mov cl, inpStrLen2	; от второй
 	sub cl, inpStrLen1	; отнимаем первую !!!
	mov al, cl
	call writeDEC	
	
	lea dx,mes2
	mov ah, 09h	
	int 21h

finish:
	mov ax,4c00h
	int 21h
 К началу страницы 
+ Ответить 
Rocket
сообщение 11.12.2008 22:40
Сообщение #35


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 11.12.2008 1:39) *
Ты просто забыл кое что (например, очистить AX перед занесением в AL разности длин... Ну, младший байт занесется,а то, что было в старшем - останется... И чего ты напечатаешь тогда?), и ошибся при вычислении разности длин в нижнем фрагменте, там надо из второй длины вычитать первую, а ты 2 раза сделал одно и то же... Читай комментарии...

Большое человеческое спасибо! good.gif

Сообщение отредактировано: volvo - 14.01.2009 0:29
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 22.07.2025 20:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"