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

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

<имя процедуры> 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

dw64 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








Дата добавления: 2015-10-05; просмотров: 1219;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.