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

Презентация:



Advertisements
Похожие презентации
Одномерные массивы Введение. I.Описание Массив – это фиксированное кол - во элементов одного и того же типа, объединенных одним именем, каждый элемент.
Advertisements

Определение констант для размещения их компилятором в составе инструкций языка Определение числовых констант: имя = значение PI= V_size = 5 M_size.
Организация циклов в Ассемблере. Цикл – это многократно повторяющаяся последовательность операторов.
1 Системное программное обеспечение Лекции: Ассемблер, система прерываний, основы построения компиляторов, ассемблер «под Windows» Семинары: подготовка.
Intel архитектура IA16 Основа большинства современных компьютеров.
Массивы в Паскале. Создание массива: var a:array [1..5] of integer; i:integer; begin for i:=1 to 5 do begin write ('a[',i,']='); readln(a[i]); end; end.
Дан массив. Найти максимальный и минимальный элементы массива и поменять их местами. Выполнение программы Выполнение программы.
Гречкина П.В., ПЯВУ-2, С++ Быстрое введение в язык C++ C++ Builder – консольное приложение либо Turbo C.
1 Подсистема прерываний Схема подсистемы прерываний.
Многомодульные программы Процедуры: организация вызова и возврата. Много файловые программы. Передача аргументов и возврат результатов. Обработка прерываний.
DSP Digital Signal Processing. DSP Сигнальные процессоры Обработка данныхМатематические вычисления Типичные приложенияТекстовые процессоры, Управление.
Архитектура ЭВМ Практика 3. Линейные программы на языке ассемблера.
Множества. Внутреннее представление.. Механизм внутреннего представления Каждое значение базового типа представляется одним битом. В память заносится.
PROGRAM example1; {сдвинуть циклически элементы массива вправо} const m=10; var a : ARRAY [1.. m] of INTEGER; i,k,n: INTEGER; BEGIN randomize; n:=m; WRITELN('Полученный.
Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 2 ФакультетМТС Курс3 Семестр6 Форма контролязачет Лекции14 часов Лабораторные работы12 часов.
Язык ASSEMBLER Команды пересылки данных Лекция доцента кафедры ИВТ ГрГУ кандидата технических наук Ливак Е.Н.
Возможности макрогенератора Текстовый препроцессор.
Множества Множество Это совокупность элементов одного порядкового типа (целого, символьного, перечислимого или диапазонного) set of Чердынцева.
Способы ввода значений в массив на Паскале 1) Заполнение массива с клавиатуры а) program massiv_1; const n=5; vari: integer; a: array[1..n] of integer;
Введение в программирование на языке ассемблера. Формат инструкции на языке ассемблера Директива Команда Макрокоманда МеткаОперандыКомментарий.
Транксрипт:

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

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

Ассемблер, встроенный в 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

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

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

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

Пример 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

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

Соглашение о вызовах (Low-Level Protocol) Определяет: - содержимое каких регистров не должно изменяться в процессе выполнения программ; - в каком порядке аргументы должны быть переданы в подпрограмму; - механизм передачи аргументов; - как восстанавливается значение регистра указателя стека после вызова процедуры; - как функции возвращают вычисленные значения в вызывающую их программу. 1.По значению: копия аргумента стек 2.По близкой ссылке:смещение аргумента стек (обе программы работают с одним и тем же сегментом данных) 3.По дальней ссылке: адресная пара стек (основная программа и подпрограмма работают с различными сегментами данных)

Соглашения о порядке передачи параметров, принятые в ЯВУ Конвенция Паскаль:*Конвенция С:** Basic, Fortran, Ada, Oberon, Modula2 Фактические параметры передаются через стек в порядке их перечисления в операторе вызова; Освобождение стека – обязанность вызываемой процедуры; Фактические параметры передаются через стек в порядке обратном порядку их перечисления в операторе вызова; Освобождение стека – обязанность вызывающей функции; Результат вычисления функций передается через регистр ax. С++, Prolog

Конвенция 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

Передача неопределенного числа аргументов.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

Передача неопределенного числа аргументов Sumproc enter0,0 movcx,[bp+4] ; количество аргументов xorax,ax movsi,bp; адрес первого addsi,6; аргумента L:addax,ss:[si] addsi,2; вычисление суммы loopL leave ret Sumendp endmain РезультатРезультат:

Паскаль – ассемблер. Представление типов аргументов. По значениюПо ссылкеЧерез ST CharByteVAR всех типовDwordSingle Byte PointerDwordDouble BooleanByteLongintDwordExtended ByteStringDwordComp WordМножестваDword Word Массивы >4 байтDword IntegerWordЗаписи > 4 байтDword Real3 words ArrayКак есть до 4 байт Record

Паскаль – ассемблер. Типы возвращаемых значений. ТипБайтРегистрТипБайтРегистр Boolean1AlLongint4 Char1AlSingleST(0) Enum(8 бит)1AlDoubleST(0) Enum(16 бит)2AxReal6dx:bx:ax Shortint1AlExtendedST(0) Byte1AlCompST(0) Integer2AxPointer4dx:ax Word2AxString Указатель в стеке

Пример 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; *)

Пример 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.

.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

; 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 Результат:Результат

C – ассемблер. Представление типов аргументов. Unsigned charByteUnsigned longDword CharByteLongDword EnumWordFloatDword Unsigned shortWordDoubleDword ShortWordLong doubleTbyte Unsigned intWordNear*Word IntWordFar*Dword

C – ассемблер. Типы возвращаемых значений. Unsigned charAxUnsigned longDx:ax CharAxLongDx:ax EnumAxFloatST(0) Unsigned shortAxDoubleST(0) ShortAxLong doubleST(0) Unsigned intAxNear*Ax IntAxFar*Dx:ax

Пример: ассемблер – с..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

Пример: С – ассемблер. #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 РезультатРезультат:

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

Сегменты стека и данных.model small.stack data xk=640; число точек по горизонтали yk=340; число точек по вертикали color=14 ydwxk dup(?); массив значений функции xddxk-1 ymdwyk/2 vpagedb0; видеостраница vregdb0; номер видеорежима xpdw?

Основная программа.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

Метод пузырька 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

Быстрая сортировка 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 ; если текущий элемент < медианы

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

Сортировка линейным выбором ; Вход: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

Инициализация массива 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

Рисование кривой и точки 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 Результат: