🗊Презентация Глава 3. Модульное программирование (ассемблер)

Нажмите для полного просмотра!
Глава 3. Модульное программирование (ассемблер), слайд №1Глава 3. Модульное программирование (ассемблер), слайд №2Глава 3. Модульное программирование (ассемблер), слайд №3Глава 3. Модульное программирование (ассемблер), слайд №4Глава 3. Модульное программирование (ассемблер), слайд №5Глава 3. Модульное программирование (ассемблер), слайд №6Глава 3. Модульное программирование (ассемблер), слайд №7Глава 3. Модульное программирование (ассемблер), слайд №8Глава 3. Модульное программирование (ассемблер), слайд №9Глава 3. Модульное программирование (ассемблер), слайд №10Глава 3. Модульное программирование (ассемблер), слайд №11Глава 3. Модульное программирование (ассемблер), слайд №12Глава 3. Модульное программирование (ассемблер), слайд №13Глава 3. Модульное программирование (ассемблер), слайд №14Глава 3. Модульное программирование (ассемблер), слайд №15Глава 3. Модульное программирование (ассемблер), слайд №16Глава 3. Модульное программирование (ассемблер), слайд №17Глава 3. Модульное программирование (ассемблер), слайд №18Глава 3. Модульное программирование (ассемблер), слайд №19Глава 3. Модульное программирование (ассемблер), слайд №20Глава 3. Модульное программирование (ассемблер), слайд №21Глава 3. Модульное программирование (ассемблер), слайд №22Глава 3. Модульное программирование (ассемблер), слайд №23Глава 3. Модульное программирование (ассемблер), слайд №24Глава 3. Модульное программирование (ассемблер), слайд №25Глава 3. Модульное программирование (ассемблер), слайд №26Глава 3. Модульное программирование (ассемблер), слайд №27Глава 3. Модульное программирование (ассемблер), слайд №28Глава 3. Модульное программирование (ассемблер), слайд №29Глава 3. Модульное программирование (ассемблер), слайд №30Глава 3. Модульное программирование (ассемблер), слайд №31Глава 3. Модульное программирование (ассемблер), слайд №32Глава 3. Модульное программирование (ассемблер), слайд №33Глава 3. Модульное программирование (ассемблер), слайд №34Глава 3. Модульное программирование (ассемблер), слайд №35Глава 3. Модульное программирование (ассемблер), слайд №36Глава 3. Модульное программирование (ассемблер), слайд №37Глава 3. Модульное программирование (ассемблер), слайд №38Глава 3. Модульное программирование (ассемблер), слайд №39Глава 3. Модульное программирование (ассемблер), слайд №40Глава 3. Модульное программирование (ассемблер), слайд №41Глава 3. Модульное программирование (ассемблер), слайд №42Глава 3. Модульное программирование (ассемблер), слайд №43Глава 3. Модульное программирование (ассемблер), слайд №44Глава 3. Модульное программирование (ассемблер), слайд №45Глава 3. Модульное программирование (ассемблер), слайд №46Глава 3. Модульное программирование (ассемблер), слайд №47Глава 3. Модульное программирование (ассемблер), слайд №48Глава 3. Модульное программирование (ассемблер), слайд №49Глава 3. Модульное программирование (ассемблер), слайд №50Глава 3. Модульное программирование (ассемблер), слайд №51Глава 3. Модульное программирование (ассемблер), слайд №52Глава 3. Модульное программирование (ассемблер), слайд №53Глава 3. Модульное программирование (ассемблер), слайд №54Глава 3. Модульное программирование (ассемблер), слайд №55Глава 3. Модульное программирование (ассемблер), слайд №56Глава 3. Модульное программирование (ассемблер), слайд №57Глава 3. Модульное программирование (ассемблер), слайд №58Глава 3. Модульное программирование (ассемблер), слайд №59Глава 3. Модульное программирование (ассемблер), слайд №60Глава 3. Модульное программирование (ассемблер), слайд №61Глава 3. Модульное программирование (ассемблер), слайд №62Глава 3. Модульное программирование (ассемблер), слайд №63Глава 3. Модульное программирование (ассемблер), слайд №64Глава 3. Модульное программирование (ассемблер), слайд №65Глава 3. Модульное программирование (ассемблер), слайд №66Глава 3. Модульное программирование (ассемблер), слайд №67Глава 3. Модульное программирование (ассемблер), слайд №68Глава 3. Модульное программирование (ассемблер), слайд №69Глава 3. Модульное программирование (ассемблер), слайд №70Глава 3. Модульное программирование (ассемблер), слайд №71Глава 3. Модульное программирование (ассемблер), слайд №72Глава 3. Модульное программирование (ассемблер), слайд №73Глава 3. Модульное программирование (ассемблер), слайд №74Глава 3. Модульное программирование (ассемблер), слайд №75Глава 3. Модульное программирование (ассемблер), слайд №76Глава 3. Модульное программирование (ассемблер), слайд №77Глава 3. Модульное программирование (ассемблер), слайд №78Глава 3. Модульное программирование (ассемблер), слайд №79Глава 3. Модульное программирование (ассемблер), слайд №80Глава 3. Модульное программирование (ассемблер), слайд №81Глава 3. Модульное программирование (ассемблер), слайд №82

Содержание

Вы можете ознакомиться и скачать презентацию на тему Глава 3. Модульное программирование (ассемблер). Доклад-сообщение содержит 82 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Глава 3   Модульное
программирование
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф. 
	    Иванова Галина Сергеевна
Описание слайда:
Глава 3 Модульное программирование МГТУ им. Н.Э. Баумана Факультет Информатика и системы управления Кафедра Компьютерные системы и сети Лектор: д.т.н., проф. Иванова Галина Сергеевна

Слайд 2





3.1 Организация передачи управления в процедуру и обратно
Процедура в ассемблере – это относительно самостоятельный фрагмент, к которому возможно обращение из разных мест программы. 
На языках высокого уровня такие фрагменты оформляют соответствующим образом и называют подпрограммами: функциями или процедурами в зависимости от способа возврата результата. 
Поддержка модульного принципа для ассемблера означает, что в языке существуют специальные машинные команды вызова подпрограммы и обратной передачи управления. 
Кроме машинных команд в языке существует набор макрокоманд и директив, упрощающий работу с процедурами.
Описание слайда:
3.1 Организация передачи управления в процедуру и обратно Процедура в ассемблере – это относительно самостоятельный фрагмент, к которому возможно обращение из разных мест программы. На языках высокого уровня такие фрагменты оформляют соответствующим образом и называют подпрограммами: функциями или процедурами в зависимости от способа возврата результата. Поддержка модульного принципа для ассемблера означает, что в языке существуют специальные машинные команды вызова подпрограммы и обратной передачи управления. Кроме машинных команд в языке существует набор макрокоманд и директив, упрощающий работу с процедурами.

Слайд 3





Команды вызова процедуры и возврата управления
1. Команда вызова процедуры:
      CALL  rel32/r32/m32         ; вызов внутрисегментной 			                                     ;	процедуры (near - ближний )  
      CALL  sreg:r32/m48          ; вызов межсегментной процедуры                                                  
                                                  ; (far - дальний )  
2. Команда возврата управления:
      RET     [<Целое>]
где <Целое> – количество байт, извлекаемых из стека при возврате управления – используется для удаления из стека параметров процедуры (см. далее).
При выполнении команды вызова процедуры автоматически в стек заносится адрес команды, следующей за командой вызова процедуры, – адрес возврата.
Команда возврата управления выбирает этот адрес из стека и осуществляет переход по нему.
Описание слайда:
Команды вызова процедуры и возврата управления 1. Команда вызова процедуры: CALL rel32/r32/m32 ; вызов внутрисегментной ; процедуры (near - ближний ) CALL sreg:r32/m48 ; вызов межсегментной процедуры ; (far - дальний ) 2. Команда возврата управления: RET [<Целое>] где <Целое> – количество байт, извлекаемых из стека при возврате управления – используется для удаления из стека параметров процедуры (см. далее). При выполнении команды вызова процедуры автоматически в стек заносится адрес команды, следующей за командой вызова процедуры, – адрес возврата. Команда возврата управления выбирает этот адрес из стека и осуществляет переход по нему.

Слайд 4





Организация передачи управления в процедуру
Описание слайда:
Организация передачи управления в процедуру

Слайд 5





Описание процедуры
В отличие от языков высокого уровня, ассемблер не требует специального оформления процедур. На любой адрес программы можно передать управление командой вызова процедуры, и оно вернется к вызвавшей процедуре, как только встретится команда возврата управления. Такая организация может привести к трудночитаемым программам, поэтому в язык Ассемблера включены директивы логического оформления процедур.
Для описания процедуры используются специальные директивы начала и завершения. В минимальной форме (при опущенных операндах) они выглядят так:
<Имя процедуры> PROC
                     <Тело процедуры>
<Имя процедуры> ENDP
Описание слайда:
Описание процедуры В отличие от языков высокого уровня, ассемблер не требует специального оформления процедур. На любой адрес программы можно передать управление командой вызова процедуры, и оно вернется к вызвавшей процедуре, как только встретится команда возврата управления. Такая организация может привести к трудночитаемым программам, поэтому в язык Ассемблера включены директивы логического оформления процедур. Для описания процедуры используются специальные директивы начала и завершения. В минимальной форме (при опущенных операндах) они выглядят так: <Имя процедуры> PROC <Тело процедуры> <Имя процедуры> ENDP

Слайд 6





Пример 3.1 Процедура MaxDword ()
         .CONST
MsgExit  DB    "Press Enter to Exit",0AH,0DH,0
         .DATA
A        DWORD  56
B        DWORD  34
         .DATA?
D        DWORD  ?
inbuf    DB    100 DUP (?)
         .CODE
Start:
         call   MaxDword ; вызов процедуры
         XOR    EAX,EAX
         Invoke StdOut,ADDR MsgExit
         Invoke StdIn,ADDR inbuf,LengthOf inbuf		
         Invoke ExitProcess,0
        
         END    Start
Описание слайда:
Пример 3.1 Процедура MaxDword () .CONST MsgExit DB "Press Enter to Exit",0AH,0DH,0 .DATA A DWORD 56 B DWORD 34 .DATA? D DWORD ? inbuf DB 100 DUP (?) .CODE Start: call MaxDword ; вызов процедуры XOR EAX,EAX Invoke StdOut,ADDR MsgExit Invoke StdIn,ADDR inbuf,LengthOf inbuf Invoke ExitProcess,0 END Start

Слайд 7





Текст процедуры 
 MaxDword PROC 
          push   EAX  ; сохранить регистр
          push   EBX  ; сохранить регистр
          lea    EBX,D; загрузить адрес результата
          mov    EAX,A; загрузить первое число в регистр
          cmp    EAX,B ; сравнить числа 
          jg     con  ; если первое больше, то на запись 
          mov    EAX,B; загрузить второе число в регистр
 con:     mov    [EBX],EAX ; записать результат 
          pop    EBX  ; восстановить регистр
          pop    EAX  ; восстановить регистр
          ret         ; вернуть управление
 MaxDword ENDP
Описание слайда:
Текст процедуры MaxDword PROC push EAX ; сохранить регистр push EBX ; сохранить регистр lea EBX,D; загрузить адрес результата mov EAX,A; загрузить первое число в регистр cmp EAX,B ; сравнить числа jg con ; если первое больше, то на запись mov EAX,B; загрузить второе число в регистр con: mov [EBX],EAX ; записать результат pop EBX ; восстановить регистр pop EAX ; восстановить регистр ret ; вернуть управление MaxDword ENDP

Слайд 8





3.2 Передача параметров в подпрограмму
Параметры могут быть переданы в подпрограмму:
через регистры – перед вызовом процедуры параметры или их адреса загружаются в регистры, также в регистрах возвращаются результаты;
напрямую – с использованием механизма глобальных переменных:
при совместной трансляции,
при раздельной трансляции;
через таблицу адресов – в программе создается таблица, содержащая адреса параметров, и адрес этой таблице передается в процедуру через регистр;
через стек – перед вызовом процедуры параметры или их адреса заносятся в стек, после завершения процедуры они из стека удаляются.
Описание слайда:
3.2 Передача параметров в подпрограмму Параметры могут быть переданы в подпрограмму: через регистры – перед вызовом процедуры параметры или их адреса загружаются в регистры, также в регистрах возвращаются результаты; напрямую – с использованием механизма глобальных переменных: при совместной трансляции, при раздельной трансляции; через таблицу адресов – в программе создается таблица, содержащая адреса параметров, и адрес этой таблице передается в процедуру через регистр; через стек – перед вызовом процедуры параметры или их адреса заносятся в стек, после завершения процедуры они из стека удаляются.

Слайд 9





3.2.1 Передача параметров в регистрах
Пример 3.2 a. Определение суммы двух целых чисел
         .DATA
A        DWORD  56
B        DWORD  34

         .DATA?
D        DWORD  ?
inbuf    DB    100 DUP (?)

         .CODE
Start:   
; Занесение параметров в регистры
         lea    EDX,D    ; адрес результата
         mov    EAX,A    ; первое число
         mov    EBX,B    ; второе число
         call   SumDword ; вызов процедуры
      
         Invoke StdOut,ADDR MsgExit
         Invoke StdIn,ADDR inbuf,LengthOf inbuf		
         Invoke ExitProcess,0
Описание слайда:
3.2.1 Передача параметров в регистрах Пример 3.2 a. Определение суммы двух целых чисел .DATA A DWORD 56 B DWORD 34 .DATA? D DWORD ? inbuf DB 100 DUP (?) .CODE Start: ; Занесение параметров в регистры lea EDX,D ; адрес результата mov EAX,A ; первое число mov EBX,B ; второе число call SumDword ; вызов процедуры Invoke StdOut,ADDR MsgExit Invoke StdIn,ADDR inbuf,LengthOf inbuf Invoke ExitProcess,0

Слайд 10





Процедура, получающая параметры в регистрах
SumDword PROC  
         add   EAX,EBX 
         mov   [EDX],EAX
         ret    
SumDword ENDP 

; завершение модуля
         End    Start
Процедуры, получающие параметры в регистрах, используется, если количество параметров невелико, и в программе на ассемблере можно найти соответствующее количество незанятых регистров.
Описание слайда:
Процедура, получающая параметры в регистрах SumDword PROC add EAX,EBX mov [EDX],EAX ret SumDword ENDP ; завершение модуля End Start Процедуры, получающие параметры в регистрах, используется, если количество параметров невелико, и в программе на ассемблере можно найти соответствующее количество незанятых регистров.

Слайд 11





3.2.2 Процедуры с глобальными переменными
(совместная трансляция)
При совместной трансляции, когда основная программа и процедура объединены в один исходный модуль, ассемблер строит общую таблицу символических имен. Следовательно, и основная программа и процедура могут обращаться к  символическим именам, объявленным в том же модуле. 
Способ не технологичен:
процедуры не универсальны;
большое количество ошибок.
Описание слайда:
3.2.2 Процедуры с глобальными переменными (совместная трансляция) При совместной трансляции, когда основная программа и процедура объединены в один исходный модуль, ассемблер строит общую таблицу символических имен. Следовательно, и основная программа и процедура могут обращаться к символическим именам, объявленным в том же модуле. Способ не технологичен: процедуры не универсальны; большое количество ошибок.

Слайд 12





Процедура, работающая с глобальными переменными при совместной трансляции
Пример 3.2 b. Определение суммы двух чисел.
         .DATA
A        DWORD  56  ; первое число
B        DWORD  34  ; второе число
         .DATA?
D        DWORD  ?   ; место для результата

         .CODE
Start:    call   SumDword 
          . . .
SumDword PROC  
         mov    EAX,A  ; поместили в регистр 1-е число 
         add    EAX,B  ; сложили со вторым
         mov    D,EAX  ; результат отправили на место
         ret    
SumDword ENDP 
         End    Start
Описание слайда:
Процедура, работающая с глобальными переменными при совместной трансляции Пример 3.2 b. Определение суммы двух чисел. .DATA A DWORD 56 ; первое число B DWORD 34 ; второе число .DATA? D DWORD ? ; место для результата .CODE Start: call SumDword . . . SumDword PROC mov EAX,A ; поместили в регистр 1-е число add EAX,B ; сложили со вторым mov D,EAX ; результат отправили на место ret SumDword ENDP End Start

Слайд 13





3.2.3 Многомодульные программы 
Объединение модулей осуществляется во время компоновки программ. Программа и процедуры, размещенные в разных исходных модулях, на этапе ассемблирования «не видят» символических имен друг друга. Чтобы сделать имена видимыми за пределами модуля, их объявляют «внешними». Для этого используют директивы PUBLIC, EXTERN или EXTERNDEF.
Описание слайда:
3.2.3 Многомодульные программы Объединение модулей осуществляется во время компоновки программ. Программа и процедуры, размещенные в разных исходных модулях, на этапе ассемблирования «не видят» символических имен друг друга. Чтобы сделать имена видимыми за пределами модуля, их объявляют «внешними». Для этого используют директивы PUBLIC, EXTERN или EXTERNDEF.

Слайд 14





Директивы описания глобальных переменных
Директива описания внутренних имен, к которым возможно обращение извне: 
     PUBLIC [<Язык>] <Имя> [, <Язык>] <Имя>...
где  <Язык> – описатель, определяющий правила формирования   
                        внутренних имен (см. далее); 
       <Имя> – символическое имя, которое должно быть доступно         
                       (видимо) в других модулях.
 
Директива описания внешних имен, к которым есть обращение в этом модуле:	
	EXTERN [<Язык>] <Имя> [(<Псевдоним>)]:<Тип>
                                             [,[<Язык>] <Имя> [(<Псевдоним>)]:<Тип>... 
где <Тип> - NEAR, FAR, BYTE, WORD, DWORD и т.д.
Универсальная директива описания имен обоих типов – может использоваться вместо PUBLIC и EXTERN:
     EXTERNDEF [<Язык>] <Имя>:<Тип>[[<Язык>] <Имя>:<Тип>]...
Описание слайда:
Директивы описания глобальных переменных Директива описания внутренних имен, к которым возможно обращение извне: PUBLIC [<Язык>] <Имя> [, <Язык>] <Имя>... где <Язык> – описатель, определяющий правила формирования внутренних имен (см. далее); <Имя> – символическое имя, которое должно быть доступно (видимо) в других модулях. Директива описания внешних имен, к которым есть обращение в этом модуле: EXTERN [<Язык>] <Имя> [(<Псевдоним>)]:<Тип> [,[<Язык>] <Имя> [(<Псевдоним>)]:<Тип>... где <Тип> - NEAR, FAR, BYTE, WORD, DWORD и т.д. Универсальная директива описания имен обоих типов – может использоваться вместо PUBLIC и EXTERN: EXTERNDEF [<Язык>] <Имя>:<Тип>[[<Язык>] <Имя>:<Тип>]...

Слайд 15





Основная программа при раздельной трансляции
Пример 3.2 c. Сложение двух чисел.
         .DATA
A        DWORD  56
B        DWORD  34

         .DATA?
D        DWORD  ?

         PUBLIC A,B,D    ; объявление внутренних имен
         EXTERN SumDword:near ; объявление внеш. имен

         .CODE
Start:   call   SumDword  ; вызов подпрограммы
         . . .
Описание слайда:
Основная программа при раздельной трансляции Пример 3.2 c. Сложение двух чисел. .DATA A DWORD 56 B DWORD 34 .DATA? D DWORD ? PUBLIC A,B,D ; объявление внутренних имен EXTERN SumDword:near ; объявление внеш. имен .CODE Start: call SumDword ; вызов подпрограммы . . .

Слайд 16





Процедура при раздельной трансляции
         .586
         .MODEL  flat, stdcall
         OPTION CASEMAP:NONE

         EXTERN A:DWORD,B:DWORD,D:DWORD

         .CODE
SumDword PROC   c
         push   EAX
         mov    EAX,A
         add    EAX,B 
         mov    D,EAX
         pop    EAX
         ret    
SumDword ENDP 
         END
Описание слайда:
Процедура при раздельной трансляции .586 .MODEL flat, stdcall OPTION CASEMAP:NONE EXTERN A:DWORD,B:DWORD,D:DWORD .CODE SumDword PROC c push EAX mov EAX,A add EAX,B mov D,EAX pop EAX ret SumDword ENDP END

Слайд 17





3.2.4 Передача параметров через таблицу адресов
Пример 3.2 d. Сумма элементов массива
         .DATA
ary      SWORD  5,6,1,7,3,4 ; массив
count    DWORD  6           ; размер массива
         .DATA?
sum      SWORD  ?           ; сумма элементов
tabl     DWORD  3 dup(?)    ; таблица адресов параметров
         EXTERN masculc:near 
         .CODE
Start:
; формирование таблицы адресов параметров
         mov    tabl,offset ary
         mov    tabl+4,offset count
         mov    tabl+8,offset sum 
         mov    EBX,offset tabl  
         call   masculc
         . . .
Описание слайда:
3.2.4 Передача параметров через таблицу адресов Пример 3.2 d. Сумма элементов массива .DATA ary SWORD 5,6,1,7,3,4 ; массив count DWORD 6 ; размер массива .DATA? sum SWORD ? ; сумма элементов tabl DWORD 3 dup(?) ; таблица адресов параметров EXTERN masculc:near .CODE Start: ; формирование таблицы адресов параметров mov tabl,offset ary mov tabl+4,offset count mov tabl+8,offset sum mov EBX,offset tabl call masculc . . .

Слайд 18





Процедура, получающая параметры через таблицу адресов
        .586
         .MODEL  flat, stdcall
         OPTION CASEMAP:NONE
         .CODE
masculc  proc   c   
         push   AX   ; сохранение регистров
         push   ECX
         push   EDI
         push   ESI
; использование таблицы адресов параметров
         mov    ESI,[EBX]  ;адрес массива
         mov    EDI,[EBX+4];адрес размера
         mov    ECX,[EDI]  ;размер массива
         mov    EDI,[EBX+8];адрес результата
Описание слайда:
Процедура, получающая параметры через таблицу адресов .586 .MODEL flat, stdcall OPTION CASEMAP:NONE .CODE masculc proc c push AX ; сохранение регистров push ECX push EDI push ESI ; использование таблицы адресов параметров mov ESI,[EBX] ;адрес массива mov EDI,[EBX+4];адрес размера mov ECX,[EDI] ;размер массива mov EDI,[EBX+8];адрес результата

Слайд 19





Процедура, получающая параметры через таблицу адресов
; суммирование элементов массива
         xor    AX,AX
cycl:    add    AX,[ESI]
         add    ESI,2
         loop   cycl
; формирование результатов
         mov    [EDI],AX
         pop    ESI   ; восстановление регистров
         pop    EDI
         pop    ECX
         pop    AX
         ret
masculc endp
         END
Описание слайда:
Процедура, получающая параметры через таблицу адресов ; суммирование элементов массива xor AX,AX cycl: add AX,[ESI] add ESI,2 loop cycl ; формирование результатов mov [EDI],AX pop ESI ; восстановление регистров pop EDI pop ECX pop AX ret masculc endp END

Слайд 20





3.2.5 Передача параметров через стек
Описание слайда:
3.2.5 Передача параметров через стек

Слайд 21





Пример 3.2 e. Максимальное из двух чисел.
         .DATA
A        DWORD  56
B        DWORD  34

         .DATA?
D        DWORD  ?

         .CODE
Start:   
         lea    EBX,D ; получение адреса результата
         push   EBX   ; загрузка в стек адреса результата
         push   B     ; загрузка в стек второго числа
         push   A     ; загрузка в стек первого числа

         call   MaxDword 
	       . . .
Описание слайда:
Пример 3.2 e. Максимальное из двух чисел. .DATA A DWORD 56 B DWORD 34 .DATA? D DWORD ? .CODE Start: lea EBX,D ; получение адреса результата push EBX ; загрузка в стек адреса результата push B ; загрузка в стек второго числа push A ; загрузка в стек первого числа call MaxDword . . .

Слайд 22





Процедура, получающая параметры через стек 
MaxDword PROC   
       push   EBP
       mov    EBP,ESP
       push   EAX
       push   EBX
       mov    EBX,[EBP+16] ;адрес D
       mov    EAX,[EBP+8];A
       cmp    EAX,[EBP+12];B
       jg     con
       mov    EAX,[EBP+12]
con:   mov    [EBX],EAX
       pop    EBX
       pop    EAX
       mov    ESP,EBP
       pop    EBP
       ret    12  
MaxDword ENDP
Описание слайда:
Процедура, получающая параметры через стек MaxDword PROC push EBP mov EBP,ESP push EAX push EBX mov EBX,[EBP+16] ;адрес D mov EAX,[EBP+8];A cmp EAX,[EBP+12];B jg con mov EAX,[EBP+12] con: mov [EBX],EAX pop EBX pop EAX mov ESP,EBP pop EBP ret 12 MaxDword ENDP

Слайд 23





3.3 Директивы описания процедур
1. Директива заголовка процедуры:
<Имя процедуры>  PROC   [<Тип вызова>] [<Конвенция о связи>] 
                                                 [<Доступность>]
                                            [USES <Список используемых регистров>] 
                                            [,<Параметр> [:<Тип>]]...
Тип вызова: 
   far – межсегментный; 
   near – внутрисегментный (используется по умолчанию).
Конвенция о связи (по умолчанию используется указанная в .MODEL): 
   STDCALL – стандартные Windows; 
   C – принятые в языке С, 
   PASCAL – принятые в языке Pascal и др. 
Доступность – видимость процедуры из других модулей: 
   public – общедоступная (используется по умолчанию); 
   private – внутренняя; 
   export – межсегментная и общедоступная.
Описание слайда:
3.3 Директивы описания процедур 1. Директива заголовка процедуры: <Имя процедуры> PROC [<Тип вызова>] [<Конвенция о связи>] [<Доступность>] [USES <Список используемых регистров>] [,<Параметр> [:<Тип>]]... Тип вызова: far – межсегментный; near – внутрисегментный (используется по умолчанию). Конвенция о связи (по умолчанию используется указанная в .MODEL): STDCALL – стандартные Windows; C – принятые в языке С, PASCAL – принятые в языке Pascal и др. Доступность – видимость процедуры из других модулей: public – общедоступная (используется по умолчанию); private – внутренняя; export – межсегментная и общедоступная.

Слайд 24





Директивы описания процедур (2)
Список используемых регистров – содержит регистры, используемые в процедуре, для их автоматического сохранения и восстановления. 
Параметр – имя параметра процедуры.
Тип – тип параметра или VARARG. Если тип не указан, то по умолчанию для 32-х разрядной адресации берется DWORD. Если указано VARARG, то вместо одного аргумента разрешается использовать список аргументов через запятую.
Пример: 
ABC   PROC NEAR STDCALL PUBLIC USES EAX,
                 X:DWORD,Y:BYTE,H:DWORD PTR
Описание слайда:
Директивы описания процедур (2) Список используемых регистров – содержит регистры, используемые в процедуре, для их автоматического сохранения и восстановления. Параметр – имя параметра процедуры. Тип – тип параметра или VARARG. Если тип не указан, то по умолчанию для 32-х разрядной адресации берется DWORD. Если указано VARARG, то вместо одного аргумента разрешается использовать список аргументов через запятую. Пример: ABC PROC NEAR STDCALL PUBLIC USES EAX, X:DWORD,Y:BYTE,H:DWORD PTR

Слайд 25





Директивы описания процедур (3)
2. Директива описания локальных переменных:
	LOCAL <Имя>[[<Количество>]][:<Тип>] 
                   [,<Имя>[[<Количество>]][:<Тип>]]...
	Описывает переменные, размещаемые в стеке, т.е. локальные. Используется только в процедурах. Помещается сразу после PROC.

Пример:
   
ABC   PROC   USES EAX,X:VARARG
      LOCAL  ARRAY[20]:BYTE
       . . .
Описание слайда:
Директивы описания процедур (3) 2. Директива описания локальных переменных: LOCAL <Имя>[[<Количество>]][:<Тип>] [,<Имя>[[<Количество>]][:<Тип>]]... Описывает переменные, размещаемые в стеке, т.е. локальные. Используется только в процедурах. Помещается сразу после PROC. Пример: ABC PROC USES EAX,X:VARARG LOCAL ARRAY[20]:BYTE . . .

Слайд 26





Директивы описания процедур (3)
3. Директива объявления прототипа:
<Имя процедуры>  PROTO   [<Тип вызова>] [<Соглашения о связи>] 
                                                   [<Доступность>]
                                                   [,<Параметр> [:<Тип>]]...
Значения параметров совпадают со значениями параметров директивы PROC. Используется для указания списка и типов параметров для директивы INVOKE.
Пример:

MaxDword PROTO  NEAR STDCALL PUBLIC
                       X:DWORD,Y:DWORD,ptrZ:PTR DWORD
или с учетом умолчаний:
MaxDword PROTO  X:DWORD,Y:DWORD,ptrZ:PTR DWORD
Описание слайда:
Директивы описания процедур (3) 3. Директива объявления прототипа: <Имя процедуры> PROTO [<Тип вызова>] [<Соглашения о связи>] [<Доступность>] [,<Параметр> [:<Тип>]]... Значения параметров совпадают со значениями параметров директивы PROC. Используется для указания списка и типов параметров для директивы INVOKE. Пример: MaxDword PROTO NEAR STDCALL PUBLIC X:DWORD,Y:DWORD,ptrZ:PTR DWORD или с учетом умолчаний: MaxDword PROTO X:DWORD,Y:DWORD,ptrZ:PTR DWORD

Слайд 27





Директивы описания процедур (4)
4.  Директива вызова процедуры:
  INVOKE <Имя процедуры или ее адрес> [, <Список аргументов>]
Аргументы должны совпадать с параметрами по порядку и типу. 
Типы аргументов директивы INVOKE:
целое значение, например:  
	27h, -128;
выражение целого типа, использующее операторы получения атрибутов полей данных:
	TYPE mas, SYZEOF mas+2, OFFSET AR, (10*20);
регистр, например:
	EAX, BH;
адрес переменной, например:
	Ada1, var2_2;
адресное выражение, например:
	4[EDI+EBX], Ada+24, ADDR AR.
Описание слайда:
Директивы описания процедур (4) 4. Директива вызова процедуры: INVOKE <Имя процедуры или ее адрес> [, <Список аргументов>] Аргументы должны совпадать с параметрами по порядку и типу. Типы аргументов директивы INVOKE: целое значение, например: 27h, -128; выражение целого типа, использующее операторы получения атрибутов полей данных: TYPE mas, SYZEOF mas+2, OFFSET AR, (10*20); регистр, например: EAX, BH; адрес переменной, например: Ada1, var2_2; адресное выражение, например: 4[EDI+EBX], Ada+24, ADDR AR.

Слайд 28





Операторы получения атрибутов полей данных 
ADDR <Имя поля данных> – возвращает ближний или дальний адрес переменной в зависимости от модели памяти – для Flat – ближний;
OFFSET <Имя поля данных> – возвращает смещение переменной относительно начала сегмента – для Flat совпадает с ADDR;
TYPE <Имя поля данных> – возвращает размер в байтах элемента описанных данных, например: 
A     BYTE 34 dup (?);   // размер = 1 
LENGTHOF <Имя поля данных> – возвращает количество элементов, заданных при определении данных, например
A     BYTE 34 dup (?);   // 34 элемента
SIZEOF <Имя поля данных> – возвращает размер поля данных в байтах;
<Тип> PTR <Имя поля данных> – изменяет тип поля данных на время выполнения команды.
Описание слайда:
Операторы получения атрибутов полей данных ADDR <Имя поля данных> – возвращает ближний или дальний адрес переменной в зависимости от модели памяти – для Flat – ближний; OFFSET <Имя поля данных> – возвращает смещение переменной относительно начала сегмента – для Flat совпадает с ADDR; TYPE <Имя поля данных> – возвращает размер в байтах элемента описанных данных, например: A BYTE 34 dup (?); // размер = 1 LENGTHOF <Имя поля данных> – возвращает количество элементов, заданных при определении данных, например A BYTE 34 dup (?); // 34 элемента SIZEOF <Имя поля данных> – возвращает размер поля данных в байтах; <Тип> PTR <Имя поля данных> – изменяет тип поля данных на время выполнения команды.

Слайд 29





Пример 3.3 Использование PROC, PROTO и INVOKE
MaxDword PROTO  X:DWORD,Y:DWORD,ptrZ:PTR DWORD
         .DATA
A        DWORD  56
B        DWORD  34
         .DATA?
D        DWORD  ?
         .CODE
Start:   INVOKE  MaxDword,A,B,ADDR D 
         . . .
MaxDword PROC   USES EAX EBX,
                X:DWORD, Y:DWORD, ptrZ:PTR DWORD
         mov    EBX,ptrZ
         mov    EAX,X
         cmp    EAX,Y
         jg     con
         mov    EAX,Y
con:     mov    [EBX],EAX
         ret    
MaxDword ENDP
Описание слайда:
Пример 3.3 Использование PROC, PROTO и INVOKE MaxDword PROTO X:DWORD,Y:DWORD,ptrZ:PTR DWORD .DATA A DWORD 56 B DWORD 34 .DATA? D DWORD ? .CODE Start: INVOKE MaxDword,A,B,ADDR D . . . MaxDword PROC USES EAX EBX, X:DWORD, Y:DWORD, ptrZ:PTR DWORD mov EBX,ptrZ mov EAX,X cmp EAX,Y jg con mov EAX,Y con: mov [EBX],EAX ret MaxDword ENDP

Слайд 30





3.4 Функции ввода-вывода консольного режима (MASM32.lib)
Библиотека MASM32.lib содержит специальные функции ввода вывода консольного режима: 
1. Процедура ввода в консольном режиме:
	StdIn PROC lpszBuffer:DWORD, ; буфер ввода
                        bLen:DWORD           ; размер буфера ввода до 128 байт
2. Процедура удаления символов конца строки при вводе:
	StripLF PROC string:DWORD       ; буфер ввода
3. Процедура вывода завершающейся нулем строки в окно консоли:
	StdOut PROC lpszText:DWORD ; буфер вывода, зав. нулем 
4. Функция позиционирования курсора:
	locate PROC x:DWORD, y:DWORD ; местоположение курсора, (0,0) – левый верхний угол
5. Процедура очистки окна консоли:
	ClearScreen PROC
Описание слайда:
3.4 Функции ввода-вывода консольного режима (MASM32.lib) Библиотека MASM32.lib содержит специальные функции ввода вывода консольного режима: 1. Процедура ввода в консольном режиме: StdIn PROC lpszBuffer:DWORD, ; буфер ввода bLen:DWORD ; размер буфера ввода до 128 байт 2. Процедура удаления символов конца строки при вводе: StripLF PROC string:DWORD ; буфер ввода 3. Процедура вывода завершающейся нулем строки в окно консоли: StdOut PROC lpszText:DWORD ; буфер вывода, зав. нулем 4. Функция позиционирования курсора: locate PROC x:DWORD, y:DWORD ; местоположение курсора, (0,0) – левый верхний угол 5. Процедура очистки окна консоли: ClearScreen PROC

Слайд 31





Пример 3.4 Программа извлечения корня квадратного 
1 = 12
1+3 = 4 = 22 
1+3+5 = 9 = 32

         .DATA
zap      DB    'Input value <65024:',13,10,0
string   DB    10 dup ('0')
otw      DB    13,10,'Root ='
rez      DB    '   ',13,10,0
Описание слайда:
Пример 3.4 Программа извлечения корня квадратного 1 = 12 1+3 = 4 = 22 1+3+5 = 9 = 32 .DATA zap DB 'Input value <65024:',13,10,0 string DB 10 dup ('0') otw DB 13,10,'Root =' rez DB ' ',13,10,0

Слайд 32





Программа извлечения корня квадратного (2)
         .CODE
Start:
;Ввод
vvod:    Invoke StdOut,ADDR zap ; вывод запроса
         Invoke StdIn,ADDR string,LengthOf string  ;ввод 
         Invoke StripLF,ADDR string ; преобразование конца
                                    ; строки в ноль
Описание слайда:
Программа извлечения корня квадратного (2) .CODE Start: ;Ввод vvod: Invoke StdOut,ADDR zap ; вывод запроса Invoke StdIn,ADDR string,LengthOf string ;ввод Invoke StripLF,ADDR string ; преобразование конца ; строки в ноль

Слайд 33





Программа извлечения корня квадратного (3)
;  Преобразование         
         mov    BH,'9'
         mov    BL,'0'
         lea    ESI,string
         cld
         xor    DI,DI
cycle:   lodsb          ; загружаем символ
         cmp    AL,0    ; если 0, то на вычисление
         je     calc
         cmp    AL,BL   ; это цифра ?
         jb     vvod
         cmp    AL,BH
         ja     vvod
         sub    AL,30h  ; получаем цифру из символа
         cbw            ; расширяем
         push   AX      ; сохраняем
         mov    AX,10   ; заносим 10
         mul    DI    ; умножаем, результат в DX:AX
         pop    DI      ; в DI - цифра
         add    AX,DI
         mov    DI,AX   ; в DI - число        
         jmp    cycle
Описание слайда:
Программа извлечения корня квадратного (3) ; Преобразование mov BH,'9' mov BL,'0' lea ESI,string cld xor DI,DI cycle: lodsb ; загружаем символ cmp AL,0 ; если 0, то на вычисление je calc cmp AL,BL ; это цифра ? jb vvod cmp AL,BH ja vvod sub AL,30h ; получаем цифру из символа cbw ; расширяем push AX ; сохраняем mov AX,10 ; заносим 10 mul DI ; умножаем, результат в DX:AX pop DI ; в DI - цифра add AX,DI mov DI,AX ; в DI - число jmp cycle

Слайд 34





Программа извлечения корня квадратного (4)
;Вычисление sqrt(dx#ax) 
calc:    mov    BX,1
         mov    CX,0
         mov    AX,1 ; сумма
cycle:   cmp    AX,DI
         ja     preobr
         add    BX,2
         add    AX,BX
         jc     vvod
         inc    CX
         jmp    cycle
Описание слайда:
Программа извлечения корня квадратного (4) ;Вычисление sqrt(dx#ax) calc: mov BX,1 mov CX,0 mov AX,1 ; сумма cycle: cmp AX,DI ja preobr add BX,2 add AX,BX jc vvod inc CX jmp cycle

Слайд 35





Программа извлечения корня квадратного (5)
; Преобразование
preobr:  mov    AX,CX
         mov    EDI,2
         mov    BX,10
again:   cwd
         div    BX
         add    DL,30h
         mov    rez[EDI],DL
         dec    EDI
         cmp    AX,0
         jne    again
         Invoke StdOut,ADDR otw
Описание слайда:
Программа извлечения корня квадратного (5) ; Преобразование preobr: mov AX,CX mov EDI,2 mov BX,10 again: cwd div BX add DL,30h mov rez[EDI],DL dec EDI cmp AX,0 jne again Invoke StdOut,ADDR otw

Слайд 36





Функции преобразования данных
1. Функция преобразования завершающейся нулем строки в число:
	atol proc lpSrc:DWORD ;  результат – в EAX 
2. Функция преобразования строки (зав. нулем) в беззнаковое число:
	ustr2dw proc pszString:DWORD ;  результат – в EAX 
3. Функция преобразования строки в число:
	atodw proc uses edi esi, String:PTR BYTE ; результат – в EAX 
4. Процедура преобразования числа в строку (16 байт): 
	ltoa proc lValue:DWORD, lpBuffer:DWORD  
5. Процедура преобразования числа в строку:
	dwtoa proc public uses esi edi, dwValue:DWORD, lpBuffer:PTR BYTE 
6. Процедура преобразования беззнакового числа в строку:
	udw2str proc dwNumber:DWORD, pszString:DWORD
Описание слайда:
Функции преобразования данных 1. Функция преобразования завершающейся нулем строки в число: atol proc lpSrc:DWORD ; результат – в EAX 2. Функция преобразования строки (зав. нулем) в беззнаковое число: ustr2dw proc pszString:DWORD ; результат – в EAX 3. Функция преобразования строки в число: atodw proc uses edi esi, String:PTR BYTE ; результат – в EAX 4. Процедура преобразования числа в строку (16 байт): ltoa proc lValue:DWORD, lpBuffer:DWORD 5. Процедура преобразования числа в строку: dwtoa proc public uses esi edi, dwValue:DWORD, lpBuffer:PTR BYTE 6. Процедура преобразования беззнакового числа в строку: udw2str proc dwNumber:DWORD, pszString:DWORD

Слайд 37





Пример 3.5 Преобразование ввода 
         .CODE
Start:
; Ввод
vvod:    Invoke StdOut,ADDR zap 
         Invoke StdIn,ADDR string,LengthOf string
         Invoke StripLF,ADDR string
; Преобразование         
         Invoke atol,ADDR string ;результат в EAX
         mov    DI,AX
Описание слайда:
Пример 3.5 Преобразование ввода .CODE Start: ; Ввод vvod: Invoke StdOut,ADDR zap Invoke StdIn,ADDR string,LengthOf string Invoke StripLF,ADDR string ; Преобразование Invoke atol,ADDR string ;результат в EAX mov DI,AX

Слайд 38





Пример 3.5 Преобразование вывода 
; Преобразование
preobr:  mov    word ptr root,CX
         Invoke dwtoa,root,ADDR rez 
; Вывод            
         Invoke StdOut,ADDR otw
         . . .

         .DATA
root     DWORD 0
otw      DB    13,10,'Root ='
rez      DB    16 dup (?)
Описание слайда:
Пример 3.5 Преобразование вывода ; Преобразование preobr: mov word ptr root,CX Invoke dwtoa,root,ADDR rez ; Вывод Invoke StdOut,ADDR otw . . . .DATA root DWORD 0 otw DB 13,10,'Root =' rez DB 16 dup (?)

Слайд 39





3.5 Создание рекурсивных процедур
Рекурсивные алгоритмы предполагают реализацию в виде процедуры, которая сама себя вызывает. 
При этом необходимо обеспечить, чтобы каждый последовательный вызов процедуры не разрушал данных, полученных в результате предыдущего вызова. Для этого, каждый вызов должен запоминать свой набор параметров, регистры и все промежуточные результаты. 
Для сохранения данных очередного вызова и передачи параметров следующей активации процедуры лучше использовать стек. А удобную организацию стека позволяет организовать структуры.
Описание слайда:
3.5 Создание рекурсивных процедур Рекурсивные алгоритмы предполагают реализацию в виде процедуры, которая сама себя вызывает. При этом необходимо обеспечить, чтобы каждый последовательный вызов процедуры не разрушал данных, полученных в результате предыдущего вызова. Для этого, каждый вызов должен запоминать свой набор параметров, регистры и все промежуточные результаты. Для сохранения данных очередного вызова и передачи параметров следующей активации процедуры лучше использовать стек. А удобную организацию стека позволяет организовать структуры.

Слайд 40





Структура
Структура представляет собой шаблон с описаниями форматов данных, который можно накладывать на различные участки памяти, чтобы затем обращаться к полям этих участков памяти с помощью имен, определенных в описании структуры.  
Формат описания структуры:
   <Имя структуры>    STRUCT
            <Описание полей>
   <Имя структуры>    ENDS
где  <Описание полей> – любой набор псевдокоманд определения переменных или вложенных структур.
Пример:
Student  struct          
      Family    db 20 dup (' ' )  ; Фамилия студента
      Name      db 15 dup(' ')    ; Имя   
      Birthdata db '  /  /  '     ; Дата  рождения
Student  ends 
Последовательность директив описывает, но не размещает в памяти структуру данных!!!
Описание слайда:
Структура Структура представляет собой шаблон с описаниями форматов данных, который можно накладывать на различные участки памяти, чтобы затем обращаться к полям этих участков памяти с помощью имен, определенных в описании структуры. Формат описания структуры: <Имя структуры> STRUCT <Описание полей> <Имя структуры> ENDS где <Описание полей> – любой набор псевдокоманд определения переменных или вложенных структур. Пример: Student struct Family db 20 dup (' ' ) ; Фамилия студента Name db 15 dup(' ') ; Имя Birthdata db ' / / ' ; Дата рождения Student ends Последовательность директив описывает, но не размещает в памяти структуру данных!!!

Слайд 41





Структура (2)
Кроме того, структуры используются, когда в программе многократно повторяются сложные коллекции данных с единым строением, но с различными значениями полей. В этом случае, для создания такой структуры в памяти достаточно использовать имя структуры как псевдокоманды по шаблону:
	<Имя переменной> <Имя структуры>
                                        <<Значение поля 1>, …,<Значение поля n>>
Примеры:
	stud1 Student <’Иванов’,’Петр’,’23/12/72’>   
	stud2 Student <’Сидоров’,’Павел’,’12/05/84’>  
Для чтения или записи в элемент структуры применяется точечная нотация: 
	<Имя структуры>. <Имя поля>.
Пример: 
	stud1.Name[EBX]
Описание слайда:
Структура (2) Кроме того, структуры используются, когда в программе многократно повторяются сложные коллекции данных с единым строением, но с различными значениями полей. В этом случае, для создания такой структуры в памяти достаточно использовать имя структуры как псевдокоманды по шаблону: <Имя переменной> <Имя структуры> <<Значение поля 1>, …,<Значение поля n>> Примеры: stud1 Student <’Иванов’,’Петр’,’23/12/72’> stud2 Student <’Сидоров’,’Павел’,’12/05/84’> Для чтения или записи в элемент структуры применяется точечная нотация: <Имя структуры>. <Имя поля>. Пример: stud1.Name[EBX]

Слайд 42





Пример Ex03_06. Вычисление факториала
                        N*(N-1)! ,  при   N0 – рекурсивное утверждение;
           N! =    
                        1             ,  при    N=0  – базисное утверждение.
Фрейм активации включает:
значение регистра EBP  – 4 байта, 
адрес возврата для случая ближнего вызова – 4 байта, 
число N на данном уровне рекурсии – 2 байта,
адрес результата – 4 байта.
Для работы с фреймом опишем структуру, перечисляя поля в том порядке, в котором они будут размещаться в стеке:
FRAME   STRUCT                                                            
   SAVE_EBP    DD   ?
   SAVE_EIP    DD   ?
   N           DW   ?
   RESULT_ADDR DD   ?
FRAME   ENDS
Описание слайда:
Пример Ex03_06. Вычисление факториала  N*(N-1)! , при N0 – рекурсивное утверждение; N! =   1 , при N=0 – базисное утверждение. Фрейм активации включает: значение регистра EBP – 4 байта, адрес возврата для случая ближнего вызова – 4 байта, число N на данном уровне рекурсии – 2 байта, адрес результата – 4 байта. Для работы с фреймом опишем структуру, перечисляя поля в том порядке, в котором они будут размещаться в стеке: FRAME STRUCT SAVE_EBP DD ? SAVE_EIP DD ? N DW ? RESULT_ADDR DD ? FRAME ENDS

Слайд 43





Факториал. Основная программа
         .DATA
n        DW     5   ;   исходное число 

         .DATA?
result   DW     ?   ;  память под результат

         .CODE
Start:  
         push   offset result ;запись адреса результата  
         push   n             ;  запись исходного числа 
         call   fact
         ...
Описание слайда:
Факториал. Основная программа .DATA n DW 5 ; исходное число .DATA? result DW ? ; память под результат .CODE Start: push offset result ;запись адреса результата push n ; запись исходного числа call fact ...

Слайд 44





Факториал. Рекурсивная процедура
fact     PROC 
         push   EBP
         mov    EBP,ESP
         push   EBX
         push   AX
; извлечение из стека адреса результата
         mov    EBX,FRAME.result_addr[EBP]
; извлечение из стека текущего N  
         mov    AX,FRAME.n[EBP]  
         cmp    AX,0
         je     done   ; выход из рекурсии
         push   EBX    ; сохранение в стеке адреса рез. 
         dec    AX     ; N=N-1
         push   AX     ; сохранение в стеке очередного N 
         call   fact   ; рекурсивный вызов
Описание слайда:
Факториал. Рекурсивная процедура fact PROC push EBP mov EBP,ESP push EBX push AX ; извлечение из стека адреса результата mov EBX,FRAME.result_addr[EBP] ; извлечение из стека текущего N mov AX,FRAME.n[EBP] cmp AX,0 je done ; выход из рекурсии push EBX ; сохранение в стеке адреса рез. dec AX ; N=N-1 push AX ; сохранение в стеке очередного N call fact ; рекурсивный вызов

Слайд 45





Факториал. Рекурсивная процедура (2)
; извлечение из стека адреса результата
         mov    EBX,FRAME.result_addr[EBP] 
; вычисление результата очередной активации 
         mov    AX,[EBX]   
         mul    FRAME.n[EBP]               
         jmp    short return
done:    mov    EAX,1   
; запоминаем результат активации                                                     
return:  mov    [EBX],AX   
         pop    AX                                                                           
         pop    EBX
         pop    EBP
         ret    6
fact     ENDP
         End    Start
Описание слайда:
Факториал. Рекурсивная процедура (2) ; извлечение из стека адреса результата mov EBX,FRAME.result_addr[EBP] ; вычисление результата очередной активации mov AX,[EBX] mul FRAME.n[EBP] jmp short return done: mov EAX,1 ; запоминаем результат активации return: mov [EBX],AX pop AX pop EBX pop EBP ret 6 fact ENDP End Start

Слайд 46





3.6 Связь разноязыковых модулей
Основные проблемы связи разноязыковых модулей:
осуществление совместной компоновки модулей;
организация передачи и возврата управления;
передача параметров:
с использованием глобальных переменных, 
с использованием стека (по значению и по ссылке),
обеспечение возврата результата функции;
обеспечение корректного использования регистров процессора.
Описание слайда:
3.6 Связь разноязыковых модулей Основные проблемы связи разноязыковых модулей: осуществление совместной компоновки модулей; организация передачи и возврата управления; передача параметров: с использованием глобальных переменных, с использованием стека (по значению и по ссылке), обеспечение возврата результата функции; обеспечение корректного использования регистров процессора.

Слайд 47





Конвенции о связях WINDOW’s
Конвенции о связи определяют правила передачи параметров.
Описание слайда:
Конвенции о связях WINDOW’s Конвенции о связи определяют правила передачи параметров.

Слайд 48





Конвенции о связях WINDOW’s (2)
тип вызова: NEAR;
модель памяти: FLAT;
пролог и эпилог – стандартные, текст зависит от конвенции и наличия локальных переменных:
пролог:
		push	EBP
		mov	EBP,ESP
	[	sub	ESP,<Размер памяти локальных переменных>]
эпилог:
		mov	ESP,EBP
		pop	EBP
		ret	[<Размер области параметров>]
Описание слайда:
Конвенции о связях WINDOW’s (2) тип вызова: NEAR; модель памяти: FLAT; пролог и эпилог – стандартные, текст зависит от конвенции и наличия локальных переменных: пролог: push EBP mov EBP,ESP [ sub ESP,<Размер памяти локальных переменных>] эпилог: mov ESP,EBP pop EBP ret [<Размер области параметров>]

Слайд 49





Конвенции о связях WINDOW’s (3)
особенности компиляции и компоновки:
можно не сохранять регистры: EAX, EDX, ECX. 
необходимо сохранять регистры: EBX, EBP, ESI, EDI.
Описание слайда:
Конвенции о связях WINDOW’s (3) особенности компиляции и компоновки: можно не сохранять регистры: EAX, EDX, ECX. необходимо сохранять регистры: EBX, EBP, ESI, EDI.

Слайд 50





3.6.1 Delphi PASCAL – MASM32
в модуле на Delphi Pascal процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние external с указанием конвенции связи, например:
procedure ADD1 (A,B:integer; Var C:integer); pascal;external;
модуль ассемблера предварительно ассемблируется и подключается с использованием директивы  обычно – в секции реализации модуля Delphi Pascal: 
	{$l <Имя объектного модуля>}
Описание слайда:
3.6.1 Delphi PASCAL – MASM32 в модуле на Delphi Pascal процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние external с указанием конвенции связи, например: procedure ADD1 (A,B:integer; Var C:integer); pascal;external; модуль ассемблера предварительно ассемблируется и подключается с использованием директивы обычно – в секции реализации модуля Delphi Pascal: {$l <Имя объектного модуля>}

Слайд 51





Delphi PASCAL – MASM32
совместимость часто используемых данных:
	Word  – 2 байта, 
	Byte, Char, Boolean – 1 байт,
	Integer, Pointer – 4 байта,
	массив – располагается в памяти по строкам,
	строка (shortstring) – содержит байт длины и далее символы;
параметры передаются через стек:
по значению – в стеке копия значения,
по ссылке – в стеке указатель на параметр;
результаты функций возвращаются через регистры:
байт,  слово – в AX,
двойное слово, указатель – в EAX,
строка – через указатель, помещенный в стек после параметров.
Описание слайда:
Delphi PASCAL – MASM32 совместимость часто используемых данных: Word – 2 байта, Byte, Char, Boolean – 1 байт, Integer, Pointer – 4 байта, массив – располагается в памяти по строкам, строка (shortstring) – содержит байт длины и далее символы; параметры передаются через стек: по значению – в стеке копия значения, по ссылке – в стеке указатель на параметр; результаты функций возвращаются через регистры: байт, слово – в AX, двойное слово, указатель – в EAX, строка – через указатель, помещенный в стек после параметров.

Слайд 52





Пример 3.7 Delphi PASCAL – MASM32
Описание в Delphi:
Implementation
 {$l  <Конвенция>.obj}  // Имя файла совпадает с конвенцией
procedure ADD1 (A,B:integer; Var C:integer); <Конвенция>;external;
Вызов процедуры: ADD1(A,B,C);

Указание
Для ассемблирования установить в настройках проекта RadASM:
3,O,$B\ML.EXE /c,2 или
добавить в Turbo Delphi инструмент (меню Tools/Configure tools/Add), назначив в качестве инструмента программу-ассемблер ml.exe:
Title:        Masm32                          - название;
Program: C:\masm32\bin\ml.exe  - путь и ассемблер;
Working Dir:                                   - пусто (текущий каталог);
Parameters: /c  /Fl  $EDNAME     - текущий файл редактора среды, 
                                                          ассемблирование и листинг
Описание слайда:
Пример 3.7 Delphi PASCAL – MASM32 Описание в Delphi: Implementation {$l <Конвенция>.obj} // Имя файла совпадает с конвенцией procedure ADD1 (A,B:integer; Var C:integer); <Конвенция>;external; Вызов процедуры: ADD1(A,B,C); Указание Для ассемблирования установить в настройках проекта RadASM: 3,O,$B\ML.EXE /c,2 или добавить в Turbo Delphi инструмент (меню Tools/Configure tools/Add), назначив в качестве инструмента программу-ассемблер ml.exe: Title: Masm32 - название; Program: C:\masm32\bin\ml.exe - путь и ассемблер; Working Dir: - пусто (текущий каталог); Parameters: /c /Fl $EDNAME - текущий файл редактора среды, ассемблирование и листинг

Слайд 53





Пример 3.7 Конвенция PASCAL
		.586
		.model  flat
		.code
		public  ADD1
ADD1	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+16]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+8]
		mov	  [EDX],EAX
		pop	  EBP
		ret	  12
ADD1 	endp
		end
Описание слайда:
Пример 3.7 Конвенция PASCAL .586 .model flat .code public ADD1 ADD1 proc push EBP mov EBP,ESP mov EAX,[EBP+16] add EAX,[EBP+12] mov EDX,[EBP+8] mov [EDX],EAX pop EBP ret 12 ADD1 endp end

Слайд 54





Пример 3.7 Конвенция cdecl
		.586
		.model  flat
		.code
		public  ADD1
ADD1	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+16]
		mov	  [EDX],EAX
		pop	  EBP
		ret	
ADD1 	endp
		end
Описание слайда:
Пример 3.7 Конвенция cdecl .586 .model flat .code public ADD1 ADD1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret ADD1 endp end

Слайд 55





Пример 3.7 Конвенция  stdcall                 (safecall = stdcall + исключение при ошибке)
		.586
		.model  flat
		.code
		public  ADD1
ADD1	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+16]
		mov	  [EDX],EAX
		pop	  EBP
		ret	  12
ADD1 	endp
		end
Описание слайда:
Пример 3.7 Конвенция stdcall (safecall = stdcall + исключение при ошибке) .586 .model flat .code public ADD1 ADD1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret 12 ADD1 endp end

Слайд 56





Пример 3.7 Конвенция register
		.586
		.model  flat
		.code
		public  ADD1
ADD1	proc
		add	  EDX,EAX
		mov	  ECX],EDX
		ret	
ADD1 	endp
		end
Описание слайда:
Пример 3.7 Конвенция register .586 .model flat .code public ADD1 ADD1 proc add EDX,EAX mov ECX],EDX ret ADD1 endp end

Слайд 57


Глава 3. Модульное программирование (ассемблер), слайд №57
Описание слайда:

Слайд 58





Окно CPU
Описание слайда:
Окно CPU

Слайд 59





Пример 3.7 Процедура без параметров
Увеличение каждого элемента массива А на 5
procedure Array_add;pascal;external;

           .586
           .MODEL flat
           .DATA
           EXTERNDEF A:SBYTE; описание внешнего имени 
           .CODE
           PUBLIC Array_add
Array_add  proc
           mov  eax,offset A   ; обращение к массиву A
           mov  ecx,5
cycl:      add  byte ptr 0[eax],5
           inc  eax
           loop cycl
           ret
Array_add  endp
           end
Описание слайда:
Пример 3.7 Процедура без параметров Увеличение каждого элемента массива А на 5 procedure Array_add;pascal;external; .586 .MODEL flat .DATA EXTERNDEF A:SBYTE; описание внешнего имени .CODE PUBLIC Array_add Array_add proc mov eax,offset A ; обращение к массиву A mov ecx,5 cycl: add byte ptr 0[eax],5 inc eax loop cycl ret Array_add endp end

Слайд 60





Пример 3.7 Pascal – Assembler - Pascal
implementation
{$L string.obj}
function Dell1(S:ShortString):
     ShortString;pascal;external;

procedure Print(n:byte);pascal;
begin
   Form1.Edit3.text:=inttostr(n);
end;
Описание слайда:
Пример 3.7 Pascal – Assembler - Pascal implementation {$L string.obj} function Dell1(S:ShortString): ShortString;pascal;external; procedure Print(n:byte);pascal; begin Form1.Edit3.text:=inttostr(n); end;

Слайд 61





Пример 3.7 Pascal – Assembler – Pascal (2)
        .586
        .MODEL flat
        .CODE
        PUBLIC Dell1
        EXTERNDEF  Print:near
Dell1   PROC
        push   EBP
        mov    EBP,ESP
        push   ESI
        push   EDI
        push   EBX
        mov    ESI,[EBP+12] ; адрес исходной строки
        mov    EDI,[EBP+8]  ; адрес строки-результата 
        xor    ECX,ECX
        mov    CL,[ESI]     ; загрузка длины строки
        inc    ESI
        inc    EDI
Описание слайда:
Пример 3.7 Pascal – Assembler – Pascal (2) .586 .MODEL flat .CODE PUBLIC Dell1 EXTERNDEF Print:near Dell1 PROC push EBP mov EBP,ESP push ESI push EDI push EBX mov ESI,[EBP+12] ; адрес исходной строки mov EDI,[EBP+8] ; адрес строки-результата xor ECX,ECX mov CL,[ESI] ; загрузка длины строки inc ESI inc EDI

Слайд 62





Пример 3.7 Pascal – Assembler – Pascal (3)
          mov      DL,0
          jcxz     prod3
          mov      BX,1
          cld
cycl1:    lodsb
          cmp      AL,' '
          je       prod1
          mov      BX,0
          inc      DL
          stosb
          jmp      prod2
prod1:    cmp      BX,1
          je       prod2
          mov      BX,1
          inc      DL
          stosb
prod2:    loop     cycl1
Описание слайда:
Пример 3.7 Pascal – Assembler – Pascal (3) mov DL,0 jcxz prod3 mov BX,1 cld cycl1: lodsb cmp AL,' ' je prod1 mov BX,0 inc DL stosb jmp prod2 prod1: cmp BX,1 je prod2 mov BX,1 inc DL stosb prod2: loop cycl1

Слайд 63





Пример 3.7 Pascal – Assembler – Pascal (4)
        cmp   DL,0
        je    prod3
        cmp   BX,1
        jne   prod3
        dec   DL
prod3:  mov   AL,DL
        mov   EDI,[EBP+8]
        stosb
        pop   EBX
        pop   EDI
        pop   ESI
        push  AX
        call  Print
        mov   ESP,EBP
        pop   EBP
        ret   8
Dell1   endp
        end
Описание слайда:
Пример 3.7 Pascal – Assembler – Pascal (4) cmp DL,0 je prod3 cmp BX,1 jne prod3 dec DL prod3: mov AL,DL mov EDI,[EBP+8] stosb pop EBX pop EDI pop ESI push AX call Print mov ESP,EBP pop EBP ret 8 Dell1 endp end

Слайд 64





Дисассемблер функции копирования строки
Function Dell(S:ShortString):ShortString; pascal;
Begin Result:=S; End;

	push  EBP	        пролог
	mov   EBP,ESP
	add	  ESP,$FFFF FF00; лок.память
	push  ESI        сохранение регистров
	push  EDI
	mov	  ESI,[EBP+$C];   адрес исходной строки
	lea	EDI,[EBP-$0000 0100] ; строка-буфер
	xor	ECX,ECX      установка счетчика
	mov	CL,[ESI]
	inc	ECX          ; учет байт длины
	rep	movsb        ; копирование строки-параметра
Описание слайда:
Дисассемблер функции копирования строки Function Dell(S:ShortString):ShortString; pascal; Begin Result:=S; End; push EBP пролог mov EBP,ESP add ESP,$FFFF FF00; лок.память push ESI сохранение регистров push EDI mov ESI,[EBP+$C]; адрес исходной строки lea EDI,[EBP-$0000 0100] ; строка-буфер xor ECX,ECX установка счетчика mov CL,[ESI] inc ECX ; учет байт длины rep movsb ; копирование строки-параметра

Слайд 65





Дисассемблер функции копирования строки (2)
	mov	  EAX,[EBP+8]
	lea   EDX,[EBP-$100]   вызов процедуры копирования
	call  @PStrCpy
	pop	  EDI              восстановление регистров
	pop	  ESI
	mov	  ESP,EBP          эпилог
	pop	  EBP
	ret	  8
Описание слайда:
Дисассемблер функции копирования строки (2) mov EAX,[EBP+8] lea EDX,[EBP-$100] вызов процедуры копирования call @PStrCpy pop EDI восстановление регистров pop ESI mov ESP,EBP эпилог pop EBP ret 8

Слайд 66





Локальные данные подпрограмм
Паскаль не позволяет создавать в подпрограммах глобальные переменные, поэтому в подпрограммах работают с локальными данными, размещаемыми в стеке. 
Пример 3.13. Организация локальных переменных без использования директив ассемблера




Подпрограмма на ассемблере:
получает строку,
копирует в локальную память,
затем копирует из лок. памяти в результат,
вызывает Паскаль для вывода длины строки.
Описание слайда:
Локальные данные подпрограмм Паскаль не позволяет создавать в подпрограммах глобальные переменные, поэтому в подпрограммах работают с локальными данными, размещаемыми в стеке. Пример 3.13. Организация локальных переменных без использования директив ассемблера Подпрограмма на ассемблере: получает строку, копирует в локальную память, затем копирует из лок. памяти в результат, вызывает Паскаль для вывода длины строки.

Слайд 67





Пример 3.13. Организация локальных переменных 
implementation
{$L Copy}
{$R *.dfm}
function CopyS(St:ShortString):ShortString;pascal;external;

procedure Print(n:integer);pascal;
begin Form1.Edit3.Text:=inttostr(n);end;

procedure TForm1.Button1Click(Sender: TObject);
Var S,St:ShortString;
begin St:=Edit1.Text;
      S:=CopyS(St);
      Edit2.Text:=S;
end;
Описание слайда:
Пример 3.13. Организация локальных переменных implementation {$L Copy} {$R *.dfm} function CopyS(St:ShortString):ShortString;pascal;external; procedure Print(n:integer);pascal; begin Form1.Edit3.Text:=inttostr(n);end; procedure TForm1.Button1Click(Sender: TObject); Var S,St:ShortString; begin St:=Edit1.Text; S:=CopyS(St); Edit2.Text:=S; end;

Слайд 68





Пример 3.13а. Без использования директив
          .586
          .MODEL  flat
A         STRUCT               ; объявляем структуру
  S       BYTE    256 DUP (?)  ; лок. переменная
A         ENDS                 ; завершение структуры
	       .CODE
	        public   CopyS
          externdef    Print:near
CopyS     proc
          push     EBP      ; сохранение EBP
          mov      EBP,ESP  ; загрузка нового EBP
          sub      ESP,260 ; место под лок. переменные
          push     ESI     ; сохранение регистров 
          push     EDI
  	        mov      ESI,[EBP+12]    ; адрес параметра 
  	        lea      EDI,A.S[EBP-256];обращение к лок.п.
          xor      EAX,EAX
  	        lodsb              ; загрузка длины строки
   	    stosb              ; сохранение длины строки
Описание слайда:
Пример 3.13а. Без использования директив .586 .MODEL flat A STRUCT ; объявляем структуру S BYTE 256 DUP (?) ; лок. переменная A ENDS ; завершение структуры .CODE public CopyS externdef Print:near CopyS proc push EBP ; сохранение EBP mov EBP,ESP ; загрузка нового EBP sub ESP,260 ; место под лок. переменные push ESI ; сохранение регистров push EDI mov ESI,[EBP+12] ; адрес параметра lea EDI,A.S[EBP-256];обращение к лок.п. xor EAX,EAX lodsb ; загрузка длины строки stosb ; сохранение длины строки

Слайд 69





Пример 3.13а. Без использования директив
  	       mov      ECX,EAX    ; загрузка счетчика
  	       cld
      rep movsb              ; копирование строки
         lea      ESI,A.S[EBP-256] ; загрузка адр.копии
  	       mov      EDI,[EBP+8]  ; загрузка адр. рез-та
   	   lodsb        ; загрузка длины строки
  	       stosb        ; сохранение длины строки
  	       mov      ECX,EAX   ; загрузка счетчика
       rep movsb            ; копирование строки
  	       pop      EDI       ; восстановление регистров
  	       pop      ESI
  	       push     EAX       ; сохранение длины строки
  	       call     Print     ; вывод длины строки
  	       mov      ESP,EBP   ; удаление лок. переменных
  	       pop      EBP       ; восстан. старого EBP
         ret      8         ; выход и удал. параметров
CopyS    endp
         end
Описание слайда:
Пример 3.13а. Без использования директив mov ECX,EAX ; загрузка счетчика cld rep movsb ; копирование строки lea ESI,A.S[EBP-256] ; загрузка адр.копии mov EDI,[EBP+8] ; загрузка адр. рез-та lodsb ; загрузка длины строки stosb ; сохранение длины строки mov ECX,EAX ; загрузка счетчика rep movsb ; копирование строки pop EDI ; восстановление регистров pop ESI push EAX ; сохранение длины строки call Print ; вывод длины строки mov ESP,EBP ; удаление лок. переменных pop EBP ; восстан. старого EBP ret 8 ; выход и удал. параметров CopyS endp end

Слайд 70





Пример 3.13б. С помощью директив
	     .CODE
	      public   CopyS
        externdef    Print:near
CopyS   PROC     NEAR PASCAL PUBLIC USES ESI EDI,  
                 Str1:PTR DWORD,Str2:PTR DWORD
        LOCAL    S[256]:byte
; Копируем строку в локальную память
  	      mov      ESI,Str1
  	      lea      EDI,S
	      xor      EAX,EAX
	      lodsb
 	      stosb
 	      mov      ECX,EAX
  	      cld
      rep movsb
Описание слайда:
Пример 3.13б. С помощью директив .CODE public CopyS externdef Print:near CopyS PROC NEAR PASCAL PUBLIC USES ESI EDI, Str1:PTR DWORD,Str2:PTR DWORD LOCAL S[256]:byte ; Копируем строку в локальную память mov ESI,Str1 lea EDI,S xor EAX,EAX lodsb stosb mov ECX,EAX cld rep movsb

Слайд 71





Пример 3.13б. С помощью директив
; Копируем строку в результат
  	        lea      ESI,S
  	        mov      EDI,Str2
   	    lodsb
  	        stosb
  	        mov      ECX,EAX
        rep movsb
; Выводим длину строки
          push     EAX
          call     Print

          ret
CopyS     endp
          end
Описание слайда:
Пример 3.13б. С помощью директив ; Копируем строку в результат lea ESI,S mov EDI,Str2 lodsb stosb mov ECX,EAX rep movsb ; Выводим длину строки push EAX call Print ret CopyS endp end

Слайд 72





3.6.2 С++ Builder – MASM32
в модуле на C++ Builder процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние extern с указанием конвенции связи, например:
	
	extern void __pascal add1(int a,int b,int *c);
	
модуль ассемблера предварительно ассемблируется и подключается с использованием директивы USEOBJ к файлу реализации проекта
	Project1.cpp:

	USEOBJ (“<Имя модуля>.obj”);
Описание слайда:
3.6.2 С++ Builder – MASM32 в модуле на C++ Builder процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние extern с указанием конвенции связи, например: extern void __pascal add1(int a,int b,int *c); модуль ассемблера предварительно ассемблируется и подключается с использованием директивы USEOBJ к файлу реализации проекта Project1.cpp: USEOBJ (“<Имя модуля>.obj”);

Слайд 73





Пример 3.8 С++ Builder – MASM32
в модуле на C++ процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние extern с указанием конвенции связи, например:
	extern void <Конвенция> add1(int a,int b,int *c);

при выполнении ассемблирования должны быть использованы опции:
для Masm32:     ml /coff /c add1.asm
для Tasm 5.0:  tasm32 /ml add1.asm
 
объектный модуль необходимо подключить к проекту Project1.cpp, используя директиву USEOBJ:
	USEOBJ (“asm1.obj”);

вызов процедуры должен осуществляться по правилам С++:
	add1(a,b,&c);
Описание слайда:
Пример 3.8 С++ Builder – MASM32 в модуле на C++ процедуры и функции, реализованные на ассемблере, должны быть объявлены и описаны как внешние extern с указанием конвенции связи, например: extern void <Конвенция> add1(int a,int b,int *c); при выполнении ассемблирования должны быть использованы опции: для Masm32: ml /coff /c add1.asm для Tasm 5.0: tasm32 /ml add1.asm объектный модуль необходимо подключить к проекту Project1.cpp, используя директиву USEOBJ: USEOBJ (“asm1.obj”); вызов процедуры должен осуществляться по правилам С++: add1(a,b,&c);

Слайд 74





Пример 3.8 Конвенция cdecl
extern void __cdecl ADD1(int a,int b,int *c);
		.586
		.model  flat
		.code
		public  @add1$qiipi
@add1$qiipi	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+16]
		mov	  [EDX],EAX
		pop	  EBP
		ret	
@add1$qiipi	endp
		end
Описание слайда:
Пример 3.8 Конвенция cdecl extern void __cdecl ADD1(int a,int b,int *c); .586 .model flat .code public @add1$qiipi @add1$qiipi proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret @add1$qiipi endp end

Слайд 75





Пример 3.8 Конвенция cdecl + «С»
extern ”C” void __cdecl ADD1(int a,int b,int *c);

		.586
		.model  flat
		.code
		public  _ADD1
_ADD1	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+16]
		mov	  [EDX],EAX
		pop	  EBP
		ret	
_ADD1	endp
		end
Описание слайда:
Пример 3.8 Конвенция cdecl + «С» extern ”C” void __cdecl ADD1(int a,int b,int *c); .586 .model flat .code public _ADD1 _ADD1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret _ADD1 endp end

Слайд 76





3.6.3 Visual С++  – MASM32
в модуле на Visual C++ подключаемые процедуры и функции должны быть объявлены как внешние extern с указанием конвенции связи, например:
		extern void __pascal add1(int a,int b,int *c);
при ассемблировании должны быть использованы опции:
для Masm32:     ml /coff /c add1.asm
для Tasm 5.0:  tasm32 /ml add1.asm 
если ассемблирование выполняется в Visual Studio, то необходимо добавить внешний инструмент Tools\External Tools…\Add:
Title:                Masm32
Command:              C:\masm32\bin\ml.exe
Arguments:            /coff /c /Fl $(ItemPath)
Initial directory:    $(ItemDir)
файл с расширением .obj необходимо подключить к проекту посредством пункта меню Project/Add existing item…
вызов процедуры должен оформляться по правилам С++, например:
              add1(a,b,&c);
Описание слайда:
3.6.3 Visual С++ – MASM32 в модуле на Visual C++ подключаемые процедуры и функции должны быть объявлены как внешние extern с указанием конвенции связи, например: extern void __pascal add1(int a,int b,int *c); при ассемблировании должны быть использованы опции: для Masm32: ml /coff /c add1.asm для Tasm 5.0: tasm32 /ml add1.asm если ассемблирование выполняется в Visual Studio, то необходимо добавить внешний инструмент Tools\External Tools…\Add: Title: Masm32 Command: C:\masm32\bin\ml.exe Arguments: /coff /c /Fl $(ItemPath) Initial directory: $(ItemDir) файл с расширением .obj необходимо подключить к проекту посредством пункта меню Project/Add existing item… вызов процедуры должен оформляться по правилам С++, например: add1(a,b,&c);

Слайд 77





Пример 3.9 Конвенция _ _cdecl
extern ”C” void _cdecl add1(int a,int b,int *c);
		.586
		.model  flat
		.code
		public  _add1
_add1	proc
		push    EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov 	  EDX,[EBP+16]
		mov	  [EDX],EAX
		pop	  EBP
		ret	  
_add1	endp
		end
Описание слайда:
Пример 3.9 Конвенция _ _cdecl extern ”C” void _cdecl add1(int a,int b,int *c); .586 .model flat .code public _add1 _add1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov EDX,[EBP+16] mov [EDX],EAX pop EBP ret _add1 endp end

Слайд 78





Пример 3.10 Объявление внешних переменных
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
extern "C" void __cdecl ADD1(int a,int b);
extern int d;
int main()
{ int a,b;
    printf("Input a and b:\n");
    scanf("%d %d",&a,&b);
    ADD1(a,b);
    printf("d=%d.",d);
    getch();
    return 0;
};
Описание слайда:
Пример 3.10 Объявление внешних переменных #include "stdafx.h" #include <stdio.h> #include <conio.h> extern "C" void __cdecl ADD1(int a,int b); extern int d; int main() { int a,b; printf("Input a and b:\n"); scanf("%d %d",&a,&b); ADD1(a,b); printf("d=%d.",d); getch(); return 0; };

Слайд 79





Объявление внешних переменных в процедуре на ассемблере
		.586
		.model  flat
      .data
      public ?d@@3HA
?d@@3HA DD     ?
		.code
		public  _ADD1
_ADD1	proc
		push  EBP
		mov	  EBP,ESP
		mov	  EAX,[EBP+8]
		add	  EAX,[EBP+12]
		mov	  ?d@@3HA,EAX
		pop	  EBP
		ret	  
_ADD1	endp
		end
Описание слайда:
Объявление внешних переменных в процедуре на ассемблере .586 .model flat .data public ?d@@3HA ?d@@3HA DD ? .code public _ADD1 _ADD1 proc push EBP mov EBP,ESP mov EAX,[EBP+8] add EAX,[EBP+12] mov ?d@@3HA,EAX pop EBP ret _ADD1 endp end

Слайд 80





Пример 3.11 Конвенция _ _stdcall
extern ”C” void __stdcall ADD1(int a,int b,int *c);
      .386                                                                                          
      .model  flat
      .code
      public ?ADD1@@YGXHHPAH@Z
?ADD1@@YGXHHPAH@Z proc 
      push EBP
      mov  EBP,ESP
      mov  ECX,[EBP+8]
      add  ECX,[EBP+12]
      mov  EAX,[EBP+16]                                         
      mov  [EAX],ECX
      pop  EBP                                                                              
      ret  12     
?ADD1@@YGXHHPAH@Z endp
      end
Описание слайда:
Пример 3.11 Конвенция _ _stdcall extern ”C” void __stdcall ADD1(int a,int b,int *c); .386 .model flat .code public ?ADD1@@YGXHHPAH@Z ?ADD1@@YGXHHPAH@Z proc push EBP mov EBP,ESP mov ECX,[EBP+8] add ECX,[EBP+12] mov EAX,[EBP+16] mov [EAX],ECX pop EBP ret 12 ?ADD1@@YGXHHPAH@Z endp end

Слайд 81





Пример 3.12 Конвенция  _ _fastcall
extern ”С” void __fastcall add1(int a,int b,int *c);
      .386                                                                                          
      .model  flat
      .code
      public  @ADD1@12
@ADD1@12 proc 
      push  EBP
      mov   EBP,ESP
      add   ECX,EDX
      mov   EDX,[EBP+8]
      mov   [EDX],ECX
      pop   EBP
      ret   4   ;  стек освобождает процедура
@ADD1@12   endp
      end
Описание слайда:
Пример 3.12 Конвенция _ _fastcall extern ”С” void __fastcall add1(int a,int b,int *c); .386 .model flat .code public @ADD1@12 @ADD1@12 proc push EBP mov EBP,ESP add ECX,EDX mov EDX,[EBP+8] mov [EDX],ECX pop EBP ret 4 ; стек освобождает процедура @ADD1@12 endp end

Слайд 82


Глава 3. Модульное программирование (ассемблер), слайд №82
Описание слайда:



Похожие презентации
Mypresentation.ru
Загрузить презентацию