buffer db 11 ; Нулевой байт буфера
entered db (?) ; Число введенных символов
string db 11 dup (?) ; Введенные символы
lea dx, buffer ; Адрес буфера в dx
mov ah, 0ah ; Номер функции в аh
int 21h ; Вызов функции
.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
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
mov AX, data
mov DS, AX
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
lea dx, X
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:
; В сегменте данных:
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:
; ...
MODEL small(процедуру writeDEC возьми из предыдущих постов, я не стал ее опять копировать...)
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
mov di, offset inpStrDatчто делает конструкция такого вида?
mov cl, inpStrLenпочему в cl сразу помещается размер строки?
beginCompare:, где мы должны проверять последующие за первой буквы, мы снова проверяем совпадение первых букв, так ли это?
; можно вот так получить смещение inpStrDatВ обоих случаях смещение этого массива от начала сегмента будет занесено в регистр DI...
; в сегменте данных
mov di, offset inpStrDat
; а можно - вот так:
lea di, inpStrDat
NAMEPAR LABEL BYTE ; Список параметров:
MAXLEN DB 20 ; Максимальная длина
ACTLEN DB ? ; Реальная длина
NAMEFLD DB 20 DUP (' ') ; Введенные символы
mov cl, inpStrLenпочему в cl сразу помещается размер строки?
beginCompare:, где мы должны проверять последующие за первой буквы, мы снова проверяем совпадение первых букв, так ли это?
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
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
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
xor ax, ax; не найдено, вернем 0
; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc
xor ax, ax; не найдено, вернем 0
; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc
test ax, 0
jnz not_found
or ax, axи проверь...
jz not_found
test ax, 0
jnz not_found
or ax, axи проверь...
jz not_found
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
; ТУТ был ввод двух строк, с ним все правильно...
; сначала делаешь перевод строки, иначе число напечатается
; в начале той же строки, где был курсор
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