90 likes | 342 Views
Способы передачи параметров. 1) путем прямого обращения к памяти: а) при совместной трансляции, б) при раздельной трансляции; 2) через регистры; 3) через таблицу адресов; 4) передача параметров через стек. Передача параметров через стек. Пространство имен 1. Пространство имен 2.
E N D
Способы передачи параметров 1) путем прямого обращения к памяти: а) при совместной трансляции, б) при раздельной трансляции; 2) через регистры; 3) через таблицу адресов; 4) передача параметров через стек
Передача параметров через стек Пространство имен 1 Пространство имен 2 Основная программа Процедура <Имя>PROC RET <Имя>ENDP CALL <Имя> A B C BP=SP BP Aд.возв +4 @C +6 B +8 A
Code segment assume CS:Code,DS:Code extrn Addd:Near A dw 34 B dw 25 D dw ? main proc far mov AX,Code mov DS,AX push word ptr A push word ptr B lea BX,D push BX call Addd mov AH,4ch int 21h main endp Code ends end main Code segment assume CS:Code,DS:Code public Addd Addd proc near push BP mov BP,SP mov AX,[BP+6] add AX,[BP+8] mov BX,[BP+4] mov 0[BX],AX ret Addd endp Code ends end Передача параметров через стек (2)(Ex6_3)
Связь разноязыковых модулей 1. Передача управления 2. Передача данных 3. Совместимость данных
Pascal – Assembler 1. Передача управления а) тип вызова: 1) описание – в секции реализации программы – near: 2) описание – в интерфейсной части модуля – far б) стандартный вход: push BP mov BP,SP sub SP,<память локальных переменных> <сохранение регистров: SP, SS, DS> в) стандартный выход: mov SP,BP pop BP ret <размер области параметров> г) управление компоновкой: В Pascal: В Assembler: процедуры и функции – external Сегмент кодов – Code Сегмент данных – Data Имена – public, extrn
Pascal – Assembler (2) 2. Совместимость данных: Word, Integer – 2 байта, Byte, Char, Boolean – 1 байт, Pointer – 4 байта массив – располагается в памяти по строкам; строка – байт длины + строка 3. Параметры передаются через стек: а) по значению – в стеке копия значения; б) по ссылке – в стеке указатель на параметр (4 байта) 4. Результаты функций передаются через регистры: байт, слово – в AX; двойное слово, указатель – в DX:AX; строка – через указатель, помещенный в стек перед параметрами
Pascal – Assembler (Ex6_4) Program pa1; {$l Ex6_4a.obj} Var a,b,c:integer; Function fun_near(x,y:integer):integer;external; Procedure proc_near(x:integer;var z:integer);external; Begin Writeln('Введите числа:'); Readln(a,b); proc_near(a,c); Writeln(′Функция - ',fun_near(a,b), ' процедура - ',c); end. Стек функции Стек процедуры BP=SP BP=SP BP BP Aд.возв Aд.возв +4 +4 y @z +6 x +8 x
Pascal – Assembler (Ex6_4)(2) data segment byte public extrn b:word data ends code segment byte public assume CS:code,DS:data public fun_near,proc_near ; функция fun_near proc near push BP mov BP,SP mov AX,word ptr[BP+6] add AX,word ptr[BP+4]; результат в AX mov SP,BP pop BP ret 4 fun_near endp BP=SP BP Aд.возв +4 y +6 x
Pascal – Assembler (Ex6_4)(3) BP=SP BP Aд.возв ; процедура proc_near proc near push BP mov BP,SP mov AX,word ptr[BP+8] add AX,b ; загрузка адреса результата les DI,dword ptr[BP+4] ; запись результата mov ES:[DI],AX mov SP,BP pop BP ret 6 proc_near endp code ends end +4 @z +8 x