Связь
<<  Безопасные летние каникулы для родителей Киа кворис екатеринбург фото  >>
Ассемблер, встроенный в ЯВУ
Ассемблер, встроенный в ЯВУ
Ассемблер, встроенный в Pascal
Ассемблер, встроенный в Pascal
Ассемблер, встроенный в C
Ассемблер, встроенный в C
Ограничения
Ограничения
Соглашение о связях
Соглашение о связях
Соглашение об именах
Соглашение об именах
Пример
Пример
Соглашение об именах
Соглашение об именах
Соглашение о вызовах (Low-Level Protocol)
Соглашение о вызовах (Low-Level Protocol)
Соглашения о порядке передачи параметров, принятые в ЯВУ
Соглашения о порядке передачи параметров, принятые в ЯВУ
Конвенция Pascal ; Some_proc(a,b,c,d) Push a Push b Push c Push d Call
Конвенция Pascal ; Some_proc(a,b,c,d) Push a Push b Push c Push d Call
Передача неопределенного числа аргументов
Передача неопределенного числа аргументов
Передача неопределенного числа аргументов
Передача неопределенного числа аргументов
Паскаль – ассемблер
Паскаль – ассемблер
Паскаль – ассемблер
Паскаль – ассемблер
Пример
Пример
Пример
Пример
.model small,Pascal
.model small,Pascal
; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString) PUBLIC
; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString) PUBLIC
C – ассемблер
C – ассемблер
C – ассемблер
C – ассемблер
Пример: ассемблер – с
Пример: ассемблер – с
Пример: С – ассемблер
Пример: С – ассемблер
Процедуры сортировки
Процедуры сортировки
Сегменты стека и данных
Сегменты стека и данных
Основная программа
Основная программа
Метод пузырька
Метод пузырька
Быстрая сортировка
Быстрая сортировка
Qs_s4: mov cx,[bx][di] ; этот нижний элемент > медианы xchg cx
Qs_s4: mov cx,[bx][di] ; этот нижний элемент > медианы xchg cx
Сортировка линейным выбором
Сортировка линейным выбором
Инициализация массива
Инициализация массива
Рисование кривой и точки
Рисование кривой и точки

Презентация: «Ассемблер, встроенный в ЯВУ. Соглашение о связях». Автор: KOROTIN. Файл: «Ассемблер, встроенный в ЯВУ. Соглашение о связях.ppt». Размер zip-архива: 100 КБ.

Ассемблер, встроенный в ЯВУ. Соглашение о связях

содержание презентации «Ассемблер, встроенный в ЯВУ. Соглашение о связях.ppt»
СлайдТекст
1 Ассемблер, встроенный в ЯВУ

Ассемблер, встроенный в ЯВУ

Соглашение о связях.

Паскаль-Ассемблер. Ассемблер-С. Ассемблер-С++.

2 Ассемблер, встроенный в Pascal

Ассемблер, встроенный в Pascal

Program AsmInPas; Var x,y,s:Integer; Function Sum1(x,y:Integer):Integer; begin Sum1:=x+y; end; Function Sum2(x,y:Integer):Integer; begin asm mov ax,x; add ax,y; mov @Result,ax end end; Function Sum3(var x,y:Integer):Integer; begin asm les bx,x; mov ax,es:[bx]; les bx,y add ax,es:[bx]; mov @Result,ax end end; Function Sum4(x,y:Integer):Integer; Assembler; asm mov ax,x; add ax,y end; Begin x:=1; y:=2; writeln(Sum1(x,y)); writeln(Sum2(x,y)); writeln(Sum3(x,y)); writeln(Sum4(x,y)) End.

3 Ассемблер, встроенный в C

Ассемблер, встроенный в C

#include <iostream.h> #include <string.h> char *str = "Upper And Lower Case 12345"; char cngcs(char x) { asm { mov al,x cmp al,’A’; jb ext; cmp al,’z’; ja ext cmp al,’Z’; ja met; add al,20h; jmp ext } met: asm { cmp al,’a’; jb ext; sub al,20h} ext: } void main() { char *ptr=str; cout << "Before: " << str << "\n"; while(*ptr) *ptr++=cngcs(*ptr); cout << " After: " << str << "\n"; } EXMPL

4 Ограничения

Ограничения

Не могут использоваться макро директивы. Не могут использоваться некоторые операторы ассемблера (mask, width, mod, shr и т.п.). Вставки делают программу непереносимой. Могут привести к потере эффективности из-за занятости регистров, используемых компилятором для оптимизации (si и di).

В Паскале: - не могут использоваться директивы описания данных; - нельзя использовать регистры bp, sp, ss, ds.

5 Соглашение о связях

Соглашение о связях

Соглашение об именах. Соглашение о вызовах.

6 Соглашение об именах

Соглашение об именах

Внешние имена: Паскаль, Фортран, Ассемблер - записываются прописными буквами С, C++ – дополняются лидирующим подчерком без изменения регистра С++ - имена функций дополняются символом @ и именем класса, если оно есть, а завершаются описанием аргументов, начинающимся с символов $q и включающем одну букву для квалификатора, спецификатора и имени типа: x - const, pointer*, reference&, unsigned, long, short, void, char, int, float, double.

7 Пример

Пример

class complex { double re,im; public: complex(double r=0.,double i=0.) { re=r; im=i; } operator double() { return sqrt(re*re+im*im); } complex operator+(double b){ return complex(re+b,im); } complex operator+(complex a) { return complex(re+a.re,im+a.im); } friend ostream& operator<<(ostream&,complex&); }; ostream& operator<<(ostream& s,complex& a) { s << ‘(‘ << a.re << ‘,’ <<a.im << ‘)’; return s; } void main(void) { complex a(3.,4.),b=a+5,c=a+b; cout << “c=” << c << endl; }

@complex@$od$qv proc c near ARG ts:word USES si mov si,ts fld qword ptr [si].re fmul qword ptr [si].re fld qword ptr [si].im fmul qword ptr [si].im fadd fsqrt ret @complex@$od$qv endp

@complex@$bctr$qdd

@complex@$badd$q7complex

@$blsh$qr7ostreamr7complex

8 Соглашение об именах

Соглашение об именах

Имена сегментов программ, написанных на ассемблере, должны быть совместимы с именами сегментов, написанных на ЯВУ. Например: Borland C++ (модель памяти small) имя сегмента кода - _TEXT; сегмента данных - _DATA Модуль на ассемблере должен использовать те же имена для обеспечения совместимости. Модели памяти, используемые ассемблером и ЯВУ, должны порождать одни и те же формы операторов перехода. Для простоты следует использовать директиву в форме: .model тип_памяти,имя_языка

9 Соглашение о вызовах (Low-Level Protocol)

Соглашение о вызовах (Low-Level Protocol)

Определяет: - содержимое каких регистров не должно изменяться в процессе выполнения программ; - в каком порядке аргументы должны быть переданы в подпрограмму; - механизм передачи аргументов; - как восстанавливается значение регистра указателя стека после вызова процедуры; - как функции возвращают вычисленные значения в вызывающую их программу.

По значению: копия аргумента ? стек По близкой ссылке:смещение аргумента ? стек (обе программы работают с одним и тем же сегментом данных) По дальней ссылке: адресная пара ? стек (основная программа и подпрограмма работают с различными сегментами данных)

10 Соглашения о порядке передачи параметров, принятые в ЯВУ

Соглашения о порядке передачи параметров, принятые в ЯВУ

Конвенция Паскаль:*

Конвенция С:**

Фактические параметры передаются через стек в порядке их перечисления в операторе вызова; Освобождение стека – обязанность вызываемой процедуры;

Фактические параметры передаются через стек в порядке обратном порядку их перечисления в операторе вызова; Освобождение стека – обязанность вызывающей функции;

Результат вычисления функций передается через регистр ax.

Basic, Fortran, Ada, Oberon, Modula2

С++, prolog

11 Конвенция Pascal ; Some_proc(a,b,c,d) Push a Push b Push c Push d Call

Конвенция Pascal ; Some_proc(a,b,c,d) Push a Push b Push c Push d Call

Some_proc … ; Procedure Some_proc(a,b,c,d:integer); Push bp Mov bp,sp A equ [bp+10] B equ [bp+8] C equ [bp+6] D equ [bp+4] … Pop bp Ret 8 Some_proc endp

Конвенция C ; Some_proc(a,b,c,d); Push d Push c Push b Push a Call Some_proc Add sp,8 … ; Void Some_proc(int a,int b,int c,int d) Push bp Mov bp,sp A equ [bp+4] B equ [bp+6] C equ [bp+8] D equ [bp+10] … Pop bp Ret Some_proc endp

12 Передача неопределенного числа аргументов

Передача неопределенного числа аргументов

.model small .stack 256 .286 include print.h .data x1 dw 21 x2 dw 12 rez dw ? .code callv macro sname,arg local sz sz=0 irp i,<&arg> push i sz=sz+2 endm

push sz/2 call sname add sp,sz endm main proc mov ax,@data mov ds,ax callv Sum,<1,3,5,7,9> mov rez,ax print int,rez newline callv Sum,<x1,x2> mov rez,ax print int,rez .exit 0 main endp

13 Передача неопределенного числа аргументов

Передача неопределенного числа аргументов

Sum proc enter 0,0 mov cx,[bp+4] ; количество аргументов xor ax,ax mov si,bp ; адрес первого add si,6 ; аргумента L: add ax,ss:[si] add si,2 ; вычисление суммы loop L leave ret sum endp end main

Результат:

14 Паскаль – ассемблер

Паскаль – ассемблер

Представление типов аргументов.

По значению

По значению

По ссылке

По ссылке

Через ST

Char

Byte

VAR всех типов

Dword

Single

Byte

Byte

Pointer

Dword

Double

Boolean

Byte

Longint

Dword

Extended

0..255

Byte

String

Dword

Comp

0..65535

Word

Множества

Dword

Word

Word

Массивы >4 байт

Dword

Integer

Word

Записи > 4 байт

Dword

Real

3 words

Array

Как есть до 4 байт

Как есть до 4 байт

Record

15 Паскаль – ассемблер

Паскаль – ассемблер

Типы возвращаемых значений.

Тип

Байт

Регистр

Тип

Байт

Регистр

Boolean

1

Al

Longint

4

Char

1

Al

Single

ST(0)

Enum(8 бит)

1

Al

Double

ST(0)

Enum(16 бит)

2

Ax

Real

6

dx:bx:ax

Shortint

1

Al

Extended

ST(0)

Byte

1

Al

Comp

ST(0)

Integer

2

Ax

Pointer

4

dx:ax

Word

2

Ax

String

Указатель в стеке

Указатель в стеке

16 Пример

Пример

PROGRAM StringConversion; TYPE ASCIIZString = ARRAY [0..255] OF Char; VAR a:ASCIIZString; s:String; {$L STRTOASC.OBJ} PROCEDURE ASCIIZtoStr(a:ASCIIZString;VAR s:String); EXTERNAL; (* VAR len:integer; BEGIN Len:=0; While (len<255) AND (a[len]<>Chr(0)) DO BEGIN len:=len+1; s[len]:=a[len-1]; END; s[0]:=chr(len) END; *)

17 Пример

Пример

PROCEDURE StrToASCIIZ(s:String; VAR a: ASCIIZString); EXTERNAL; (* VAR len,i:integer; BEGIN len:=length(s); FOR i:=1 TO len DO a[i-1]:=s[i]; a[len]:=Chr(0) END; *) PROCEDURE ShowASCIIZ( a:ASCIIZString); VAR i:integer; BEGIN i:=0; WHILE (i<255) AND (a[i]<>Chr(0)) DO BEGIN Write(a[i]); i:=i+1 END; Writeln; END; BEGIN s:='This is a test1'; StrToASCIIZ(s,a); ShowASCIIZ(a); s:='22'; ASCIIZtoStr(a,s); Writeln(s) END.

18 .model small,Pascal

.model small,Pascal

code ; PROCEDURE ASCIIZtoStr(a:ASCIIZString, Var s:Srting;) PUBLIC ASCIIZtoStr ASCIIZtoStr proc USES ds,a:dword,s:dword les di,s ; загрузили адрес приемника push di ; адрес s[0] в стек inc di ; пропустили s[0] (под длину) lds si,a ; адрес источника cld ; флаг направления 0 xor cl,cl m1: cmp cl,255 ; Строка уже заполнена до конца je m2 lodsb ; Символ из источника or al,al jz m2 ; если 0 stosb ; символ в приемник inc cl jmp m1 m2: pop di mov es:[di],cl ; Длина в s[0] ret ASCIIZtoStr endp

19 ; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString) PUBLIC

; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString) PUBLIC

StrToASCIIZ StrToASCIIZ proc ARG s:dword,a:dword USES ds les di,a ; приемник lds si,s ; источник cld ; флаг направления 0 xor cx,cx lodsb ; Длина в al mov cl,al jcxz m3 ; если пустая строка repnz movsb m3: mov es:[di],cl ; запись символа с кодом 0 ret StrToASCIIZ endp End Результат:

20 C – ассемблер

C – ассемблер

Представление типов аргументов.

Unsigned char

Byte

Unsigned long

Dword

Char

Byte

Long

Dword

Enum

Word

Float

Dword

Unsigned short

Word

Double

Dword

Short

Word

Long double

Tbyte

Unsigned int

Word

Near*

Word

Int

Word

Far*

Dword

21 C – ассемблер

C – ассемблер

Типы возвращаемых значений.

Unsigned char

Ax

Unsigned long

Dx:ax

Char

Ax

Long

Dx:ax

Enum

Ax

Float

ST(0)

Unsigned short

Ax

Double

ST(0)

Short

Ax

Long double

ST(0)

Unsigned int

Ax

Near*

Ax

Int

Ax

Far*

Dx:ax

22 Пример: ассемблер – с

Пример: ассемблер – с

.model small .stack 256 .data filda dw 1 fildb dd 1.5 .code _main proc PUBLIC _main EXTRN @cproc$qif:proc ;EXTRN _cproc:proc mov ax,@data mov ds,ax push fildb push filda call @cproc$qif ;call _cproc add sp,6 .exit 0 _main endp end _main

#include <iostream.h> void cproc(int x,float y) { cout << "Rez " << x << " “; cout << y << "\n"; }

23 Пример: С – ассемблер

Пример: С – ассемблер

#include <conio.h> Extern “c” asmproc(char ch, unsigned x, unsigned y, unsigned kol); Void main(void) { clrscr(); asmporc(‘a’,2,3,5); asmproc(‘c’,9,2,7); }

Результат:

.Model small,c .Stack 256 .Code public asmproc asmproc proc c near arg chr:byte,x:word,y:word,kol:word uses ax,dx,cx,dx xor bh,bh ; видеостраница mov dh,byte ptr y ; строка mov dl,byte ptr x ; столбец mov ah,2 ; позиционирование int 10h ; курсора mov ah,9 ; вывод символа mov al,chr ; символ mov bl,7 ; атрибут mov cx,kol ; мультипликатор int 10h ret asmproc endp end

24 Процедуры сортировки

Процедуры сортировки

Метод пузырька. Быстрая сортировка. Сортировка линейным выбором.

25 Сегменты стека и данных

Сегменты стека и данных

.Model small .Stack 256 .486 .Data xk=640 ; число точек по горизонтали yk=340 ; число точек по вертикали color=14 y dw xk dup(?) ; Массив значений функции x dd xk-1 ym dw yk/2 vpage db 0 ; видеостраница vreg db 0 ; номер видеорежима xp dw ?

26 Основная программа

Основная программа

mov bx,offset y mov dx,xk call qsort call graf call bgn call graf lea si,y mov dx,xk call lsort call graf .exit 0 main endp

.code main proc mov ax,@data mov ds,ax mov es,ax call bgn call graf mov di,offset y mov dx,xk call psort call graf call bgn call graf

27 Метод пузырька

Метод пузырька

psort proc near ; Сортировка массива методом пузырька ; Вход: DS:DI = адрес массива слов ; DX = размер массива pusha cld cmp dx,1 jbe s_exit ; сортировать нечего dec dx ps_l1: mov cx,dx ; длина цикла xor bx,bx ; флаг обмена mov si,di ; указатель на текущий элемент ps_l2: lodsw ; считать элемент cmp ax,[si] ; сравнить предыдущий и текущий jle no_ch ; элементы xchg ax,[si] ; изменит порядок следования mov [si-2],ax inc bx ; установить флаг обмена no_ch: loop ps_l2 or bx,bx ; продолжить, если был jnz ps_l1 ; изменен порядок следования s_exit: popa ret psort endp

28 Быстрая сортировка

Быстрая сортировка

qsort proc near ; Процедура быстрой сортировки ; Вход: DS:BX = адрес массива ; DX = число элементов массива cmp dx,1 jbe qs_exit ; сортировать нечего xor di,di ; индекс для просмотра сверху mov si,dx ; индекс для просмотра снизу dec si shl si,1 ; число слов в байтах mov ax,[bx] ; временная медиана qs_s2: cmp [bx][si],ax ; просмотр снизу jle qs_s3 ; если текущий элемент < медианы dec si ; продвигаемся вверх dec si jmp qs_s2 qs_s3: cmp si,di ; просмотры встретились je qs_s5 inc di ; это элемент взят за медиану inc di cmp [bx][di],ax ; просмотр сверху jl qs_s3 ; если текущий элемент < медианы

29 Qs_s4: mov cx,[bx][di] ; этот нижний элемент > медианы xchg cx

Qs_s4: mov cx,[bx][di] ; этот нижний элемент > медианы xchg cx

[bx][si] ; этот верхний элемент < медианы mov [bx][di],cx ; поменяли их местами jmp qs_s2 qs_s5: xchg ax,[bx][di] ; поменять медиану и текущий элемент mov [bx],ax ; подготовка к нижней рекурсии push dx push di push bx mov dx,di shr dx,1 call qsort pop bx ; подготовка к верхней рекурсии pop di pop dx inc di inc di add bx,di shr di,1 sub dx,di call qsort qs_exit: ret qsort endp

30 Сортировка линейным выбором

Сортировка линейным выбором

; Вход: DS:SI = адрес массива ; DX = число элементов массива ls_do: lea bx,[di-2] mov ax,[bx] ; новое минимальное dec cx ; осталось элементов jcxz ls_tl ; переход если наименьший ls_l1: scasw ; очередной элемент jg ls_do ; не минимальный loop ls_l1 ls_tl: xchg ax,[si-2] ; перестановка минимального mov [bx],ax ; и начального элементов lsort proc near ; Точка входа mov bx,si ; адрес первого = минимального lodsw ; загрузить первый mov di,si ; адрес текущего элемента dec dx ; флаг тот же, что и cmp dx, mov cx,dx ; количество циклов не портит флаги jg ls_l1 ; пока dx > 1 ret lsort endp

31 Инициализация массива

Инициализация массива

bgn proc fild x fldpi fldpi fadd fdivr fldpi fchs mov cx,xk xor bx,bx L: fld st fsin

fild ym fmul fild ym fsub fchs fistp y[bx] add bx,2 fadd st,st(1) loop L ret bgn endp

32 Рисование кривой и точки

Рисование кривой и точки

point proc push ax push bx mov ah,0ch mov al,color mov bh,vpage int 10h pop bx pop ax ret point endp end main Результат:

graf proc mov ah,0fh int 10h mov vreg,al mov vpage,bh mov ah,0 mov al,10h int 10h mov cx,xk mov bx,xk-1 shl bx,1 L1: mov dx,y[bx] call point sub bx,2 loop L1 mov ah,8 int 21h mov ah,0 mov al,vreg int 10h ret graf endp

«Ассемблер, встроенный в ЯВУ. Соглашение о связях»
http://900igr.net/prezentacija/informatika/assembler-vstroennyj-v-javu.-soglashenie-o-svjazjakh-61412.html
cсылка на страницу
Урок

Информатика

130 тем
Слайды
900igr.net > Презентации по информатике > Связь > Ассемблер, встроенный в ЯВУ. Соглашение о связях