Тема: Програма "стрічки"
Допоможіть написати програму на мові Assembler, в якій потрібно ввести дві стрічки,а потім вивести їх у алфавітній послідовності.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системне програмування → Програма "стрічки"
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Допоможіть написати програму на мові Assembler, в якій потрібно ввести дві стрічки,а потім вивести їх у алфавітній послідовності.
asm це специфічна мова. Скажіть хоча б під яку ОС.
P.S. Змініть заголовок теми згідно правил
А якісь напрацювання є?
Другий раз повторюю: Змініть заголовок теми згідно правил
ideal
model small
stack 256
dataseg
strichka1 db 'Vvedite strichku1 =>$'
strichka2 db 'Vvedite strichku2 =>$'
rezult1 db 'vyhidna strichka1=>$'
rezult2 db 'vyhidna strichka2=>$'
lan db 40 dup(' '),'$'
codeseg
start:
mov ax,@data
mov ds,ax
mov ax,0600h
mov bh,07
mov cx,0000
mov dx,184fh
int 10h
mov ah,02
mov bh,00
mov dx,0000h
int 10h
mov dx,offset strichka1
mov ah,9
int 21h
mov ah,0ah
mov dx,offset lan
int 21h
jmp exit
e:
mov ah,02
mov bh,00
mov dh,01
mov dl,00
int 10h
mov dx,offset strichka2
mov ah,9
int 21h
mov ah,0ah
mov dx,offset lan
int 21h
jmp ex
exit:
mov ah,02
mov bh,00
mov dx,0300h
int 10h
mov dx,offset rezult1
mov ah,9
int 21h
xor cx,cx
mov si,offset lan+1
mov cl,[si]
k:
inc si
mov dl,[si]
mov ah,2
int 21h
dec cx
cmp cx,0
jz e
jmp k
ex:
mov ah,02
mov bh,00
mov dx,0400h
int 10h
mov dx,offset rezult2
mov ah,9
int 21h
xor cx,cx
mov si,offset lan+1
mov cl,[si]
k1:
inc si
mov dl,[si]
mov ah,2
int 21h
dec cx
cmp cx,0
jz exit2
jmp k1
exit2:
mov ah,7
int 21h
mov ah,4ch
mov al,0
int 21h
end
Код слід брати в тег [ code ]
Ну загалом такі зауваження:
1. Я розумію що програма на асемблері не повинна легко читатись, але в вас все якось занадто заплутано.
2. Не надто зрозумілий загальний алгоритм.
Пропоную такий алгоритм:
1. Зчитати 1 стрічку.
2. Вирахувати де вона закінчується(для більш простого вираховування заповніть lan якимось іншим символом для прикладу '$'заодно і при сортувані буде легше)
3. зчитати другу стрічку на те місце де закінчилась перша.
4. Пересортувати масив lan, заодно вийде алфавітний порядок.
5. Вивести lan.
P.S. При сортуванні символ '$' завжди переносити в кінець
Варто зауважити, що програма написана під ДОС, а не віндовз, бо 16-бітний код, виклики досівських переривань і рядок model small мають поставити під сумнів наступне твердження:
під Windows
Може, під Windows 2.0?
Пане fxi199218, будь ласка, не змушуйте людей додумувати за вас. У вас є завдання і є код. В чому тоді проблема? Тільки не пишіть, що "не працює" - бо тоді отримаєте пораду увімкнути комп'ютер. Опишіть нормально, по-людськи, в одному повідомленні:
- що треба зробити;
- що вже зроблено;
- що саме не так.
Цим ви допоможете в першу чергу собі.
Ну і код бажано якось причесати, зокрема, дати людські імена змінним (що таке lan? а як другий рядок зветься? вихід з чого і куди позначено exit, а з чого exit2?).
Порада - перегляньте всі переходи, у вас явно є зайві. Зокрема,
jz exit2
jmp k1
exit2:
значно красивіше виглядає як
jnz k1
значно красивіше виглядає як
jnz k1
Це не тільки красивіше виглялає, але й виконується швидше на кілька тактів.
І вхзагалі виглядає так ніби код спеціально заплутували
Допоможіть написати програму на мові Assembler, в якій потрібно ввести дві стрічки,а потім вивести їх у алфавітній послідовності.
якщо я правильно зрозумів завдання...
.model small
.stack 100h
print_text macro text
lea dx, text
mov ah, 9
int 21h
endm
.data
maxsize EQU 40
qrstr1 db 'Vvedite strichku1 =>',10,13,'$'
qrstr2 db 'Vvedite strichku2 =>',10,13,'$'
rezstr1 db 'vyhidna strichka1=>',10,13,'$'
rezstr2 db 'vyhidna strichka2=>',10,13,'$'
bufa db maxsize
lena db 0
stra db maxsize dup ('$')
bufb db maxsize
lenb db 0
strb db maxsize dup ('$')
.code
main:
mov ax, @data
mov ds, ax
print_text qrstr1
lea dx, bufa
mov ah, 0Ah
int 21h
print_text qrstr2
lea dx, bufb
mov ah, 0Ah
int 21h
mov al, lena
cbw
mov di, ax
mov stra[di+1],10 ;для корекного виводу стрічки а
mov al, lenb
cbw
mov di, ax
mov strb[di+1],10 ;для корекного виводу стрічки б
xor cx, cx
mov cl, lena
mov si, 0
mov di, 0
cmpr:
mov al, stra[si]
cmp al, strb[di]
jg ag
jl bg
inc si
inc di
loop cmpr
ag:
lea bx, strb
lea cx, stra
jmp exit
bg:
lea bx, stra
lea cx, strb
exit:
print_text rezstr1
mov dx, bx
int 21h
print_text rezstr2
mov dx, cx
int 21h
mov ah, 4Ch
int 21h
end main
end
чи треба враховувати регістр при порівнянні?
І ще порада - до всіх int дописувати коментар, що робить це переривання.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися