Этот программный продукт содержит все необходимое для создания программы на языке Assembler.
Пакет Emu8086 сочетает в себе продвинутый текстовый редактор, assembler, disassembler, эмулятор программного обеспечения (Виртуальную машину) с пошаговым отладчиком, примеры.
В процессе выполнения программы мы можем наблюдать программные регистры, флаги и память, АЛУ показывает работу центрального процессора.
Встроенная виртуальная машина полностью блокирует обращение программы к реальным аппаратным средствам ЭВМ, накопителям памяти, это делает процесс отладки намного более легкой
Правила оформления ассемблерных программ
При наборе программ на языке ассемблера придерживайтесь следующих правил:
* директивы набирайте большими буквами, инструкции — малыми;
* пишите текст широко — не скупердяйничайте;
* не выходите за край экрана, т.е. не делайте текст шире 80 знаков — его не удобно будет редактировать и печатать;
* для отступов пользуйтесь табуляцией (клавиша TAB);
Стоит ли учить ассемблер новичку. #SimpleCode
* блоки комментариев задавайте с одинаковым отступом. Оптимальной считается такая строка:
Количество табуляций перед комментарием определяется длиной аргументов команды и может быть от 1 до 3. По мере знакомства с синтаксисом языка будут приводиться дополнительные правила.
Задание для выполнения:
1. Запустить эмулятор EMU8086.
2. Пользуясь правилами оформления ассемблерных программ, исправьте слова «Please Register.» на любые понравившиеся (Не забудьте заключить их в апострофы).
3. Запустите приложение, нажав кнопку ‘Emulate’ или клавишу F5.
4. Запустите полученный код на выполнение, используя кнопку “RUN” или нажмите функциональную клавишу F9.
5. Откомпилируйте программу. Вернитесь в главное окно формы, предварительно закрыв все открытые окна, далее нажмите кнопку “Compile”.
6. Полученный com-файл запустите во встроенной командной строке WINDOWS 98 на выполнение или запустите сеанс dos в total commander’e.
7 Поэкспериментируйте с другими примерами которые открываются при нажатие клавиши “Samples” в главном окне эмулятора.
8 Ознакомитесь со встроенной в эмулятор EMU8086 справкой. В ней содержится вся необходимая информация для работы с программой, азы написания программ на языке assembler и др.
Порядок выполнения:
1. Изучить теоретический материал.
Контрольные вопросы:
1. Каковы основные отличия ассемблерных программ от ЯВУ?
2. Какова структура ассемблерной программы?
3. В чем отличие инструкции от директивы?
4. Каковы правила оформления программ на языке ассемблера?
5. Каковы этапы получения выполняемого файла?
6. Для чего нужен этап отладки программы?
7. Опишите основные моменты создания исполняемого файла и эмуляции работы программы?
8. Каковы шаги технического создания ассемблерной программы в программах TASM и MASM?
9 Основные возможности эмулятора EMU8086?
10 Методы борьбы с зависанием в DOS’e?
#1 Трансляторы: компилятор, интерпретатор, ассемблер | A-LEVEL НИШ Информатика
Рекомендуемая литература: 1,3.
Источник: studfile.net
Связь ассемблера с ЯВУ
На языке высокого уровня (Pascal или С) генерируется массив псевдослучайных целых чисел, изменяющихся в заданном диапазоне и имеющих равномерное или гауссовское (ограниченное интервалом [Mx-3*S,Mx+3*S]) распределение. Необходимые датчики псевдослучайных чисел находятся в каталоге RAND_GEN (пpи его отсутствии получить у пpеподавателя).
Далее должен вызываться ассемблерный модуль(модули) для формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы. В общем случае интервалы разбиения диапазона изменения псевдослучайных чисел могут иметь различную длину.
Результирующий массив частотного распределения чисел по интервалам, сформированный на ассемблерном уровне, возвращается в программу, реализованную на ЯВУ, и затем сохраняется в файле и выводится на экран средствами ЯВУ.
1. Длина массива псевдослучайных целыхчисел — NumRanDat (
2. Диапазон изменения массива псевдослучайных целых чисел
3. Количество интервалов, на которые разбивается диапазон
изменения массива псевдослучайных целых чисел — NInt (
4. Массив левых границ интервалов разбиения LGrInt
(должны принадлежать интервалу [Xmin,Xmax])
1. Текстовый файл, строка которого содержит:
— левую границу интервала,
— количество псевдослучайных чисел, попавших в интервал.
Количество строк равно числу интервалов разбиения.
2. График, отражающий распределение чисел по интервалам.
Для бригад с нечетным номером: подпрограмма формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы реализуется в виде одного асемблерного модуля, сразу получающего требуемое распределение и возвращающего его в головную программу, написанную на ЯВУ.
2) Общие сведения:
Связь ассемблера с ЯВУ.
Существует соглашения для связи ассемблера с каждым из языков. Здесь есть свои особенности.
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. Способы задания и вызова ассемблерного модуля:
а) Раздельная компиляция. Модули на различных языках компилируются отдельно и в вызывающем модуле указан специальный оператор описания модуля на другом языке и его загрузки в виде объекта файла.
б) Встроенная компиляция. Фрагмент или команда ассемблера указывается как встроенный оператор, и сам компилятор вызывает ассемблерный транслятор автоматически.
В данной программе используется встроенная компиляция.
3) Текст программы:
LengthMass, RangeMin, RangeMax, IntervalCount: Word;
LeftBorders, RandomMass, Res: array[1..255] of byte;
writeln(‘ Лабораторная работа №6’);
writeln(‘ Феми-Оке Антони гр.1303 вар №11’);
write(‘Длина массива псевдослучайных чисел: ‘);
writeln(‘Массив левых границ(‘,IntervalCount,’):’);
for i:=1 to IntervalCount do
writeln(‘Массив псевдослучайных целых чисел:’);
for i:=1 to LengthMass do
Источник: studopedya.ru
Использование Ассемблера в ЯВУ. Соглашение о регистрах. Лекция 11 1
Соглашение о регистрах
Регистры, используемые в С++:
SS – сегмент стека
DS – сегмент данных
BP – для указания на список параметров, передаваемых через
стек
SP – указатель стека (после завершения подпрограммы стек
должен быть восстановлен до своего первоначального
состояния на момент вызова подпрограммы)
2. Использование Ассемблера в ЯВУ
Формы комбинирования программ на
языках высокого уровня с ассемблером:
•Использование ассемблерных вставок
•Использование внешних процедур и функций.
3. Использование Ассемблера в ЯВУ
Использование ассемблерных вставок
_asm КодОперации операнды ; // комментарии
_asm
текст программы на ассемблере ; комментарии
>
4. Использование Ассемблера в ЯВУ
Использование ассемблерных вставок
(пример)
Пример Даны целые числа а и b.
Вычислить выражение a+5b.
Для вывода
приглашений Введите
a: и Введите b: используем
функцию CharToOem(_T(«Введите
«),s),
где s – указатель на строку,
которая перекодирует
русскоязычные сообщения.
#include
#include
#include
void main()
char s[20];
int a, b, sum;
CharToOem(_T(«Введите «),s);
printf(«%s a: «, s);
scanf(«%d»,
printf(«%s b: «,s);
scanf(«%d»,
_asm
mov eax, a;
mov ecx, 5
m: add eax, b
loop m
mov sum, eax
>
printf(«n %d + 5*%d = %d», a, b, sum);
getchar(); getchar();
>
5. Использование Ассемблера в ЯВУ
Использование внешних процедур
Для связи посредством внешних процедур создается
многофайловая программа. При этом в общем случае
возможны два варианта вызова:
•программа на языке высокого уровня вызывает процедуру на
языке ассемблера;
•программа на языке ассемблера вызывает процедуру на
языке высокого уровня.
6. Использование Ассемблера в ЯВУ
Использование внешних процедур
Основные соглашения по передаче параметров в процедуру
Соглашение
Параметры
Очистка стека
Регистры
Pascal (конвенция
языка Паскаль)
Слева направо
Процедура
Нет
C (конвенция С)
Справа налево
Вызывающая
программа
Нет
Fastcall (быстрый
или регистровый
вызов)
Слева направо
Процедура
Задействованы три
регистра
(EAX,EDX,ECX),
далее стек
Stdcall
(стандартный
вызов)
Справа налево
Процедура
Нет
7. Использование Ассемблера в ЯВУ
Конвенция Pascal заключается в том, что параметры из программы на
языке высокого уровня передаются в стеке и возвращаются в регистре
АХ/ЕАХ, — это способ, принятый в языке PASCAL (а также в BASIC,
FORTRAN, ADA, OBERON, MODULA2), — просто поместить
параметры в стек в естественном порядке.
В этом случае запись
some_proc(a,b,c,d);
запишется как
push a
push b
push с
push d
call [email protected]
some_proc proc
push ebp
mov ebp,esp ; пролог
mov eax, [ebp+20] ; a
mov ebx, [ebp+16] ; b
mov ecx, [ebp+12] ; c
mov edx, [ebp+8] ; d
.
pop ebp ; эпилог
ret 16
some_proc endp
8. Использование Ассемблера в ЯВУ
Конвенция С используется, в первую очередь, в языках С и C++, а также в
PROLOG и других. Параметры помещаются в стек в обратном
порядке, и, в противоположность PASCAL-конвенции, удаление
параметров из стека выполняет вызывающая процедура.
Запись
some_proc(a,b,c,d)
будет выглядеть как
push d
push с
push b
push a
call [email protected]
add esp,16 ; освободить стек
some_proc proc
push ebp
mov ebp,esp ; пролог
mov eax, [ebp+8] ; a
mov ebx, [ebp+12] ; b
mov ecx, [ebp+16] ; c
mov edx, [ebp+20] ; d
.
pop ebp
ret
some_proc endp
9. Использование Ассемблера в ЯВУ
Смешанные конвенции
Существует конвенция передачи параметров STDCALL, отличающаяся и от
C, и от PASCAL-конвенций, которая применяется для всех системных
функций Win32 API. Здесь параметры помещаются в стек в обратном
порядке, как в С, но процедуры должны очищать стек сами, как в
PASCAL.
Еще одно отличие от С-конвенции – это быстрое или регистровое
соглашение FASTCALL. В этом случае параметры в функции также
передаются по возможности через регистры.
some_proc(a,b,с,d,e,f);
mov
mov
mov
mov
mov
mov
a,
b,
c,
d,
e,
f,
eax
edx
ecx
[ebp+8]
[ebp+12]
[ebp+16]
10. Использование Ассемблера в ЯВУ
Возврат результата из процедуры
Чтобы возвратить результат в программу на С из процедуры
на ассемблере, перед возвратом управления в вызываемой
процедуре (на языке ассемблера) необходимо поместить
результат в соответствующий регистр:
Тип возвращаемого значения
Регистр
unsigned char
al
char
al
unsigned short
ax
short
ax
unsigned int
eax
int
eax
unsigned long int
edx:eax
long int
edx:eax
11. Использование Ассемблера в ЯВУ
Тонкости вызова методов между С++ и Asm
1. Если надо вызывать из ассемблера библиотечные методы,
достаточно в начале секции кода указать, какие именно
методы мы собираемся использовать.
EXTRN
printf : proc ;we’ll use printf
Далее можно просто использовать call:
;printf(ebx,eax)
push eax;
push ebx
call printf
add esp, 8 ;pop x2
12. Использование Ассемблера в ЯВУ
Тонкости вызова методов между С++ и Asm
2. Если же надо вызывать пользовательские методы, то кроме п.1
надо еще писать extern «C» перед определением метода.
extern «C»
void* readName()
char* name = (char*)calloc(1, 255);
scanf(«%s», name);
while (getchar() != ‘n’);
return name;
>
Соответственно, в *.asm файле:
EXTRN readName : proc ;and void* readName()
и
call readName ;eax = readName()
13. Использование Ассемблера в ЯВУ
Тонкости вызова методов между С++ и Asm
3. случае использования
Asm-методов
в
C++
достаточно лишь указать
прототип:
extern «C»
void sayHello();
>
Данный прототип соответствует такому
объявлению Asm-метода:
sayHello PROC
call readName ;eax = readName()
lea ebx, helloFormat ;ebx = printf(ebx,eax)
push eax
push ebx
call printf
add esp, 8 ;pop x2
retn
sayHello ENDP
14. Использование Ассемблера в ЯВУ
Пример: Умножить на 2 первый элемент массива (нумерация элементов
ведется с 0).
//Вызывающая программа file1.cpp
#include
using namespace std;
extern «C» int MAS_FUNC (int *, int);
int main() int *mas, n, k;
system(«chcp 1251»);
system(«cls»);
cout cin >> n;
mas = new int[n];
cout for(int i=0; i > mas[i];
>
k = MAS_FUNC(mas, n);
cout cin.get(); cin.get();
return 0;
>
;Вызываемая функция file2.asm
.586
.MODEL FLAT, C
.CODE
MAS_FUNC PROC C mas:dword, n:dword
mov esi,mas
mov eax, [esi+4]
shl eax, 1
ret
MAS_FUNC ENDP
END
Источник: ppt-online.org