Материал: Уч_пос_АрхКомп_2017

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

4. Порядок размещения сегментов.

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

.SEQ

для размещения в алфавитном порядке:

.ALPHA

размещение сегментов в порядке, принятом в MS DOS:

.DOSSEG

Эти директивы должны располагаться в самом начале программы.

Порядок размещения сегментов, соответствующий .DOSSEG:

  • ‘CODE’

  • сегменты, не относящиеся к DGROUP (FAR DATE, FAR STACK)

  • сегменты DGROUP (‘DATE’, ‘STACK’, ‘BSS’, ‘CONST’)

5. Директивы ограничения используемых команд.

По умолчанию используется набор команд процессора i8086 (при попытке исполнить какую-либо другую возникает прерывание). Директивы, определяющие набор допустимых команд:

.ix86 (где x=1,2..6) позволяет использовать команды соответствующих процессоров;

.MXX – возможность применения команд мультимедиа расширения;

.K3D – разрешены команды AMD 3D.

6. Директива END.

END [метка старта] – логический конец программы, далее транслятор текст не просматривает. Метка старта – адрес, с которого начинается выполнение программы.

П2.3. Операции и выражения в ассемблере

1. Арифметические операции.

+, -, *, /, mod (эти операции выполняются на этапе трансляции)

pi_int EQU 31416/1000 - целая часть 

pi_rem EQU 31416 mod 1000 - дробная часть 

SHR_N - сдвиговые операции (вправо и влево на N двоичных разрядов.

SHL_R

maska EQU 110010b

maska2 EQU maska SHR_2

2. Логические операции.

Эти операции подразделяются на операции отношения (EQ, NE, LT, LE, GT,GE) и на непосредственно логические (AND, OR, XOR, NOT).

Истина — 0FFFFh

Ложь — 0

mov ax, ((b LT 10) AND 5) OR ((b GE 10) AND 15)

при b=3 предыдущая команда означает: mov ax, 5.

3. Операции со счетчиком размещения программы (СРП).

LC – Location Counter

$ – текущее значение СРП, предопределенная переменная.

Message DB ‘Hello!!!’

Mes_length=$-Message

ORG – директива принудительной установки СРП на константу.

ORG 100h – для *.com

ORG $+99h – изменение СРП на 99 байт по отношению к текущему значению.

EVEN – задает четное значение СРП (выравнивает СРП на ближайшее четное, большее текущего).

4. Оператор изменения типа.

<тип> PTR переменная или метка.

B_TABLE DB 40DUP

mov ax, B_TABLE+10

mov ax, word ptd B_TABLE+10

xword EQU 0FFFCh

xor ax, ax

add al, byte ptr xword ; (AL)=FCh

CALL FAR PTR My_Sub

5. Операции выделения сегментной части адреса и смещения.

SEG – переменная (DS)

OFFSET – метка (СS)

SIZE имя переменной – определяет размер переменной в байтах.

П2.4. Использование процедур в ассемблере

Ассемблер относится как к процедурным языкам (Pascal, C, …), так и к непроцедурным. Считается удобным фрагменты текста на ассемблере оформлять в виде процедур, однако CALL far PTR [BX] обращается в произвольное место программы, имя процедуры не используется.

Явное описание процедур:

имя_процедуры PROC [тип] [язык] [uses regs]

тело процедуры

ret; retf или retn

имя_процедуры ENDP

тип: far, near (по умолчанию – near);

язык: (по умолчанию – ассемблер);

regs – сохраняются в стеке.

Схема вызова процедуры. При вызове типа NEAR обрабатывание CS не происходит (рис. П2.2)

My_Proc ENDP

Ret

- - - - - - - - - - - - Стек

My_Proc PROC IP

CS

- - - - - - - - - - - -

Call My_Proc CS IP

Рис. П.2.2

Обеспечивается вложенность процедур (ограничена стеком), могут организовываться рекурсивные вызовы. Этапы выполнения процедуры:

  • подготовка параметров для работы с процедурой (типы параметров: значения, ссылки, возвращаемые значения, именования (при макровызовах));

  • сохранение адреса возврата;

  • передача управления на начало процедуры;

  • выполнение тела процедуры, включая сохранение регистров, фиксацию результатов, фиксацию кода завершения, восстановление регистров;

  • возвращение в основную программу в место после команды вызова, может быть с очисткой стека.

Способы передачи параметров.

1. Передача параметров через РОН.

Достоинства: быстрый и удобный;

Недостатки: ограничен в размерах (не более 5).

Применение: написание операционных систем (печать строки и др.).

2. Передача через общую область памяти. (общие переменные)

Общие переменные описываются следующим образом

В вызывающей процедуре

PUBLIC список имен (имена переменных или меток).

В вызываемой процедуре:

EXTRN {имя параметра, тип}

Пример:

;головная программа

DATA Segment

EXTERN A:WORD, R:WORD

DATA ENDS

CODE Segment PUBLIC

ASSUME DS:DATA,CS:CODE

PUBLIC PUB_PROC FAR

start:

mov AX, DATA

mov DS, AX

CALL far ptr pub_proc

mov cx, ds:A

sub cx, 2

add cx, ds:R

mov ds:A, cx

ret

CODE ENDP

END start

;Модуль, задающий общие переменные и процедуру.

DATA Segment

PUBLIC A, R

A DW 10

B DW 5

C DW 3

B DW 1

DATA ENDS

CODE Segment PUBLIC

ASSUME DS:DATA,CS:CODE

Public Pub_Proc

Pub_Proc Proc Far

mov AX, B

add AX, C

mov R, AX

ret

Pub_Proc ENDP

CODE ENDS

END

3. Передача параметров через стек.

Такой метод применим не только между ассемблерными модулями, но и с разными языками. STDCALL – стандартная взаимосвязь процедур по параметрам. Основным средством доступа к параметрам является BP, для которого:

  • его значение при запуске процедуры сохраняется в стеке;

  • доступ к параметрам осуществляется с помощью базовой адресации.

Структура стека на момент начала работы с параметрами вызванной процедуры:

(Этот вариант используется в С.)

BP

 SPBP

CS:IP

 (BP)+2

Par1

 (BP)+4/6

Par2

 (BP)+6/8

………

ParN

 (BP)+(N+4)/(N+6)

Стек

Вариант для Pascal такой же, за исключением порядка параметров.

Пример:

;main

CODE Segment

EXTERN ADD3UP

Push AX

Push BX

Push CX

CALL ADD3UP

ADD SP,6

CODE ENDS

END start

;процедура обработки

ADD3UP Proc NEAR

Public ADD3UP

Push BP

mov BP, SP

mov AX, [BP+4]

add AX, [BP+6]

add AX, [BP+8]

pop BP

ret

ADD3UP ENDP

4. Передача параметров через поток кода.

Передаваемые параметры размещаются непосредственно в коде программы, сразу за вызывающей командой.

Пример:

Call Print_It

db ‘печатная строка’

;продолжение программы.

Плюсы: возможность использования любого числа параметров;

Недостатки: доступ косвенный, следовательно медленный.

5. Передача параметров результата.

Передача параметров результатов может быть реализована через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0) – вершина стека x87 (FLOAT).

П2.5. Связь ассемблера с языками высокого уровня

Существует соглашения для связи ассемблера с каждым из языков. Здесь есть свои особенности.

  1. Способ передачи управления (тип вызова). В Pascal, если ассемблеровская процедура описана в основной программе или в implementation, то она вызывается как NEAR; при описании в interface–вызов FAR.

  2. Сегментация и модели памяти. Если выбрана модель .LARGE, то стек надо описывать как .FARSTACK и он уже не будет относиться к группе DGROUP.

  3. Особенности описания общих и предопределенных переменных. В Pascal ограничений нет, но рекомендуется начинать переменные с заглавной буквы; в С-переменных необходимо начинать с символа подчеркивания «_»

  4. Управление регистрами. DS – нужно следить за ним. РОН нужно сохранять или в головной программе, или в процедуре на ассемблере.

  5. Способы передачи параметров. Как правило, параметры передаются через кадр стек, размещение параметров идет в различном порядке.

  6. Способ возвращения результата. Возвращение результатов может быть реализовано через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0) – вершина стека x87 (FLOAT).

  7. Способ восстановления стека. Pascal – в вызываемой программе, в С – вызывающей программе (для возможности оптимизации)

  8. Способы задания и вызова ассемблерного модуля:

а. Раздельная компиляция. Модули на различных языках компилируются отдельно и в вызывающем модуле указан специальный оператор описания модуля на другом языке и его загрузки в виде объекта файла.

б. Встроенная компиляция. Фрагмент или команда ассемблера указывается как встроенный оператор, и сам компилятор вызывает ассемблерный транслятор автоматически.

Связь ASSEMBLER и PASCAL.

Пример 1:

Test(i, j, k)- вычисляет f=i+j-k; i, j, kZ.

i EQU WORD PTR [bp+8]

j EQU WORD PTR [bp+6]

k EQU WORD PTR [bp+4]

.Model Small

.Code

Public Test

Test Proc

Push bp

mov bp, sp

mov ax, i

add ax, j

sub ax, k

pop bp

ret 6

Test EndP

END

Function Test(i,j,k):Word;

External;

{$L Test.obj}

*******************

F:=Test(i,j,k);

Пример 2:

Декодирование символьной строки, которая расположена в области памяти с меткой Buffer длиной Count; кодирование – сдвиг символов на 1 бит влево.

shifr.asm

Code Segment byte Bublic

Assume cs:Code

Public Coder, Decoder

Buffer EQU DWORD PTR [bp+8]

Count EQU DWORD PTR [bp+6]

Cur_Byte EQU BYTE PTR es:[di]

;FAR вызов Coder(var Buffer, count: word)

Coder Proc

Push bp

mov bp, sp

mov cx, count

jcxz final

les di, Buffer; загрузка смещения с учетом es

cld ; в стороны возрастания адресов

cycle:

moc al, Cur_Byte

rol al,1

stosb ; переписывает соответствующий символ назад в строку

loop cycle

final:

pop bp

ret 6

Coder EndP

Decoder Proc

Push bp

mov bp, sp

mov cx, count

jcxz final

les di, Buffer; загрузка смещения с учетом es

cld ; в стороны возрастания адресов

cycle:

moc al, Cur_Byte

ror al,1

stosb ; переписывает соответствующий символ назад в строку

loop cycle

final:

pop bp

ret 6

Decoder EndP

Code EndS

END

Type TMode=(Coder, Decoder);

var Mode:TMode;

*****************

{$F+}

Procedure Coder (var Buffer, count: word); External;

Procedure Decoder(var Buffer, count: word); External;

{$F-}

{$L shifr.obj}

Begin

Case Mode of

Code: begin

Coder(str1,80);

write(codfile,str1);

end;

Decode: begin

read(codfile,str1);

Decoder(str1,80);

end;

end;

End.

Пример 3: на встроенный ассемблер

Написать функцию, которая формирует слово, выбираемое по адресу 0040:006ch (BIOS счетчик таймера).

Function Get_Time:Longint;

var time:longunt;

begin

asm

push es

mov ax, 0040h

mov es, ax

mov ax, es:[006ch]

mov time, ax

pop es

end;

Get_Time:=time;

end;

Пример 4:

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

DATA Segment Word Public

EXTERN ch:Byte

DATA ENDS

CODE Segment Byte PUBLIC

ASSUME DS:DATA,CS:CODE

EXTERN Readkey: Far

AsmProc Proc Far

Push bp

mov bp, sp

pusha

Call Readkey

mov ch, al

popa

pop bp

ret 2

AsmProc EndP

CODE ENDS

END

Связь ASSEMBLER и С

Пример 1:

Test(i, j, k)- вычисляет f=i+j-k; i, j, kZ.

Вызов из С скомпилировался в

Push WORD PTR DGROUP: _k

Push WORD PTR DGROUP: _j

Push WORD PTR DGROUP: _i

call Near PTR _TEST

этот вызов порождает кадр стека

BP

IP

I

J

K

.Model Small

.Code

Public _Test

_Test Proc

Push bp

mov bp, sp

mov ax, [bp+4]

add ax, [bp+6]

pop bp

sub ax, [bp+8]

ret

_Test EndP

END

Пример 2:

Разработать ассемблерный модуль, который вычисляет

StartVal+Repeat

S= i

i=StartVal

total.asm

.Model Small

.Data

Extern _Repetitions: word

Public _StartVal DW 0

Total DW ?; локальная переменная

.Code

Public _Doloop

_Doloop Proc

mov cx, _Repetitions

mov ax, _StartVal

mov Total, ax

cycle:

inc ax

add Total, ax

Loop cycle

mov ax, Total

ret

_Doloop EndP

END

Call_Tot.c

extern “c” int Doloop(void);

extern int Repetitions,

StartVal;

main(){

Repetitions=10;

StartVal=2;

print(“%d\n”,Doloop());

}

Пример 3: на встроенный ассемблер в программе написанной на С.

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

#pragma inline

void memset(void *dest, char val, short count){

asm{

push es

push di

les di, dest

mov cx, count

mov al, val

mov Total, ax

rep stosb

pop di

pop es

}

}

int main(){

char buf[0x20];

memset(buf,0xFF, size of (Buf));

return 0

}

П2.6. Макросредства

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

Достоинства:

  • они более универсальны, так как позволяют параметрически управлять не только заданием обрабатываемых объектов, но и действиями над этими объектами;

  • их использование не связано с выполнением команд CALL и RETURN, поэтому применение макросов ускоряет выполнение программы;

  • поскольку описание макросов воспринимается как обычный текст при подстановке, то легко организуются библиотеки макросов.

Недостатки:

  • существенное увеличение длины программы, связанное с подстановкой тела макроса во все точки его вызова.

Использование макросов связано с понятиями макроопределение, макровызов, макрорасширение.

Макроопределение – описание действия, выполняющегося макросом применительно к фиксированным параметрам; состоит из заголовка, тела и концовки.

Заголовок: Nam_Macro MACRO [список фиктивных параметров]

Тело: последовательность операторов

Концевик: END [Nam_Macro]

Пример1. Макроопределение установки курсора в левый верхний угол экрана.

Home Macro

mov dh, 0

mov dl, 0

mov al, 2; функция перемещения курсора

int 10h ; обработчик управления указателя

ENDM

Пример 2.

Sr_Mov Macro R1,R2

push R1

pop R2

ENDM

Пример 3.

Add_W Macro par1, par2, sum

mov ax, par1

add ax, par2

mov sum, ax

ENDM

Макровызов представляет собой директиву ассемблера, помещаемую в текст программы и состоящую из имени макроса и списка фактических параметров, если они требуются. Если список фактических параметров меньше фиктивных, то оставшимся фиктивным параметрам присваиваются нулевые значения. Макрорасширение – это подстановка тела макроса из макроопределения на место макровызова с заменой фиктивных параметров на фактические. Например, макровызов

Источник: https://studfile.net/preview/15919868/

Смотрите также:

А27103 Василинец И. М., Колодязная В.С. Методы исследования
Анализ учета доходов и расходов организации
Вступительные испытания по профилю «Промышленный дизайн». методические указания к выполнению вступительных испытаний для абитуриентов направления 54.03.01. Семыкин В.Н., Кузовкин А.В
Выполнение внутримышечных инъекций
ЛР-8_Ф-22_10_Литвиненко_Харькова_Отчет.docx
Морфология праздника Красной горки
Обследование помещений, зданий, сооружений, участков местности и транспортных средств (Основные понятия проведения ОРМ «Обследование помещений, зданий, сооружений, участков местности и транспортных средств»)
Политика предприятия в области качества
Предприятие по сервису и ремонту автомобилей в структуре Центральной районной больницы Чурапчинского улуса в с. Чурапча
Розробка технологічної послідовності жіночого жакета із коміром 'стійкою' з прорізними кришеннями в складну рамку