Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2009, 22:08   #1
sande
 
Регистрация: 16.01.2009
Сообщений: 7
По умолчанию Сортировка одномерного массива введенного с клавиатуры по возрастанию

Не могу разобратся с программой.;( что тут не правильно вроде конкретно основном цикле программы?
Задание: "Сортировка одномерного массива введенного с клавиатуры по возрастанию"
Цитата:
title Primer
assume cs:c,ds,ss:s
s segment stack ; описываем сегмент стека из 128 слов
dw 128 dup(?)
s ends

d segment ; описываем сегмент данных
X dw 10 dup (?) ; начиная с адреса Х следует резервировать 10 слов.
B dw 10 dup (?) ; начиная с адреса В следует резервировать 10 слов.
N dw ? ; область памяти для хранения числа
msgN db 'N= ?$' ; приглашение к вводу н

cr = 0dh ; данные для процедур ввода и вывода чисел
lf = 0ah
string db 255, 0, 255 dup (?)
errmsg db 'error: illegal symbol'
crlf db cr,lf,'$'
negflag dw ?

d ends

c segment ; описываем сегмент кодов команд
IntegerOut proc ; процедура вывода целого числа из ax
xor cx,cx
mov bx,10
cmp ax,0
jge m
neg ax
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
m: inc cx
xor dx,dx
div bx
push dx
or ax,ax
jnz m
m1: pop dx
add dx,'0'
mov ah,2
int 21h
loop m1
IntegerOut endp

IntegerIn proc ; процедура ввода целого числа в ax
mov ah,0ah
lea dx,string
int 21h
xor ax,ax
lea si,string+2
mov negflag,ax
cmp byte ptr [si],'-'
jne m2
not negflag
inc si
jmp m3
m2: cmp byte ptr [si],'+'
jne m3
inc si
m3: cmp byte ptr [si],cr
je ex1
cmp byte ptr [si],'0'
jb er
cmp byte ptr [si],'9'
ja er
mov bx,10
mul bx
sub byte ptr [si],'0'
add al,[si]
adc ah,0
inc si
jmp m3
er: lea dx,errmsg
mov ah,9
int 21h
jmp IntegerIn
ex1: cmp negflag,0
je ex
neg ax
ex: push ax
mov ah,9
lea dx,crlf
int 21h
pop ax
ret
IntegerIn endp

start: mov Ax,d; точка запуска программы
mov Ds,Ax
mov Ah,9
lea Dx,MSG
int 21h
call IntegerIN; вывели приглашение ввести N
mov N,Ax; размещаем введенное число в регистре Ах
mov Cx,N
xor Si,Si; обнуляем регистр Si.
K: push Cx ; заносим содержимое Сх в стек
push Si; заносим содержимое Si в стек
call IntegerIN; вызываем процедуру ввода
pop Si; вытаскиваем из стека в регистр Si
pop Cx
mov A[Si],Ax; кладем элемент массива Х, который отстает от нач.адреса на 0.
add Si,2; увеличиваем смещение на 2
loop K; переходим на метку К, пока Сх не станет равным нулю.


g1: mov bl,0
g2: cmp al,ah
ja yes
n: inc si
dec di
jne g2

yes:
call sort ;На сортировку
jmp n
exit:
mov ah,4ch
int 21h
sort proc ;Процедура сортировки
mov byte ptr[si],ah
mov byte ptr[si+1],al
mov bl,1
ret
sort endp
call IntegerOut; выводим результат
mov Ah,4ch; завершаем работу программы.
int 21h
c ends
end start

code ends
end start
sande вне форума Ответить с цитированием
Старый 17.01.2009, 00:31   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

До конкретного цикла - ещё как до Китая

Assembling file: proga15.asm
**Error** proga15.asm(93) Undefined symbol: MSG
**Error** proga15.asm(104) Undefined symbol: A
**Error** proga15.asm(112) Symbol already different kind: N

1. Что за переменная MSG ?
2. Где объявление массива A ?
3. Почему переменная и метка имеют одинаковые имена ?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 17.01.2009, 08:17   #3
sande
 
Регистрация: 16.01.2009
Сообщений: 7
По умолчанию

Как сделать прерывание обработки массива на 1 секунду? Помогите пожалуйста очень надо;(
или может у кого есть что нить подобное?
"Отсортировать одномерный массив в порядке возрастания с прерыванием обработки массива на 1 секунду"

Цитата:
assume CS: code, DS: data
code segment
begin:
mov AX, data
mov DS, AX

mov AH, 09h
mov DX, offset mes1
int 21h

mov cx,10
mov si,0

show_primary:
mov dx,mas[si]
add dl,30h
mov ah,02h
int 21h
add si,2
loop show_primary

internal:
mov j,9
jmp cycl_j
exchange:
mov bx,i
shl bx,1
mov ax,mas[bx]
mov bx,j
shl bx,1
cmp ax,mas[bx]
jle lesser

mov bx,i
shl bx,1
mov temp,ax

mov bx,j
shl bx,1
mov ax,mas[bx]
mov bx,i
shl bx,1
mov mas[bx],ax

mov bx,j
shl bx,1
mov ax,temp
mov mas[bx],ax
lesser:
dec j
cycl_j:
mov ax,j
cmp ax,i
jg exchange

inc i
cmp i,n
jl internal

mov AH, 09h
mov DX, offset mes2
int 21h

mov cx,10
mov si,0

show:
mov dx,mas[si]
add dl,30h
mov ah,02h
int 21h
add si,2
loop show

mov AH, 08h
int 21h

mov AH, 4Ch
mov AL, 00h
int 21h


code ends

data segment
mes1 db 'Primary Massiv:$',10,13
mes2 db 'Massiv After Sorted:$'
n equ 9
mas dw 2,7,4,0,1,9,3,6,5,8
i dw 0
j dw 0
temp dw 0
data ends

stk segment stack
dw 128 dup (0)
stk ends

end begin
sande вне форума Ответить с цитированием
Старый 17.01.2009, 08:41   #4
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

самое простое - sleep
Д'якон вне форума Ответить с цитированием
Старый 17.01.2009, 18:11   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Можно вот так:

Код:
sleep proc
mov [tempsleep], 0
push cx
mov ah, 2Ch
int 21h
mov [tempsleep], dl
pop cx
sleep1:
push cx
mov ah, 2Ch
int 21h
sub dl, [tempsleep]
cmp dl, 0
jnl sleep2
add dl, 100
sleep2:
add [tempsleep], dl
cmp [tempsleep], 100
jl sleep3
sub [tempsleep], 100
sleep3:
pop cx
xor ax, ax
mov al, dl
sub cx, ax
cmp cx, 0
jnl sleep1
ret
sleep endp
переменные для функции:

Код:
data segment
tempsleep db, 0 ;переменные для sleep
data ends
Вызов:

Код:
mov cx, 300 ; количество 10-ти милисекундных интервалов (т.е. здесь 3 сек.)
call sleep
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 17.01.2009, 22:07   #6
sande
 
Регистрация: 16.01.2009
Сообщений: 7
По умолчанию

sps bolshoe.

Вот ещё запарка с прогой, не могу вкупить чего там не хватает;(

через tasm

Цитата:
title Primer
assume cs:c,ds,ss:s
s segment stack ; описываем сегмент стека из 128 слов
dw 128 dup(?)
s ends

d segment ; описываем сегмент данных
X dw 10 dup (?) ; начиная с адреса Х следует резервировать 10 слов.
B dw 10 dup (?) ; начиная с адреса В следует резервировать 10 слов.

A dw 100 dup(?)
msg db 'massiv=$' ; приглашение к вводу н

cr = 0dh ; данные для процедур ввода и вывода чисел
lf = 0ah
string db 255, 0, 255 dup (?)
errmsg db 'error: illegal symbol'
crlf db cr,lf,'$'
negflag dw ?

d ends

c segment ; описываем сегмент кодов команд
IntegerOut proc ; процедура вывода целого числа из ax
xor cx,cx
mov bx,10
cmp ax,0
jge m
neg ax
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
m: inc cx
xor dx,dx
div bx
push dx
or ax,ax
jnz m
m1: pop dx
add dx,'0'
mov ah,2
int 21h
loop m1
IntegerOut endp

IntegerIn proc ; процедура ввода целого числа в ax
mov ah,0ah
lea dx,string
int 21h
xor ax,ax
lea si,string+2
mov negflag,ax
cmp byte ptr [si],'-'
jne m2
not negflag
inc si
jmp m3
m2: cmp byte ptr [si],'+'
jne m3
inc si
m3: cmp byte ptr [si],cr
je ex1
cmp byte ptr [si],'0'
jb er
cmp byte ptr [si],'9'
ja er
mov bx,10
mul bx
sub byte ptr [si],'0'
add al,[si]
adc ah,0
inc si
jmp m3
er: lea dx,errmsg
mov ah,9
int 21h
jmp IntegerIn
ex1: cmp negflag,0
je ex
neg ax
ex: push ax
mov ah,9
lea dx,crlf
int 21h
pop ax
ret
IntegerIn endp



start: mov Ax,d
mov Ds,Ax
mov Ah,9
lea Dx,MSG
int 21h
call IntegerIN
mov A,Ax
mov Cx,A
xor Si,Si
K: push Cx
push Si
call IntegerIN
pop Si
pop Cx
mov A[Si],Ax
add Si,2
loop K


G1: mov al,byte ptr ds:[si] ;Элемент массива
mov ah,byte ptr ds:[si+1] ;Последующий элемент массива
cmp al,ah
ja G3

G2:
inc si
dec di ;Уменьшение операнда на единицу
jne G1

G3:
call sort ;На сортировку
jmp G2

exit:
mov ah,4ch
int 21h
sort proc ;Процедура сортировки
mov byte ptr[si],ah
mov byte ptr[si+1],al
mov bl,1
ret
sort endp

call IntegerOut; выводим результат
mov Ah,4ch; завершаем работу программы.
int 21h
c ends
end start

Последний раз редактировалось sande; 17.01.2009 в 22:32.
sande вне форума Ответить с цитированием
Старый 18.01.2009, 00:06   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Я честно говоря не вижу выхода из этого цикла:

Код:
G1: mov al,byte ptr ds:[si] ;Элемент массива
mov ah,byte ptr ds:[si+1] ;Последующий элемент массива
cmp al,ah
ja G3

G2: 
inc si
dec di ;Уменьшение операнда на единицу
jne G1

G3:
call sort ;На сортировку
jmp G2
Можете пояснить;
dec di ;Уменьшение операнда на единицу - вот это, зачем ??
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 18.01.2009, 15:20   #8
sande
 
Регистрация: 16.01.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Я честно говоря не вижу выхода из этого цикла:

Код:
G1: mov al,byte ptr ds:[si] ;Элемент массива
mov ah,byte ptr ds:[si+1] ;Последующий элемент массива
cmp al,ah
ja G3

G2: 
inc si
dec di ;Уменьшение операнда на единицу
jne G1

G3:
call sort ;На сортировку
jmp G2
Можете пояснить;
dec di ;Уменьшение операнда на единицу - вот это, зачем ??
а как ты бы сделал этот цикл?
sande вне форума Ответить с цитированием
Старый 18.01.2009, 19:36   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Я бы его вообще не так сделал:

Код:
mov cx, N ; N - количество элементов в массиве
lea di, A
next:
push cx
mov ax, N
sub ax, cx
shl ax, 1
lea si, A
add si, ax
mov ax, word ptr [di]
next2:
mov dx, word ptr [si]
cmp dx, ax
jnl next3
mov word ptr [si], ax
mov word ptr [di], dx
mov ax, dx
next3:
add si, 2
loop next2
add di, 2
pop cx
loop next
Вложения
Тип файла: rar proga15.rar (1.4 Кб, 84 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 18.01.2009, 20:31   #10
sande
 
Регистрация: 16.01.2009
Сообщений: 7
По умолчанию

sps bolshoe!)
sande вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод массива улиткой по возрастанию 7 на 8 Злая белка Паскаль, Turbo Pascal, PascalABC.NET 7 13.01.2009 22:18
сортировка числовой последовательности по возрастанию Solniffko Паскаль, Turbo Pascal, PascalABC.NET 7 14.11.2008 08:36
из одномерного массива сделать матрицу Шико Паскаль, Turbo Pascal, PascalABC.NET 8 28.05.2008 08:26
Сортировка одномерного массива (ASM & C) voron Помощь студентам 0 02.12.2007 13:41