
lect_15.ppt
- Количество слайдов: 15
ЛЕКЦИЯ № 14 СВЯЗЬ АССЕМБЛЕРА С ЯЗЫКАМИ ВЫСОКОГО УРОВНЯ Формы комбинирования программ на языках высокого уровня с ассемблером: • использование операторов типа inline( ) и ассемблерных вставок; • использование внешних процедур и функций. Преимущества последнего способа: • написание и отладку программ можно проводить независимо; • написанные подпрограммы можно использовать в других проектах; • облегчаются модификация и сопровождение подпрограмм в течение жизненного цикла проекта. 1
Синтаксис директивы proc Операнд язык служит для того, чтобы компилятор мог правильно организовать интерфейс (взаимодействие) между процедурой на ассемблере и программой на языке высокого уровня. В разных языках программирования различаются способы передачи аргументов и правила работы со стеком при вызове процедур. 2
Передача аргументов в языках высокого уровня 3
СВЯЗЬ PASCAL – АССЕМБЛЕР {Программа, вызывающая процедуру на ассемблере} program my_pas; {$D+} {включение полной информации для отладчика} uses crt; procedure asmproc(ch: char; x, y, kol: integer); external; {процедура asmproc обьявлена как внешняя} {$L c: bpworkprg 14_12. obj} BEGIN clrscr; {очистка экрана} asmproc('a', 1, 4, 5); asmproc('s', 9, 2, 7); END. 4
; Процедура на ассемблере, которую вызывает ; программа на Pascal. ; Для вывода на экран используются службы BIOS: ; 02 h - позиционирование курсора. ; 09 h - вывод символа заданное количество раз. MASM MODEL small STACK 256. code asmproc near PUBLIC asmproc ; объявлена как внешняя push bp ; пролог mov bp, sp mov dh, [bp+6] ; номер строки для вывода символа у mov dl, [bp+8] ; номер столбца для вывода х mov ah, 02 h ; номер службы BIOS 5 int 10 h ; вызов прерывания BIOS
; вызов функции 09 h прерывания BIOS 10 h: ; вывод символа из al на экран mov ah, 09 h ; номер службы BIOS mov al, [bp+10] ; символ ch в al mov bl, 07 h ; атрибут символа - в bl xor bh, bh mov cx, [bp+4] ; количество "выводов" ; символа - в cx int 10 h ; вызов прерывания BIOS pop bp ; восстановление bp ; очистка стека и возврат из процедуры ret asmproc end 8 endp ; конец процедуры 6
Основные моменты: • соответствие типа процедуры (far, near) вызову Установка опций компилятора либо использование директив управления компиляцией {$F+; $F-}; • при компиляции и компоновке программы из оболочки языка высокого уровня необходимо сделать доступным объектный код процедуры ; • включение полной отладочной информации Установка опций компилятора либо использование директивы управления компиляцией {$В+}. Передача аргументов при связи модулей на разных языках всегда производится через стек. 7
Изменение содержимого стека при передаче управления Pascal. Ассемблер 8
Действия, выполняемые кодами пролога и эпилога при организации связи Pascal-Ассемблер Действия, выполняемые кодом пролога: 1) сохранить значение bp в стеке; 2 ) записать содержимое sp в bp. Для обращения к первому (со стороны вершины стека) аргументу содержимое bp следует откорректировать на 4/6 байт при near/far вызове в режиме use 16, и на 8/12 байт в режиме use 32. С этой целью к коду пролога можно добавить команду add bp, 4 Действия, выполняемые кодом эпилога: 1) Записать содержимое bp в sp командой mov bp, sp (это необходимо только в том случае, если в процедуре производились манипуляции со стеком); 9
2) Восстановить сохраненный в стеке регистр bp; 3) Удалить из стека переданные процедуре аргументы. Использование директивы ARG Синтаксис директивы ARG 10
Аргументы директивы ARG • имя – идентификатор, который будет использоваться в подпрограмме для доступа к аргументу в стеке; • тип – определяет тип данных аргумента (по умолчанию word для use 16 и dword для use 32); • значение_1 – определяет количество аргументов с данным именем. По умолчанию значение_1=1; • значение_2 – определяет, сколько элементов данного типа задает один данный аргумент. По умолчанию его значение равно 1, но для типа byte значение_2=2, так как стековые команды не работают с одним байтом; • идентификатор – имя константы, значение которой определяет компилятор как суммарный размер в байтах всех аргументов. Пример использования директивы ARG Вызывающий модуль на Паскале приведен ранее 11
MASM MODEL small STACK 256. code main: asmproc near ; обьявление аргументов: arg kol: WORD, y: WORD, x: WORD, chr: BYTE=a_size PUBLIC asmproc push bp ; сохранение указателя базы mov bp, sp ; настройка bp на стек через sp mov dh, byte ptr y ; y в dh mov dl, byte ptr x ; x в dl mov ah, 02 h int 10 h ; номер службы BIOS ; вызов прерывания BIOS 12
mov ah, 09 h ; номер службы BIOS mov al, chr ; символ - в al mov bl, 07 h ; маска вывода символа xor bh, bh mov cx, kol int 10 h ; вызов прерывания BIOS pop bp ; эпилог ; kol в cx ret процедуры a_size asmproc endp end ; конец программы main ; будет ret 8 и выход из ; конец процедуры Для организации межмодульных связей можно также использовать директиву model с операндами. 13
Использование директивы model в ввиде model large, pascal позволяет: • описать аргументы процедуры непосредственно в директиве proc; asmproc near ch: byte, x: word, y: word, kol: word • автоматически сгенерировать код пролога и эпилога в процедуре на ассемблере; • для доступа к аргументам, объявленным в proc использовать их имена. Директива USES uses ebx, edx, esi, edi… Генерируется код сохранения в стеке при входе и восстановления при выходе соответствтующих регистров. Директива LOCAL local lper 1: word, lper 2: word… 14
В стеке организуется кадр для размещения локальных переменных, генерируется соответствующий пролог и эпилог. Организуется доступ к локальным переменным по их идентификаторам. Директивы ENTER и LEAVE Служат для автоматической генерации кодов пролога. Команда ENTER имеет операнды, которыми необходимо пользоваться для правильной генерации пролога и эпилога. Для возврата значения из процедуры (используемой как внешняя функция для программы на Pascal) приняты следующие соглашения Тип возвращаемого значения Куда помещается результат Байт Слово Двойное слово Указатель al ax dx: ax (старшее слово: младшее слово) 15
lect_15.ppt