Большинство этих команд не различают знаковые и без знаковые данные. Принимать самый старший бит числа за знак или как за информацию решает программист.
КОМАНДЫ ПЕРЕСЫЛКИ И ОБМЕНА ИНФОРМАЦИЕЙ
MOV-> MOVE OPERAND FROM\TO SYSTEM REGISTER
Команда содержит 2 операнда и синтаксис ее следующий:
MOV Destination,Source
Информация из источника пересылается (копируется) в приемник.
Только кратно байту.
Возможные сочетания:
DESTINATION | SOURCE | ПРИМЕР |
Регистр R8 R16 | Регистр R8 R16 | MOV AL(младший байт регистра AX),DH (старший DX) mov ax,dx |
Регистр R8 | Памят M8 | k DB 10 MOV CL,K |
Лаба 2
Стыковка CPP модуля и ASM модуля.
Для стыковки СРР модуль и ASM модуль должны удовлетворять определенным требованиям.
Требования к СРР:
1. Имена внешних переменных и функций необходимо описывать как глобальные
2. Имена внешних функций должны быть уникальным
3. Для внешних функций необходимо использовать так называемый спецификатор сборки (extern 'C'{прототип функции}). Этот спецификатор используется для интерпретации как C, а не CPP.
4. Константы должны быть локальными
|
|
5. Вызов внешней функции выполняется по правилам принятым в СРР
Требования к ASM:
1. Для модели памяти следует установить тип памяти LARGE с обязательным указанием языка программирования С, а не СРР (model LARGE, C)
2. Внешние переменные которые передаются из СРР модуля разрешается описывать как в сегменте данных так и сегменте кода при помощи директивы Extrn C х:тип
3. Описание констант необходимо повторить. Они должны быть локальными и могут распологаться в сегменте кода или в сегменте данных.
4. Внешние переменные должны быть описаны при помощи дерективы Public с обязательным указанием языка С, а не СРР (Public C имя_внешней_функции)
Описание разрешается выполнять в стиле MASM или Ideal
Ideal -> CODESEG DATASEG
MASM ->.Code.Data
Последовательность компиляции
1. Выполняется компиляция ASM модуля с обязательным указанием ключа 'ml'
Tasm имя.asm /lm /l ->obj и lst
2. Стыковка модулей, сборка программы и создание исполняемого ЕХЕ файла
bcc -ml name1.cpp name2.obj -> name1.exe
Пример
В примере выполняется ввод 2х переменных
int a; unsigned char b;
x=a;
z=b;
cout<<x<<"\n"<<z;
Программа состоит из 2х модулей. Главный на СРР второй на ASM в виде внешней функции с именем prim(). Программа выполняет ввод данных дважды. В первый раз это делает срр модуль, а потом это повторяет ASM модуль. Что бы убедиться в работоспособности ASM модуля перед вызовом функции prim переменные x и z зануляются.
Исходник главного модуля на СРР
#include <iostream.h>
#include <limits.h>
extern "C"
{void prim (void);}
//объявление переменных как глобальных
int x,a;
unsigned char b,z;
//объявление главной функции
void main (void)
{
cout<<endl<<"Input a";
|
|
cin>>a;
x=a;
cout<<endl<<"Input b";
cin>>b;
z=b;
//результат работы срр модуля
cout<<"\n---C++ PROCESSING---\n";
cout<<"x="<<x<<"\n"<<"z="<<z;
//зануление
x=0;
z=0;
//вызов ASM модуля
prim();
//результат работы ASM модуля
cout<<"===ASSEMBLER_PROCESSING===\n";
cout<<"x="<<x<<"\n";
cout<<"z="<<z<<"\n";
}
ИСХОДНИК ASM МОДУЛЯ
;asm модуль prim.asm
title prim
model LARGE,C
DATASEG;объявление сегмента данных
;x,a - word
Extrn C a:word, x:word
;z,b - byte
Extrn C b:byte, z:byte
CODESEG;объявление сегмента кода
Public C prim
prim proc far
mov ax,a
mov bl,b
mov x,ax
mov z,bl
ret
prim endp
end
Лекция 6
Исключения
· В качестве приемника нельзя использовать регистр CS
· Нельзя записать команду прямой инициализации сегмента данных, необходимо использовать буфер (аккумулятор)
· Нельзя пересылать прямо содержимое сегментных регистров, необходимо использовать буфер (аккумулятор)
КОМАНДА ОБМЕНА ДАННЫМИ (Exchange)
XCHG - меняет местами содержимое 2х операндов
xchg Приемник,источник
Возможное сочетание операндов, такие же как и в MOV, но без констант
Команда загрузки адреса (относительно сегмента)LEA-> Load Effective Address
LEA Приемник,источник
Приемник - регистр, источник - память
a dw?
LEA di,a
Эту команду можно реализовать с помощью MOV
x dw 1000
Mov bx,offset x
Смещение всегда видно в листинге программы
Арифметические команды(целочисленная арифметика)
Эти команды предназначены для работы с целочисленными данными длиною байт,слово и частично двойное слово. Эти команды сигнализируют о результате вычислений заполняя соответствующие флаги в регистре флагов