Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
я написала, только где-то видимо косяк, посмотрите пожалуйста
Код:
.model tiny
.code
org 100h
main:
;============================================================================
mov cx,5
xor si,si
ios:
call input
mov word ptr arr[si],ax
add si,2
loop ios
;==========================================================================
;улучшенный пузырек
mov bx,offset arr
cyc0:
mov ax,l
cmp ax,r
jae exit
mov cx,r
mov ax,l
inc ax
sub cx,ax
mov si,10
cyc1:
mov ax,word ptr[si-2]
cmp word ptr bx[si],ax
jae no1
mov dx,word ptr bx[si]
mov word ptr bx[si-2],dx
mov word ptr bx[si],ax
mov k,si
no1:
sub si,2
loop cyc1
mov ax,k
mov l,ax
mov ax,r
dec ax
add l,ax
mov cx,l
mov ax,l
add ax,2
mov si,ax
cyc2:
mov ax,word ptr bx[si+2]
cmp word ptr bx[si],ax
jle no2
mov dx,word ptr bx[si]
mov word ptr bx[si+2],dx
mov word ptr bx[si],ax
mov k,si
no2:
add si,2
loop cyc2
mov ax,k
mov r,ax
jmp cyc0
exit:
;==================================================================
;вывод
endsort:
mov cx,5
xor si,si
xor ax,ax
xor dx,dx
outp:
call output
loop outp
ret
;========================================================================
;процедура ввода
input proc near
xor ax,ax
xor dx,dx
xor bx,bx
xor di,di
push cx
push si
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h
;перевести строку
mov dl,0ah
mov ah,02;
int 21h
; обрабатываем содержимое буфера
mov si,offset buff+2 ;адрес начала строки
start:
cmp byte ptr[si]," "
je _prop
cmp byte ptr [si],"-" ; если первый символ минус
jnz _poloz ;в противном случае перейти на обработку положительных
mov di,1 ; устанавливаем флаг
_prop:
inc si ; переходим на следующее
_poloz:
xor ax,ax
mov bx,10 ; основание системы счисления
_perevod:
mov cl,[si] ; берем символ из буфера
cmp cl,0dh ; проверям равен ли символ переводу строки
jz _endin ;перейти на конец обработки
; если символ не последний, то проверяем его на правильность
cmp cl,30h ; если введен неверный символ <0
jl _err
cmp cl,39h ; если введен неверный символ >9
ja _err
sub cl,30h ; делаем из символа число
mul bx ; умножаем на 10
jc _err
add ax,cx ; прибавляем к остальным
jc _err
inc si ; переходим на следующее число
cmp di,1
je srav_32768
cmp ax,32767
ja _err
jmp _perevod ; повторяем
srav_32768:
cmp ax,32768
ja _err
jmp _perevod ; повторяем
; если была ошибка, то выводим сообщение об этом и выходим
_err:
mov dx, offset error
mov ah,09
int 21h
int 20h
; все символы из буфера обработаны число находится в ax
_endin:
cmp di,1 ; если установлен флаг, то
jnz _endp
neg ax ; делаем число отрицательным
_endp:
;возвращаем значения регистров
pop si
pop cx
ret
endp input
;====================================================================
;процедура вывода
output proc near
push cx
mov ax, word ptr arr [si]
;; Проверяем число на знак.
test ax, ax
jns @oi1
;; Если оно отрицательное, выведем минус и оставим его модуль.
push ax
mov ah, 02h
mov dl, '-'
int 21h
pop ax
neg ax
;; Количество цифр будем держать в CX.
@oi1:
xor cx, cx
mov bx, 10
@oi2:
;cwd
xor dx,dx
div bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
push dx
inc cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
test ax, ax
jnz @oi2
; Теперь приступим к выводу.
mov ah, 02h
@oi3: pop dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
add dl, 30h
int 21h
; Повторим ровно столько раз, сколько цифр насчитали.
loop @oi3
add si,2
pop cx
mov dx," "
mov ah,02h
int 21h
ret
endp output
arr dw 5 dup(?)
error db "Введено не число$"
buff db 255,255 dup(?)
l dw 1
r dw 10
k dw ?
end main
Алгоритм брала отсюда: http://forum.antichat.ru/printthread.php?t=84743
Единственное, что ограничивает полет мысли программиста-компилятор
Последний раз редактировалось Sparky; 26.12.2009 в 21:05.
|