Проблема при работе с массивом адресов строк
Модератор: Andy
Знающие люди!Очень прошу помочь с данной проблемой.задание:
Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры несколько строк (конец ввода пустая строка) и сортирует их в лексикографическом порядке.
Я написал программу, правда две процедуры объединил в одну, но при сравнении программа считает все символы одинаковыми. Грешу на массив. Вероятно что то не так именно в нем, но додуматься не удается.Вот то что я написал:
data segment
instr db 20,?,22 dup (?)
adr db 15 dup (?)
slov db ?
prop db 0dh,0ah,"-------",0dh,0ah,"$"
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds, ax
mov ch, 0
lea bx, adr
vv: lea dx, instr
mov ah, 0ah
int 21h
mov al,instr+1
cmp al, 0
je stop
inc ch
lea ax, instr+2
mov [bx], ax;ввести очередной адрес строки в массив
inc bx
lea dx, prop
mov ah, 09h
int 21h
jmp vv
stop:mov slov, ch
call AAA
mov cx, word ptr slov
lea bx, adr
mov ah, 09h
vivod:
mov dx, [bx];-30-
int 21h;
loop vivod
mov ah,01h
int 21h
QUIT: mov ax, 4c00h
int 21h
AAA proc near
mov ax, 0
mov cx, 1
lea di, adr;
beg:cmp cx, word ptr slov
je konec
mov si, [di]; загрузить 1й cимвол из строки
inc ax
mov bx, di
add bx, ax;взять адр след слова
;сравнить с символом след слова
cmp si,[bx]
jg obmen
cmp si,[bx]
je next_simbols
after:
mov dx,word ptr slov
sub dx, cx
cmp dx, ax
je sled_1e_slovo
jmp beg
;-60-
sled_1e_slovo:
inc di
inc cx
jmp beg
mov ax, 0
obmen:
push cx
mov cx, di
mov di, bx
mov bx, cx;-70-
pop cx
jmp after
next_simbols:
push si
push bx
inc di
inc bx
mov si, [di]
mov bx, [bx]
cmp si, bx;-80-
pop bx
pop si
jg obmen
je next_simbols
jmp after
konec: ret
AAA endp
code ends
end START
Заранее благодарен за помощь
Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры несколько строк (конец ввода пустая строка) и сортирует их в лексикографическом порядке.
Я написал программу, правда две процедуры объединил в одну, но при сравнении программа считает все символы одинаковыми. Грешу на массив. Вероятно что то не так именно в нем, но додуматься не удается.Вот то что я написал:
data segment
instr db 20,?,22 dup (?)
adr db 15 dup (?)
slov db ?
prop db 0dh,0ah,"-------",0dh,0ah,"$"
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds, ax
mov ch, 0
lea bx, adr
vv: lea dx, instr
mov ah, 0ah
int 21h
mov al,instr+1
cmp al, 0
je stop
inc ch
lea ax, instr+2
mov [bx], ax;ввести очередной адрес строки в массив
inc bx
lea dx, prop
mov ah, 09h
int 21h
jmp vv
stop:mov slov, ch
call AAA
mov cx, word ptr slov
lea bx, adr
mov ah, 09h
vivod:
mov dx, [bx];-30-
int 21h;
loop vivod
mov ah,01h
int 21h
QUIT: mov ax, 4c00h
int 21h
AAA proc near
mov ax, 0
mov cx, 1
lea di, adr;
beg:cmp cx, word ptr slov
je konec
mov si, [di]; загрузить 1й cимвол из строки
inc ax
mov bx, di
add bx, ax;взять адр след слова
;сравнить с символом след слова
cmp si,[bx]
jg obmen
cmp si,[bx]
je next_simbols
after:
mov dx,word ptr slov
sub dx, cx
cmp dx, ax
je sled_1e_slovo
jmp beg
;-60-
sled_1e_slovo:
inc di
inc cx
jmp beg
mov ax, 0
obmen:
push cx
mov cx, di
mov di, bx
mov bx, cx;-70-
pop cx
jmp after
next_simbols:
push si
push bx
inc di
inc bx
mov si, [di]
mov bx, [bx]
cmp si, bx;-80-
pop bx
pop si
jg obmen
je next_simbols
jmp after
konec: ret
AAA endp
code ends
end START
Заранее благодарен за помощь
да хоть подумайте, что пишете, все элементы будут одинаковы в массиве adr
память то одна и таже под строку, что толку несколько раз вводить строку в 1-н участок памяти
память то одна и таже под строку, что толку несколько раз вводить строку в 1-н участок памяти

Код: Выделить всё
lea bx, adr
vv: lea dx, instr
mov ah, 0ah
int 21h
mov al,instr+1
cmp al, 0
je stop
inc ch
lea ax, instr+2
mov [bx], ax;ввести очередной адрес строки в массив
inc bx
lea dx, prop
mov ah, 09h
int 21h
jmp vv
ммм.я так и думал =). а как же решить проблему?
просто я думал что новая строка имеет новый адрес
1. либо ограничить количество строк: а) для каждой строки новый буфер ввода б) один буфер и потом копировать в выделенную память введенную строку
2. либо использовать один буфер ввода, а введенную строку копировать в др участок памяти выделяемый динамически.
так как у вас срока с адресами содержит 15 элементов, то более 15 строк все равно не введете, логически
2. либо использовать один буфер ввода, а введенную строку копировать в др участок памяти выделяемый динамически.
так как у вас срока с адресами содержит 15 элементов, то более 15 строк все равно не введете, логически

по заданию количество строк не определено.а нельзя ли принудить программу писать строку в др область памяти?
ну 15 это по максимуму.если кому то хватит терпения писать 15 строк,могу там написать и 9999999 =)
Можно сколько хочется, но память то не безгранична, тогда нужно выделять память динамически, наверное идеально связанный список строк сделать.
Спасибо за совет. Попробую переделать под определенное число строк. Динамическое выделение пока сложновато для меня.