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

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

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

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

Заранее благодарен за помощь
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

да хоть подумайте, что пишете, все элементы будут одинаковы в массиве 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
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

ммм.я так и думал =). а как же решить проблему?
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

просто я думал что новая строка имеет новый адрес
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

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

так как у вас срока с адресами содержит 15 элементов, то более 15 строк все равно не введете, логически :)
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

по заданию количество строк не определено.а нельзя ли принудить программу писать строку в др область памяти?
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

ну 15 это по максимуму.если кому то хватит терпения писать 15 строк,могу там написать и 9999999 =)
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

Можно сколько хочется, но память то не безгранична, тогда нужно выделять память динамически, наверное идеально связанный список строк сделать.
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

Спасибо за совет. Попробую переделать под определенное число строк. Динамическое выделение пока сложновато для меня.
В/\@Д
Сообщения: 7
Зарегистрирован: 17 апр 2008, 16:33

Ибо 1й курс х)
Ответить