Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Программирование процедур на Ассемблере





В языке Ассемблера есть понятие процедуры – это участок программы, который начинается директивой

<имя процедуры> proc [<спецификация процедуры>]

и заканчивается директивой

<имя процедуры> endp

Вложенность процедур, в отличие от языка Паскаль, не допускается. Имя процедуры имеет тип метки, хотя за ним и не стоит двоеточие. Вызов процедуры обычно производится командой call, а возврат из процедуры – командой ret.

Спецификация процедуры – это константа –2 (этой служебной константе в Ассемблере присвоено имя far) или –1 (этой служебной константе в Ассемблере присвоено имя near).[23] Если спецификация опущена, то имеется в виду ближняя (near) процедура. Спецификация процедуры – это единственный способ повлиять на выбор Ассемблером конкретного кода операции для команды возврата ret внутри этой процедуры: для близкой процедуры это близкий возврат, а для дальней – дальний возврат. Отметим, что для команды ret, расположенной вне процедуры Ассемблером выбирается ближний возврат.

Изучение программирования процедур на Ассемблере начнём со следующей простой задачи: пусть надо ввести массивы X и У знаковых целых чисел, массив X содержит 100 чисел, а массив Y содержит 200 чисел. Затем необходимо вычислить величину

Будем предполагать, что массивы находятся в одном сегменте данных, а переполнение результата при сложении будем для простоты игнорировать (не выдавать диагностику). Для данной программы естественно реализовать процедуру суммирования элементов массива и дважды вызывать эту процедуру для массивов X и Y. Текст нашей процедуры мы, как и в Паскале, будем располагать перед текстом основной программы (начало программы, как мы знаем, помечено меткой, указанной в директиве end нашего модуля).

Заметим, что, вообще говоря, мы будем писать функцию, но в языке Ассемблера различия между процедурой и функцией не синтаксическое, а чисто семантическое, т.е. о том, что это функция, а не процедура, знает программист, но не программа Ассемблера, поэтому далее мы часто будем использовать обобщённый термин процедура.

Перед тем, как писать процедуру, необходимо составить соглашение о связях между основной программой и процедурой.[24] Это соглашение включает в себя способ передачи параметров, возврата результата работы и некоторую другую информацию. Так, мы "договоримся" с процедурой, что суммируемый массив слов будет располагаться в сегменте данных, адрес первого элемента перед вызовом процедуры будет записан в регистр bx, а количество элементов – в регистр cx. Сумма элементов массива при возврате из процедуры должна находится в регистре ax. При этих соглашениях о связях у нас получится следующая программа (для простоты вместо команд для ввода массивов вы указали только комментарий).

include io.asm

data segment

X dw 100 dup (?)

Y dw 200 dup (?)

Sum dw?

data ends

stack segment stack

dw 64 dup (?)

stack ends

code segment

assume cs:code,ds:data,ss:stack

Summa proc

; соглашение о связях: bx – адрес первого элемента

; cx=количество элементов, ax – ответ (сумма)

sub ax,ax; сумма:=0

L: add ax,[bx]

add bx,2

loop L

Ret

Summa endp

start: mov ax,data

mov ds,ax

; здесь команды для ввода массивов X и У

mov bx, offset X; адрес начала X

mov cx,100; число элементов в X

call Summa

mov Sum,ax; сумма массива X

mov bx, offset Y; адрес начала Y

mov cx,200; число элементов в Y

call Summa

add Sum,ax; сумма массивов X и Y

outint Sum







Date: 2015-10-18; view: 389; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию