Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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; Нарушение авторских прав |