Смекни!
smekni.com

Разработка программы на Ассемблере (стр. 2 из 11)

9. OFFSET -оператор получения смещения адреса относительно начала сегмента (то естьколичества байтов от начала сегмента до идентификатора адреса).

mov bx, OFFSET table

ДИРЕКТИВЫ (ПСЕВДООПЕРАТОРЫ)

1. : -определяет близкую метку (в пределах сегмента).

 

      jmp lbl .... ....

lbl:  ....

2 . = -присваивает символическому имени значение выражения.

videoram = 0B800h; присвоение videoram = 0B000h;

3.  .CODE -определяет начало кодового сегмента, то есть сегмента, где располагаются кодыпрограммы.

4. .DATA  -определяет начало сегмента данных.

5. DB,DW -директивы резервирующие один или несколько байтов: DB, или одно или несколькослов: DW.

 

      ....

      .DATA

fibs  DB 1,1,2,3,5,8,13

rus   DB 'Турбо Ассемблер'

buf   DB 80 DUP(0);резервируется 80 байтов,каждый обнуляется

int   DW 65535;в двух байтах располагается число FFFFh.

Array DW 100 DUP (0);резервируется 100 слов

6. END -обозначает конец программы.

 

      ....

      .CODE

MyPROG:....; точка входа (начало программы).

       ....; команды программы

       ....

       END MyPROG

7. ENDM -окончание блока или макроопределения

8. ENDP -обозначает конец подпрограммы.

9. EQU -присваивает символическому имени или строке значение выражения.

 

BlkSize EQU 512

BufBlks EQU 4

BufSize EQU BlkSize * BufBlks

10. LABEL -определяет метку соответствующего типа.

 

      ....

       .DATA

m_byte LABEL BYTE;метка m_byte типа BYTE позволяет теперь

m_word DW 0;иметь доступ отдельно к каждому байту данных

       .CODE;m_word типа WORD

       ....

       mov [m_word],0204h

       add [m_byte],'0';теперь в m_word хранится код

       add [m_byte+1],'0';3234h,ASCII код '0' равен 30h

11. LOCAL -определяет метки внутри макроопределений как локальные и в каждоммакрорасширении вместо них ассемблер вставляет уникальные метки: ??XXXX, гдеXXXX = (0000...FFFF)h. Почему ??XXXX ? Да потому что никому не должно прийти вголову начинать символическое имя с ??, и транслятор смело может генерироватьметки не боясь совпадений.

12. MACRO -задает макроопределение.

 

Swap   MACRO a,b; a,b - параметры макро (ячейки памяти)

       mov ax,b;данное макрооопределение позволяет делать

       mov bx,a;обмен данными между ячейками памяти, в

       mov a,ax;отличие от команды xchg ;

       mov b,bx;нельзя mov a,b;

       ENDM

Вызов этого макроса производитсякомандой: Swap m,n

13.  .MODEL- определяет размер памяти под данные и код программы.

   .MODEL tiny;под программу,данные и стек отводится один общий сегмент (64 Kb).

14.  PROC -определяет начало подрограммы.

 

Print  PROC NEAR

       ;здесь команды подпрограммы

Print  ENDP

       ....

       call Print;вызов подпрграммы.

15.  .STACK- определяет размер стека.

   .STACK 200h; выделяет 512 байтов для стека.

16.  .RADIX base- определяет систему счисления по умолчанию, где base - основание системысчисления: 2, 8, 10, 16.

 

       .RADIX 8

oct    = 77; oct равно 63d.

17.  ; -начало комментария.

КОМАНДЫ ПЕРЕСЫЛКИ

1. MOV DST,SRC;переслать (SRC) в (DST). Здесь и далее содержимое регистра, например регистраAL будет обозначаться - (AL) или (al), а пересылка в комментарии будетобозначаться знаком <--  .

 

    mov al,ch; (al) <-- (ch).

    mov cx,dx;

    mov bh,[mems];содержимое  ячейки памяти с символическим  адресом

       mems  переслать  в  регистр  BH. Можно: mov bh,mems.

    mov al,[bx];переслать в аккумулятор содержимое ячейки памяти

    с  адресом находящимся в регистре BX .

    mov bx,OFFSET  src;поместить  в  BX  смещение  адреса

       ячейки памяти SRC, в текущем сегменте.

    mov al,table[bx];загрузить в аккумулятор элемент таблицы байтов

       с символическим адресом первого элемента table и отстоящий

       от этого элемента на (bx)  байтов.  Другие варианты:

    mov al,[table + bx] или

      mov al,table + bx.

До выполнения команды mov al,[table + bx]    Регистр BX Регистр AL Адрес Код
0010 XX 0800 (table)
08xx xx
0810 58
После выполнения команды mov al,[table + bx]    Регистр BX Регистр AL Адрес Код
0010 58 0800 (table)
08xx xx
0810 58

2. PUSH RP;поместить на вершину стека содержимое пары регистров RP (например push bx).

3. POP RP; снятьс вершины стека два байта и поместить в пару RP (например pop ax).

4. XCHG DST,SRC; поменять местами содержимое (DST) и (SRC). Оба операнда не могут бытьодновременно содержимым ячеек памяти.

5. XLAT SRC;извлечь из таблицы с начальным адресом SRC байт данных имеющий номер от началатаблицы = (AL), и поместить его в AL. Адрес SRC должен находиться в регистреBX. Другой вариант: XLATB.

 

      ....

      .DATA

src   DB 15d,10h,00110101b,'A','B',166d

      .CODE

      ....

      mov al,2; в результате выполнения этих трех  команд

      mov bx,OFFSET src; в регистр AL будет загружен код

      xlatb; 00110101b = 35h = 53d = ASCII'5'

6. IN ACCUM,PORT; поместить в аккумулятор AL или AX байт или слово из порта с адресом PORT.Если адрес порта <= FF то адрес порта может указываться непосредственно,если адрес порта > FF, то адрес порта указывается косвенно, через содержимоерегистра DX (специальная функция регистра общего назначения).

 

    in al,0a5h;ввести  в  AL  байт данных из ВУ с адресом порта A5h ....

    mov dx,379h;ввести в аккумулятор AL байт данных из

    in al,dx;внешнего устройства  с  адресом  порта  379h

7. OUT PORT,ACCUM; переслать из аккумулятора AL или AX байт или слово в ВУ с символическимадресом PORT.

 

    out 0ffh,al;

    ....

    mov dx,37Ah;переслать слово данных из AX в ВУ с адре-

    out dx,ax;сом порта 37Ah

8. LEA RP,M;загрузить в регистр RP эффективный адрес (смещение) ячейки памяти ссимволическим адресом M.

lea di, rus; аналог этой команды- mov di, OFFSET rus.

 АРИФМЕТИЧЕСКИЕ КОМАНДЫ

1. ADD DST, SRC;сложить содержимое SRC и DST и результат переслать в DST.

  add al, [mem_byte];mem_byte однобайтовая ячейка памяти

  add [mem_word], dx;mem_word двухбайтовая ячейка памяти

  add ch,10001010b;

2. INC DST;увеличить (DST) на 1 (инкремент (DST)).

 

    inc si; (SI) <-- (SI) + 1.

    inc count; (count) <-- (count) + 1.

3. SUB DST, SRC;вычесть (SRC) из (DST) и результат поместить в DST.

4. DEC DST;декремент (DST).

5. CMP DST, SRC;сравнить содержимое DST и SRC. Эта команда выполняет вычитание (SRC) из (DST)  но разность не помещает в DST и по результату операции воздействует на флаги.

 

     условие                                  флаги

                                          OF  SF  ZF  CF

    DST > SRC                            0/1   0   0   0

    DST = SRC                              0   0   1   0

    DST < SRC                            0/1   1   0   1

0/1 - означает, что флаг можетбыть равен 0 или 1 в зависимости от значений операндов. Флаги OF и SF имеютсмысл при операциях со знаковыми числами, CF для беззнаковых чисел. Флагпереполнения OF устанавливается в 1, если в результате операции сложения иливычитания значения переноса в старшиий двоичный разряд и из старшего двоичногоразряда не совпадают. По другому определению OF принимает значение 1, еслирезультат превышает диапазон представления соответствующих чисел. Пусть DST> SRC и оба являются однобайтовыми числами, тогда:

 

      DST:       1.   (+127)         2.    (+127)

      SRC:           -  (+2)              -  (-2)

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

                      (+125) (OF)=0        (+129)? (OF)=1

Во втором примере результатпревышает диапазон: -128 <= x < = +127. Флаг знака SF устанавливается в'1', если старший бит результата операции равен 1, т.е. при отрицательномрезультате. В противном случае сбрасывается. Флаг нуля ZF устанавливается в '1'при нулевом результате (!), иначе сбрасывается. Флаг переноса CF = 1, если естьперенос из старшего разряда при сложении или есть заем в младший разряд привычитании. Иначе флаг сбрасывается. Для первого примера SF = ZF = CF = 0, длявторого: SF = 1, ZF = CF = 0.

ЛОГИЧЕСКИЕ КОМАНДЫ И КОМАНДЫ СДВИГА

1. AND DST, SRC;поразрядное логическое "И".