Главная » Просмотр файлов » assembler. Учебник для вузов_Юров В.И_2003 -637с

assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 74

Файл №862834 assembler. Учебник для вузов_Юров В.И_2003 -637с (Юров В.И - Assembler. Учебник для вузов. 2003) 74 страницаassembler. Учебник для вузов_Юров В.И_2003 -637с (862834) страница 742021-12-22СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 74)

Если переменная находится за пределами модуля (процедуры) и должна быть как-то передана в него, то для модуля она является формальнымаргументом. Значение переменной передается в модуль для замещения соответствующего параметра при помощи фактического аргумента. После пояснения различия понятий формального и фактического аргументов далее по тексту они будут называться обобщенно — аргументы, а о каком виде аргументов идет речь,станет понятно по контексту.Если входные данные для модуля (аргументы) — переменные, то один и тот жемодуль можно использовать многократно для разных наборов значений этих переменных. Но как организовать передачу значений переменных в модуль (процедуру)? При программировании на языке высокого уровня программист ограниченв выборе способов передачи аргументов теми рамками, которые для него оставляет компилятор. В языке ассемблера практически нет никаких ограничений на этотсчет, и, фактически, решение проблемы передачи аргументов предоставлено программисту.Процедуры в языке ассемблера331На практике используются следующие варианты передачи аргументов в модуль (процедуру):через регистры;через общую область памяти;г через стек;' с помощью директив EXTRN и PUBLIC.Передача аргументов через регистрыПередача аргументов через регистры — наиболее простой в реализации способ передачи данных.

Данные, переданные подобным способом, становятся доступныминемедленно после передачи управления процедуре. Этот способ можно рекомендовать для передачи небольших объемов данных. Недостатки этого способа:небольшое число доступных для пользователя регистров;' необходимость постоянно помнить о том, какая информация в каком регистренаходится;ограничение размера передаваемых данных размерами регистра — если размерданных превышает 8, 16 или 32 бита, то передачу данных посредством регистров произвести нельзя и передавать приходится не сами данные, а указатели наних.Передача аргументов через регистры широко применяется при вызове функций DOS.В главе 14 мы обсуждали программу (см. листинг 14.2) с макрокомандой, которая подсчитывала длину строки, оканчивающуюся символом $.

Для сравненияэффективности применения макрокоманд и процедур при программировании разработаем аналогичную программу (листинг 15.3), но с использованием процедуры CountSymbol, подсчитывающей количество символов в строке с конечным символом $. Процедура располагается в конце программы. Длина строки — не более99 символов. Адрес строки передается процедуре как аргумент через регистр si.Результат подсчета возвращается в регистр BL и выводится на экран в вызывающей программе.

Для вывода на экран используется прямой доступ к видеобуферу.Листинг 15.3. Передача аргументов через регистры; prg_15_3 . asmHASMMODELsmall;модель памятиSTACK 256; размер стекаinclude mac.incподключение файла с макросами.data;начало сегмента данныхmaskddb 71h;маска вывода на экранstring db "Строка для подсчета $" ;тестовая строкаmes db "В строке string "cnt db 2 dup ("*") ; количество символов в строкеdb " символов" , 10,13, ' $ '. codemainprocmov ax,@datamov ds.ax;точка входа в главную процедурудпродолжение332Глава 15. Модульное программированиеЛистинг 15.3(продолжение);загрузка адреса строки;(для передачи смещения в процедуру)lea si.string;вызов процедурыcall CountSymbolmov cl.bl;счетчик для lods и stoswlea si,string ;в si - указатель на строкуmov ax.ObSOOhmov es.ax;загрузка в es адреса видеопамятиmov ah.maskd;маска вывода на экранmov di,160;позиция вывода на экранeld;просмотр вперед - для lodsb и stoswdisp:lodsb;пересылка байта из ds:si в alstoswкопирование значения ах;в es:di (видеобуфер)loop disp;повтор цикла сх раз;а теперь выведем количество символов в строкеmov al.blaam;в al две упакованные BCD-цифрырезультата подсчетаor ах.ЗОЗОппреобразование результата в код ASCIImov cnt.ahmov cnt+l,alOutStr mes;вывод строки mesExit;макрос выходаmainendp;конец главной процедурыCountSymbol procnear;процедура CountSymbol - подсчет символов в строке.;На входе: si - смещение строки;На выходе: Ы - длина в виде упакованного BCD-числаpush axсохранение используемых регистровpush схeld;просмотр впередmov сх.100максимальная длина строки;блок подсчета символовgo:lodsb;загрузка символа строки в alcmp al,'$'je endstrjcxz no_endinc Ы;приращение счетчика в Ы - количествоподсчитанных символов в строкеloop go;повтор циклаendstr:;конец строкиpop сх-.восстановление регистров из стекаpop axret;возврат из процедурыno_end:;какие-то действия по обработке ситуации;отсутствия в строке символа $ret:возврат из процедурыCountSymbol endp;конец процедурыend main;конец программыПередача аргументов через общуюобласть памятиПередача аргументов через общую область памяти предполагает, что вызывающаяи вызываемая программы условились использовать некоторую область памяти какПроцедуры в языке ассемблера333общую.

Транслятор предоставляет специальное средство для организации такойобласти памяти. В главе 5 мы разбирали директивы сегментации и их атрибуты.Один из них — атрибут комбинирования сегментов. Наличие этого атрибута указывает компоновщику, как нужно комбинировать сегменты, имеющие одно имя.Значение common означает, что все сегменты, имеющие одинаковое имя в объединяемых модулях, располагаются компоновщиком начиная с одного адреса оперативной памяти.

То есть они будут просто перекрываться в памяти и, следовательно, совместно использовать выделенную память.Недостатком этого способа в реальном режиме работы процессора являетсяотсутствие средств защиты данных от разрушения, так как нельзя проконтролировать соблюдение правил доступа к этим данным.Рассмотрим листинг 15.4 с примером использования общей области памяти дляобмена данными между модулями.

На этот раз программа состоит уже из двух независимых модулей, находящихся в разных файлах, и поэтому они представляютсобой отдельные единицы трансляции. Функционально эти модули реализуютнесложную задачу, которая заключается в том, что вызываемые процедуры формируют строку символов и передают ее через общую область, а вызывающая ихпроцедура main выводит строку на экран.Листинг 15.4. Передача аргументов через общую область памяти (модуль 1);prg!5_4.asminclude mac.incподключение файла с макросамиstk segment stackdb 256 dup (0)stk endscommon_data segment para common "data" ;начало общей области памятиbut db 15 DUP (" ");буфер для хранения строкиtempdw 0common_data endsextrnPutChar:far,PutCharEnd:farcodesegment;начало сегмента кодаassume cs:code,es:common_datamainprocmov ax,common_datamov es.ax;вызов внешних процедурcall PutCharcall PutCharEndpushespop dsOutStr bufExitстандартный выходmainendp;конец главной процедурыcodeendsend mainВызываемые процедуры находятся в другом модуле (листинг 15.5).

Обратитевнимание на то, что совсем не обязательно, чтобы данные в сегментах common имели одинаковые имена. Главное, и за этим нужно следить с особой тщательностью, —структура общих сегментов. Она должна быть абсолютно идентичной во всех модулях программы, обменивающихся данными через общую память.Листинг 15.5. Передача аргументов через общую область памяти (модуль 2);prg!5_5.asminclude mac.incподключение файла с макросами^л334Глава 15. Модульное программированиеЛистинг 15.5 (продолжение)stk segment stackdb 256 dup (0)stk endspdata segment para public "data"mes db "Общий сегмент",0ah,0dh,'$'tempidb ?temp2 dd ?temp3 dq ?pdata endspublic PutChar,PutCharEndcommon_data segment para common "data" ;начало общей области памятиbuffer db 15 DUP (" ");буфер для формирования строкиtmpSIdw 0common_data endscodesegment; начало сегмента кодаassume cs:code,es:common_data,ds:pdataPutChar proc farобъявление процедурыeldmov si ,0irpc en,<работает!>mov buffer[si],'&ch'inc siendmmov tmpSI.siret;возврат из процедурыPutChar endp;конец процедурыPutCharEnd procfarmov si,tmpSImov buffer[si],'$'retPutCharEnd endpcodeendsendТак как в данном примере программа состоит уже из двух модулей, то возникает естественный вопрос: как собрать ее в один исполняемый модуль? Можно предложить следующую последовательность шагов.1.

Выполнить трансляцию файла prg!5_4.asm и получить объектный модульprg!5_4.obj:tasm /zi prg!5_4.asm,,,2. Выполнить трансляцию файла prg!5_5.asm и получить объектный модульprg!5_5.obj:tasm /zi p r g ! 5 _ 5 . a s m , , ,3. Скомпоновать программу утилитой TLINK командной строкой вида:tlink /v prg!5_4.obj + prg!5_4.objВ итоге будет создан исполняемый файл prgl5_4.exe. Интересно исследоватьего с использованием отладчика.

После загрузки prgl5_4.exe в отладчик в окнеModule появится только исходный текст программы из файла prgl5_4.asm. И лишьпосле вызова процедуры по команде CALL (нажатием клавиши F7) в окно будет загружен текст вызванной процедуры.Передача аргументов через стекПередача аргументов через стек при вызове процедур используется наиболее часто. Суть этого способа заключается в том, что вызывающая процедура самостоя-Процедуры в языке ассемблера335тельно заносит в стек передаваемые данные, после чего обращается к вызываемойпроцедуре. В главе 10 мы рассматривали процессы, происходящие при передачеуправления процедуре и возврате из нее. При этом мы обсуждали содержимое стека до и после передачи управления процедуре (см. рис.

10.4 и 10.5). Как следует изэтих рисунков, при передаче управления процедуре процессор автоматически записывает на вершину стека два (для процедур типа near) или четыре (для процедур типа far) байта. Вы помните, что эти байты являются адресом возврата в вызывающую программу. Если перед передачей управления процедуре командой CALLв стек были записаны переданные процедуре данные или указатели на них, то ониокажутся под адресом возврата.При рассмотрении архитектуры процессора мы выяснили, что стек обслуживается тремя регистрами: SS, SP и В Р. Процессор автоматически работает с регистрами SS и SP в предположении, что они всегда указывают на вершину стека.

Характеристики

Тип файла
PDF-файл
Размер
14,34 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6363
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее