Основные команды целочисленной арифметики

Большинство этих команд не различают знаковые и без знаковые данные. Принимать самый старший бит числа за знак или как за информацию решает программист.

КОМАНДЫ ПЕРЕСЫЛКИ И ОБМЕНА ИНФОРМАЦИЕЙ

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

Смещение всегда видно в листинге программы

Арифметические команды(целочисленная арифметика)

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: