Ассемблер. Обработка числовых массивов
Необходимо упорядочить массив по возрастанию, а так же вывести массивы до и после на экран.
Помогите пожалуйста.:) очень надо!!!
в чем проблема?
но главное это вывод массива с отрицательными числами и их то как их упорядочить в матрице.
упорядочить так же,как и беззнаковые,только использовать переходы jg\jl для знаковых чисел.
ассемблер - dos
а какая разница дос виндоус линукс.
Цитата: cursor
а какая разница дос виндоус линукс.
в windows проще перевести число в строку,например,или скопировать участрок памяти,или вывести на экран,используя стандартные функции.
KlepaCat работа по написанию продвигается?:)
Не очень(( на время праздников забросила, сейчас начну ломать голову с новыми силами...
+ плюсом к тому заданию, также является обработка прерываний 64h))
Вот код:
model small ;используемая модель памяти(для ехе)
STACK 100h ;стек*
.386
DATASEG
a dw 16000,16000,16000,48
dw 58,-6,27,-8
dw 99,110,-111,-42
dw 15, -46, 38, 43
flag dw ?
tab dw ?
taab dw ?
promt1 db 'Ishodniyi massiv:',13,10,'$'
promt3 db 'Resultat:',13,10,'$'
timerSeg dw ? ;в этих переменных будет сохранен
timerOfs dw ? ;первоначальный вектор прерывания 1ch isr
;-----------------------------------------------------------------------------------
CODESEG
;получаем вектор прерывания , есть стандартный, заменяем на наш
;чтобы восстановить, восстанавливаем сегментные переменные изт стека
mov ax,@data ; Указатель на сегмент данных
mov ds,ax ; в ds
xor ax,ax ; Обнуляем регистры
xor bx,bx
xor dx,dx
xor si,si
xor di,di
;вывод исходного масссива
lea dx,promt1; вывели надпись
mov ah,9H; выдать строку
int 21H
call outmas; вывод массива
;////////////////////////////////////////////////////////////////////
;/////////////настройка прерывания/////////////////////////////
push es ;сохранить регистр es
;(используем функция 35h прерывания 21h)
mov ax,3564h ;получить вектор (адрес) прерывания
;Вектор прерывания находится в ES:BX
int 21h ;вызов DOS по этому вектору
; Сохраним вектор
mov [timerSeg],es ;сохранить значения сегмента
mov [timerOfs],bx ;сохранить значение смещения
pop es ;восстановить es
push ds ;сохранить регистр ds
push cs ;установить ds = cs адресу
pop ds ;новой ISR, поместив полный
mov dx, offset sort ;адрес процедуры в ds:dx
;dx содержит указатель на процедуру
;функция 25h прерывания 21h (ds - сегмент обработчика dx-смещение обработчика)
mov ax,2564h ;установить вектор прерывания
int 21h
pop ds ;восстановить ds
;///////////////////////////////////////////////////////////////////
int 64h ;здесь срабатывает процедура sort, (сортировка массива)
;//////////////////////////////////////////////////////////////////////////////
;восстанавливаем старый вектор прерывания
push ds ;сохранить ds изменяемый ниже(сегмент данных)
mov ax,2564h ;установить вектор прерывания 1с
mov dx,[timerOfs] ;получить сохраненную величину смещения
mov ds,[timerSeg] ;получить сохраненную величину сегмента
int 21h
pop ds ;восстановить ds
;/////////////////////////////////////////////////////////////////////////////
lea dx,promt3;вывод надписи
mov ah,9H
int 21H
call outmas ;вывод массива
mov ah,4ch; функция дос завершения программы
int 21h
;==========================================================================================
; ----------------------------------------------
;сортировка элементов матрицы (пузырьком)
sort proc
pusha;поместить регистры eax ecx edx ebx esp ebp esi edi в стэк. Регистр edi оказывается на вершине
mov cx,15;количество проходов
Re1:mov bx,0; начинаем с первого элемента
push cx; сохраняем кол-во итераций в стек
Re2:xor ax,ax; сравниваем
mov ax,a[bx];текущий элемент
cmp ax,a[bx+2];с последущим
jle NoCh;текущий меньше или равен
mov dx,a[bx+2]; текущий больше
mov a[bx+2],ax; меняем его местами
mov a[bx],dx;с последущим
NoCh:add bx,2; сдвигаемся на след эл-т
loop Re2; пока не дошли до конца
pop cx;извлекаем сх
dec cx;уменьшаем на 1 кол-во просматриваемых эл-ов
cmp cx,1; сравниваем с 1
jg Re1; больше 1 повторяем проход
popa
ret; ментше или равно массив отсортирован
sort endp
; -------------------------------------
outp proc;Процедура вывода числа. Число передаётся в AX
outp: mov flag,0
cmp ax,0
mov tab,6
mov taab,0
jge no;переход если больше или равно,
;следует использовать при сравнении чисел со знаком
mov flag,1
neg ax;отрицание ax
No : push ax; помещение в стек
push cx
push dx
push bx
xor cx,cx;Количество цифр
add taab,1
mov bx,000Ah;Основание системы счисления, в которой выводим число
cont: xor dx,dx
div bx;Получаем крайнюю справа цифру
push dx;Запоминаем
add taab,1
inc cx
or ax,ax;Если получили не все цифры, продолжаем
jnz cont
;Итак, сохранились все цифры, справа налево.
;Сохраняли в стэке => цифры будут извлекаться
; слева направо, что и требуется при выводе
push cx
mov cx,8
sub cx, taab
mov tab, cx
pop cx
push cx
mov cx, tab
tabu:
mov dl,' '
mov ah,2
int 21h
loop tabu
pop cx
cmp flag,1
jne G; не равно
push ax
push dx
;mov dl,'-'
;mov ah,2
;int 21h
pop dx
pop ax
G: mov ah,02h;Функция вывода символа
; push cx
; mov cx, tab
;tabbu:
; mov dl,' '
; mov ah,2
; int 21h
; loop tabbu
; pop cx
next: pop dx;Восстанавливаем цифру
add dl,30h;Переводим её в символ
int 21h;Выводим
add tab,1
loop next
pop bx
pop dx
pop cx
pop ax
ret
outp endp
; ----------------------------------------------------------
;процедура вывода массива
outmas proc
pusha;поместить регистры eax ecx edx ebx esp ebp esi edi в стэк. Регистр edi оказывается на вершине
;вывод массива
mov cx,4;счетчик для цикла OOut1
mov bx,0;заносим значения счетчиков
OOut1: push cx;поместить операнд в стэк
mov cx,4;счетчик присваиваем новое значение счетчику, после занесения в стек (числа одинаковые,тк у нас квадратная матрица)
;счетчик для цикла L1
L1:; начало цикла
mov ax,a[bx]
call outp;процедура вывода на экран
call space;процедура для пробела
add bx,2; сложение
loop L1 ; конец цикла L1
call _newline1; новая строка
pop cx
loop OOut1; завершение цикла
popa;извлечь регистры общего назначения после команды pusha (кроме esp)
outmas endp
; ---------------------------------------------------
; переход на новую строку
_newline1 PROC
PUSH AX; заносим в стек значения
PUSH DX;стандартная процедура перехода на новую строку
MOV AH,02h; Функция вывода одиночного элемента
MOV DL,13; возврат каретки
INT 21h;вызов dos
MOV DL,10; перевод на новую строку
INT 21h
POP DX; извлекаем из стека
POP AX
RET
_newline1 ENDP
; ---------------------------------------------------------------
; пробелы
space proc
push ax
push dx
push cx
mov cx, 2
; sub cx, tab
tabyl:
mov dl,' '
mov ah,2
int 21h
loop tabyl
pop cx
pop dx
pop ax
ret
space endp
; ----------------------------------------------------------------
end
Код:
…