Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Массив целых цисел

Автор: John 3.11.2007 3:05

Привет всем!! Вот в четверг начали изучать в инсте ассемблер и сразу вот такое задание:

Из массива целых чисел, определенных в области данных программы в формате слова, найти минимальное и максимальное значение. Сохранить их разность как результат в области данных программы. Пояснить особенности выполнения машинных команд в отладчике.

Помогите пожалуйста я ничего не понимаю в этом ассемблере,, и еще можете подсказать книгу с доступным методом изложения материала!!

Автор: мисс_граффити 3.11.2007 5:00

Я бы посоветовала учебник для вузов...
Юров В.И. Assembler
Изд-во Питер
у меня 2006 года, может, уже и 2007 есть.

Автор: xds 3.11.2007 21:57

;самая простая модель памяти - один сегмент кода и один сегмент данных
.model small

;устанавливаем размер стека
.stack 2048

;----- сегмент данных -----
.data
;массив
a dw 4, 4, 2, -5, 6, -23, 45, 35, 5, -11, 17
;константа N = количество элементов в массиве
N equ ($ - a) / 2

;сюда сохраним разность максимума и минимума
result dw ?

;----- сегмент кода -----
.code
;метка entry - точка входа в программу, с нее начинается выполнение
;какую метку считать точкой входа указывается в директиве end в конце модуля
entry:
;инициализация сегмента данных
mov ax,@data
mov ds,ax

;поиск минимума и максимума
lea si,a ;si = адрес (смещение) массива
cld

lodsw ;ax = первый элемент массива
mov bx,ax ;в bx будет минимум, для начала - первый
mov dx,ax ;в dx будет максимум, для начала - первый

mov cx,N ;цикл на N интераций
minmax:
lodsw ;ax = очередной элемент массива
cmp ax,bx ;поиск минимума: если ax < bx, то bx = ax
jge minmax1
mov bx,ax
minmax1:
cmp ax,dx ;поиск максимума: если ax > dx, то dx = ax
jle minmax2
mov dx,ax
minmax2:
loop minmax ;повторять с метки minmax N раз

sub dx,bx ;dx = dx - bx = максимум - минимум
mov result,dx ;result = dx

mov ax,4C00h ;выход из программы - вызов функции DOS API
int 21h

;директива end указывает конец модуля и точку входа,
;если это основной (или единственный в программе) модуль
end entry