Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемВиктория Окладникова
1 Ассемблер, встроенный в ЯВУ. Соглашение о связях. Паскаль-Ассемблер. Ассемблер-С. Ассемблер-С++.
2 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; 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]; end end; Function Sum4(x,y:Integer):Integer; Assembler; asm mov ax,x; add ax,y end; Beginx:=1; y:=2; writeln(Sum1(x,y)); writeln(Sum2(x,y)); writeln(Sum3(x,y)); writeln(Sum4(x,y))End. Ассемблер, встроенный в Pascal
3 Ассемблер, встроенный в C #include #include 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
4 Ограничения Не могут использоваться макро директивы. Не могут использоваться некоторые операторы ассемблера (mask, width, mod, shr и т.п.). Вставки делают программу непереносимой. Могут привести к потере эффективности из-за занятости регистров, используемых компилятором для оптимизации (si и di). В Паскале: - не могут использоваться директивы описания данных; - нельзя использовать регистры bp, sp, ss, ds.
5 Соглашение о связях Соглашение об именах. Соглашение о вызовах.
6 Соглашение об именах 1.Внешние имена: Паскаль, Фортран, Ассемблер - записываются прописными буквами С, 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
8 Соглашение об именах 2.Имена сегментов программ, написанных на ассемблере, должны быть совместимы с именами сегментов, написанных на ЯВУ. Например: Borland C++ (модель памяти small) имя сегмента кода - _TEXT; сегмента данных - _DATA Модуль на ассемблере должен использовать те же имена для обеспечения совместимости. 3.Модели памяти, используемые ассемблером и ЯВУ, должны порождать одни и те же формы операторов перехода. Для простоты следует использовать директиву в форме:.model тип_памяти,имя_языка
9 Соглашение о вызовах (Low-Level Protocol) Определяет: - содержимое каких регистров не должно изменяться в процессе выполнения программ; - в каком порядке аргументы должны быть переданы в подпрограмму; - механизм передачи аргументов; - как восстанавливается значение регистра указателя стека после вызова процедуры; - как функции возвращают вычисленные значения в вызывающую их программу. 1.По значению: копия аргумента стек 2.По близкой ссылке:смещение аргумента стек (обе программы работают с одним и тем же сегментом данных) 3.По дальней ссылке: адресная пара стек (основная программа и подпрограмма работают с различными сегментами данных)
10 Соглашения о порядке передачи параметров, принятые в ЯВУ Конвенция Паскаль:*Конвенция С:** Basic, Fortran, Ada, Oberon, Modula2 Фактические параметры передаются через стек в порядке их перечисления в операторе вызова; Освобождение стека – обязанность вызываемой процедуры; Фактические параметры передаются через стек в порядке обратном порядку их перечисления в операторе вызова; Освобождение стека – обязанность вызывающей функции; Результат вычисления функций передается через регистр ax. С++, Prolog
11 Конвенция Pascal ; Some_proc(a,b,c,d) Pusha Pushb Pushc Pushd CallSome_proc … ; Procedure Some_proc(a,b,c,d:integer); Pushbp Movbp,sp Aequ[bp+10] Bequ[bp+8] Cequ[bp+6] Dequ[bp+4] … Popbp Ret8 Some_procendp Конвенция C ; Some_proc(a,b,c,d); Pushd Pushc Pushb Pusha Call Some_proc Addsp,8 … ; Void Some_proc(int a,int b,int c,int d) Pushbp Movbp,sp Aequ[bp+4] Bequ[bp+6] Cequ[bp+8] Dequ[bp+10] … Popbp Ret Some_procendp
12 Передача неопределенного числа аргументов.model small.stack include print.h.data x1dw21 x2dw12 rezdw?.code callv macro sname,arg localsz sz=0 irpi, push i sz=sz+2 endm pushsz/2 callsname addsp,sz endm mainproc movds,ax callvSum, movrez,ax printint,rez newline callvSum, movrez,ax printint,rez.exit 0 main endp
13 Передача неопределенного числа аргументов Sumproc enter0,0 movcx,[bp+4] ; количество аргументов xorax,ax movsi,bp; адрес первого addsi,6; аргумента L:addax,ss:[si] addsi,2; вычисление суммы loopL leave ret Sumendp endmain РезультатРезультат:
14 Паскаль – ассемблер. Представление типов аргументов. По значениюПо ссылкеЧерез ST CharByteVAR всех типовDwordSingle Byte PointerDwordDouble BooleanByteLongintDwordExtended ByteStringDwordComp WordМножестваDword Word Массивы >4 байтDword IntegerWordЗаписи > 4 байтDword Real3 words ArrayКак есть до 4 байт Record
15 Паскаль – ассемблер. Типы возвращаемых значений. ТипБайтРегистрТипБайтРегистр Boolean1AlLongint4 Char1AlSingleST(0) Enum(8 бит)1AlDoubleST(0) Enum(16 бит)2AxReal6dx:bx:ax Shortint1AlExtendedST(0) Byte1AlCompST(0) Integer2AxPointer4dx:ax Word2AxString Указатель в стеке
16 Пример PROGRAM StringConversion; TYPEASCIIZString = ARRAY [0..255] OF Char; VARa:ASCIIZString; s:String; {$L STRTOASC.OBJ} PROCEDURE ASCIIZtoStr(a:ASCIIZString;VAR s:String); EXTERNAL; (* VAR len:integer; BEGIN Len:=0; While (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; (* VARlen,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 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.code ; PROCEDURE ASCIIZtoStr(a:ASCIIZString, Var s:Srting;) PUBLICASCIIZtoStr ASCIIZtoStrproc USES ds,a:dword,s:dword lesdi,s; загрузили адрес приемника pushdi; адрес s[0] в стек incdi; пропустили s[0] (под длину) ldssi,a; адрес источника cld; флаг направления 0 xorcl,cl m1: cmpcl,255; Строка уже заполнена до конца jem2 lodsb; Символ из источника oral,al jzm2; если 0 stosb; символ в приемник inccl jmpm1 m2:popdi moves:[di],cl; Длина в s[0] ret ASCIIZtoStrendp
19 ; PROCEDURE StrToASCIIZ(s:Srting; Var a:ASCIIZString) PUBLICStrToASCIIZ StrToASCIIZproc ARGs:dword,a:dword USESds lesdi,a; приемник ldssi,s; источник cld; флаг направления 0 xorcx,cx lodsb; Длина в al movcl,al jcxzm3; если пустая строка repnzmovsb m3: moves:[di],cl; запись символа с кодом 0 ret StrToASCIIZendp End Результат:Результат
20 C – ассемблер. Представление типов аргументов. Unsigned charByteUnsigned longDword CharByteLongDword EnumWordFloatDword Unsigned shortWordDoubleDword ShortWordLong doubleTbyte Unsigned intWordNear*Word IntWordFar*Dword
21 C – ассемблер. Типы возвращаемых значений. Unsigned charAxUnsigned longDx:ax CharAxLongDx:ax EnumAxFloatST(0) Unsigned shortAxDoubleST(0) ShortAxLong doubleST(0) Unsigned intAxNear*Ax IntAxFar*Dx:ax
22 Пример: ассемблер – с..model small.stack 256.data filda dw1 fildb dd1.5.code _main proc PUBLIC_main ;EXTRN_cproc:proc mov mov ds,ax push fildb push filda ;call _cproc add sp,6.exit0 _main endp end_main #include voidcproc(int x,float y) { cout
23 Пример: С – ассемблер. #include 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 PUBLICasmproc asmprocprocc 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 asmprocendp end РезультатРезультат:
24 Процедуры сортировки Метод пузырька. Быстрая сортировка. Сортировка линейным выбором.
25 Сегменты стека и данных.model small.stack data xk=640; число точек по горизонтали yk=340; число точек по вертикали color=14 ydwxk dup(?); массив значений функции xddxk-1 ymdwyk/2 vpagedb0; видеостраница vregdb0; номер видеорежима xpdw?
26 Основная программа.code mainproc movds,ax moves,ax callbgn call graf mov di,offset y mov dx,xk callpsort callgraf call bgn call graf mov bx,offset y mov dx,xk callqsort call graf call bgn call graf leasi,y mov dx,xk calllsort call graf.exit 0 mainendp
27 Метод пузырька psortprocnear ; Сортировка массива методом пузырька ; Вход:DS:DI = адрес массива слов ; DX = размер массива pusha cld cmpdx,1 jbes_exit ; сортировать нечего decdx ps_l1:movcx,dx ; длина цикла xorbx,bx ; флаг обмена movsi,di ; указатель на текущий элемент ps_l2:lodsw ; считать элемент cmpax,[si] ; сравнить предыдущий и текущий jleno_ch ; элементы xchgax,[si] ; изменит порядок следования mov[si-2],ax incbx ; установить флаг обмена no_ch:loopps_l2 orbx,bx ; продолжить, если был jnzps_l1 ; изменен порядок следования s_exit:popa ret psortendp
28 Быстрая сортировка qsortprocnear ; Процедура быстрой сортировки ; Вход:DS:BX = адрес массива ;DX = число элементов массива cmpdx,1 jbeqs_exit ; сортировать нечего xordi,di ; индекс для просмотра сверху movsi,dx ; индекс для просмотра снизу decsi shlsi,1 ; число слов в байтах movax,[bx] ; временная медиана qs_s2:cmp[bx][si],ax ; просмотр снизу jleqs_s3 ; если текущий элемент < медианы decsi ; продвигаемся вверх decsi jmpqs_s2 qs_s3:cmpsi,di ; просмотры встретились jeqs_s5 incdi ; это элемент взят за медиану incdi cmp[bx][di],ax ; просмотр сверху jlqs_s3 ; если текущий элемент < медианы
29 qs_s4:movcx,[bx][di] ; этот нижний элемент > медианы xchgcx,[bx][si] ; этот верхний элемент < медианы mov[bx][di],cx ; поменяли их местами jmpqs_s2 qs_s5:xchgax,[bx][di] ; поменять медиану и текущий элемент mov[bx],ax ; подготовка к нижней рекурсии pushdx pushdi pushbx movdx,di shrdx,1 callqsort popbx ; подготовка к верхней рекурсии popdi popdx incdi incdi addbx,di shrdi,1 subdx,di callqsort qs_exit:ret qsortendp
30 Сортировка линейным выбором ; Вход:DS:SI = адрес массива ;DX = число элементов массива ls_do:leabx,[di-2] movax,[bx] ; новое минимальное deccx ; осталось элементов jcxzls_tl ; переход если наименьший ls_l1:scasw ; очередной элемент jgls_do ; не минимальный loopls_l1 ls_tl: xchg ax,[si-2] ; перестановка минимального mov[bx],ax ; и начального элементов lsort procnear ; Точка входа movbx,si ; адрес первого = минимального lodsw ; загрузить первый movdi,si ; адрес текущего элемента decdx ; флаг тот же, что и cmp dx, movcx,dx ; количество циклов не портит флаги jgls_l1 ; пока dx > 1 ret lsortendp
31 Инициализация массива bgnproc fildx fldpi fadd fdivr fldpi fchs mov cx,xk xorbx,bx L:fldst fsin fildym fmul fildym fsub fchs fistpy[bx] addbx,2 faddst,st(1) loop L ret bgnendp
32 Рисование кривой и точки grafproc movah,0fh int10h movvreg,al movvpage,bh movah,0 moval,10h int10h movcx,xk movbx,xk-1 shlbx,1 L1:movdx,y[bx] callpoint subbx,2 loop L1 movah,8 int21h movah,0 moval,vreg int10h ret grafendp pointproc pushax pushbx movah,0ch moval,color movbh,vpage int10h popbx popax ret pointendp endmain Результат:
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.