Страница 1 из 1

Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 14:19
В/\@Д
Знающие люди!Очень прошу помочь с данной проблемой.задание:
Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры несколько строк (конец ввода пустая строка) и сортирует их в лексикографическом порядке.

Я написал программу, правда две процедуры объединил в одну, но при сравнении программа считает все символы одинаковыми. Грешу на массив. Вероятно что то не так именно в нем, но додуматься не удается.Вот то что я написал:
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

Заранее благодарен за помощь

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:13
airyashov
да хоть подумайте, что пишете, все элементы будут одинаковы в массиве adr
память то одна и таже под строку, что толку несколько раз вводить строку в 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

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:16
В/\@Д
ммм.я так и думал =). а как же решить проблему?

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:18
В/\@Д
просто я думал что новая строка имеет новый адрес

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:22
airyashov
1. либо ограничить количество строк: а) для каждой строки новый буфер ввода б) один буфер и потом копировать в выделенную память введенную строку
2. либо использовать один буфер ввода, а введенную строку копировать в др участок памяти выделяемый динамически.

так как у вас срока с адресами содержит 15 элементов, то более 15 строк все равно не введете, логически :)

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:27
В/\@Д
по заданию количество строк не определено.а нельзя ли принудить программу писать строку в др область памяти?

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:29
В/\@Д
ну 15 это по максимуму.если кому то хватит терпения писать 15 строк,могу там написать и 9999999 =)

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:32
airyashov
Можно сколько хочется, но память то не безгранична, тогда нужно выделять память динамически, наверное идеально связанный список строк сделать.

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:38
В/\@Д
Спасибо за совет. Попробую переделать под определенное число строк. Динамическое выделение пока сложновато для меня.

Re: Проблема при работе с массивом адресов строк

Добавлено: 21 май 2008, 15:39
В/\@Д
Ибо 1й курс х)