Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ассемблер. Обработка числовых массивов

63K
27 декабря 2010 года
KlepaCat
8 / / 08.12.2010
Массив размерностью 4 на 4 со знаковыми элементами массива.
Необходимо упорядочить массив по возрастанию, а так же вывести массивы до и после на экран.
Помогите пожалуйста.:) очень надо!!!
316
27 декабря 2010 года
Alm3n
889 / / 29.05.2009
в чем проблема?
63K
27 декабря 2010 года
KlepaCat
8 / / 08.12.2010
В принципе во всем)
но главное это вывод массива с отрицательными числами и их то как их упорядочить в матрице.
316
27 декабря 2010 года
Alm3n
889 / / 29.05.2009
ассемблер dos\windows?
упорядочить так же,как и беззнаковые,только использовать переходы jg\jl для знаковых чисел.
63K
27 декабря 2010 года
KlepaCat
8 / / 08.12.2010
ассемблер - dos
5.4K
28 декабря 2010 года
cursor
114 / / 05.01.2008
а какая разница дос виндоус линукс.
316
28 декабря 2010 года
Alm3n
889 / / 29.05.2009
Цитата: cursor
а какая разница дос виндоус линукс.


в windows проще перевести число в строку,например,или скопировать участрок памяти,или вывести на экран,используя стандартные функции.
KlepaCat работа по написанию продвигается?:)

63K
09 января 2011 года
KlepaCat
8 / / 08.12.2010
Не очень(( на время праздников забросила, сейчас начну ломать голову с новыми силами...
63K
21 января 2011 года
KlepaCat
8 / / 08.12.2010
сделала я эту лабу, решила, вдруг кому понадобится)) выкладываю.
+ плюсом к тому заданию, также является обработка прерываний 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
7
21 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Всё хорошо,только неплохо хотя бы в теги [NoParse]
 
Код:
[/NoParse] взять,ну и форматирование добавить тоже желательно;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог