1 Востаннє редагувалося fxi199218 (11.03.2014 22:07:12)

Тема: Програма "стрічки"

Допоможіть написати програму на мові Assembler, в якій потрібно ввести дві стрічки,а потім вивести їх у алфавітній послідовності.

2

Re: Програма "стрічки"

asm це специфічна мова. Скажіть хоча б під яку ОС.
P.S. Змініть заголовок теми згідно правил

Подякували: fxi1992181

3

Re: Програма "стрічки"

під Windows

4

Re: Програма "стрічки"

А  якісь напрацювання є?
Другий раз повторюю: Змініть заголовок теми згідно правил

Подякували: fxi1992181

5 Востаннє редагувалося fxi199218 (11.03.2014 22:14:00)

Re: Програма "стрічки"

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 ]

6

Re: Програма "стрічки"

Ну загалом такі зауваження:
1. Я розумію що програма на асемблері не повинна легко читатись, але в вас все якось занадто заплутано.
2. Не надто зрозумілий загальний алгоритм.
Пропоную такий алгоритм:
1. Зчитати 1 стрічку.
2. Вирахувати де вона закінчується(для більш простого вираховування заповніть lan якимось іншим символом для прикладу '$'заодно і при сортувані буде легше)
3. зчитати другу стрічку на те місце де закінчилась перша.
4. Пересортувати масив lan, заодно вийде алфавітний порядок.
5. Вивести lan.
P.S. При сортуванні символ '$' завжди переносити в кінець

Подякували: fxi1992181

7

Re: Програма "стрічки"

Варто зауважити, що програма написана під ДОС, а не віндовз, бо 16-бітний код, виклики досівських переривань і рядок model small мають поставити під сумнів наступне твердження:

fxi199218 написав:

під Windows

8

Re: Програма "стрічки"

Може, під Windows 2.0?

Пане fxi199218, будь ласка, не змушуйте людей додумувати за вас. У вас є завдання і є код. В чому тоді проблема? Тільки не пишіть, що "не працює" - бо тоді отримаєте пораду увімкнути комп'ютер. Опишіть нормально, по-людськи, в одному повідомленні:
- що треба зробити;
- що вже зроблено;
- що саме не так.
Цим ви допоможете в першу чергу собі.
Ну і код бажано якось причесати, зокрема, дати людські імена змінним (що таке lan? а як другий рядок зветься? вихід з чого і куди позначено exit, а з чого exit2?).
Порада - перегляньте всі переходи, у вас явно є зайві. Зокрема,

jz exit2
jmp k1
exit2:

значно красивіше виглядає як

jnz k1

9

Re: Програма "стрічки"

koala написав:

значно красивіше виглядає як

jnz k1

Це не тільки красивіше виглялає, але й виконується швидше на кілька тактів.
І вхзагалі виглядає так ніби код спеціально заплутували

10

Re: Програма "стрічки"

fxi199218 написав:

Допоможіть написати програму на мові 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

чи треба враховувати регістр при порівнянні?

Подякували: 0xDADA11C71

11

Re: Програма "стрічки"

І ще порада - до всіх int дописувати коментар, що робить це переривання.