Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 69 70 71 72 73 74 75  76 77 78 79 80 81 82 ... 85
помощью оператора MASK выделяются только биты поля BIТ2:

               Область RECORD:     101 0110110 011010
               AND MASK BIТ2:      000 1111111 000000
               Результат:          000 0110110 000000

     В результате сбрасываются все биты, кроме принадлежащих к полю  BIТ2.
Следующие две команды приводят к сдвигу содержимого регистра АХ  на  шесть
битов для выравнивания справа:

               0000000000110110       (0036Н)

     После метки Е10  в  регистр  AХ  загружается  все  значение  области,
определенной директивой RECORD, и так как BIТ1 является самым левым полем,
то в примере используется только фактор для сдвига значения вправо  на  13
бит:

               0000000000000101       (0005Н)


                            Директива SEGMENT
                           -------------------
     Ассемблерный модуль может состоять из  одного  или  более  сегментов,
части сегмента или даже частей нескольких сегментов. Формат директивы:

          имя_сегмента SEGMENT [выравнивание]  [объединение] [класс]
                           .
                           .
                           .
          имя_сегмента   ENDS

Все  операнды  являются  необязательными.  Ниже  описаны   операнды    для
выравнивания, объединения и указания класса.

     В ы р а в н и в а н и е.  Операнд выравнивания  определяет  начальную
границу сегмента, например

               PAGE   = xxx00
               PARA   = хххх0 (граница по умолчанию)
               WORD   = ххххe (четная граница)
               BYTE   = ххххх

где х - любая шестнадцатиричная цифра,
    е - четная шестнадцатиричная цифра.

     О б ъ е д и н е н и е. Операнд объединения указывает способ обработки
сегмента, при компоновке:

     NONE: Значение по умолчанию. Сегмент должен быть логически отделен от
     других  сегментов,  хотя  физически   он    может    быть    смежным.
     Предполагается, что сегмент имеет собственный базовый адрес;

     PUBLIC: Все PUBLIC  -  сегменты,  имеющие  одинаковое  имя  и  класс,
     загружаются компоновщиком в смежные области. Все такие сегменты имеют
     один общий базовый адрес;

     STACK: Для компоновщика операнд STACK аналогичен операнду  PUBLIC.  В
     любой компонуемой программе должен быть  определен  по  крайней  мере
     один сегмент STACK.  Если объявлено более одного стека,  то  стековый
     указатель (SP) устанавливается на начало первого стека;

     COMMON:  Для  сегментов  COMMON  с  одинаковыми  именами  и  классами
     компоновщик устанавливает один общий базовый  адрес.  При  выполнении
     происходит наложение второго сегмента на первый. Размер общей области
     определяется самым длинным сегментом;

     AT-параграф: Параграф должен быть  определен  предварительно.  Данный
     операнд обеспечивает определение меток и переменных по  фиксированным
     адресам в фиксированных областях памяти, таких, как ROM  или  таблица
     векторов  прерываний  в  младших  адресах  памяти.   Например,    для
     определения адреса дисплейного видеобуфера используется

               VIDEO_RAM      SEGMENT AT 0B800H

     Класс:  Операнд  класс  может  содержать  любое    правильное    имя,
     заключенное  в  одиночные  кавычки.  Данный   операнд    используется
     компоновщиком для обработки сегментов,  имеющих  одинаковые  имена  и
     классы. Типичными примерами являются классы 'STACK' и 'CODE'.

     Следующие два сегмента объединяются компоновщиком в  один  физический
сегмент при одном значении сегментного регистра:

                         --------------------------------
          Ассемблерный   SEG1 SEGMENT   PARA PUBLIC 'CODE'
          модуль 1              ASSUME  CS:SEG1
                                ...
                         SEG1   ENDS
                         --------------------------------
          Ассемблерный   SEG2 SEGMENT   PARA PUBLIC 'CODE'
          модуль 2              ASSUME  CS:SEG1
                                ...
                         SEG2   ENDS
                         --------------------------------

     Сегменты могут быть вложенными один в другой:

                         SEG1   SEGMENT
                                ...               Начало SEG1
                         SEG2   SEGMENT
                                ...               Область SEG2
                         SEG2   ENDS
                                ...               Конец SEG1
                         SEG1   ENDS

     Для объединения сегментов в группы используйте директиву GROUP.


                             Директива STRUC
                            -----------------
     Директива STRUC  обеспечивает  определение  различных  полей  в  виде
структуры.  Данная директива не поддерживается  в  малом  ассемблере  ASM.
Формат директивы:

               Имя-структуры  STRUC
                              ...
                              [определение полей данных]
                              ...
               Имя-структуры  ENDS

     Структура  начинается  собственным  именем  в  директиве   STRUC    и
завершается таким же именем в директиве ENDS.  Ассемблер записывает  поля;
определенные в структуре, одно за другим от начала структуры.  Правильными
операторами определения полей являются DB, DW, DD и DT  с  указанием  имен
или без них.
     На рис.24.2 директива STRUC определяет список параметров PARLIST  для
ввода имени с клавиатуры.  Следующий далее оператор  выделяет  память  под
данную структуру:

               PARAMS    PARLIST <>

Данный оператор обеспечивает адресацию структуры внутри программы. Угловые
скобки (символы меньше и больше) в данном случае пусты,  но  в  них  можно
указать данные для переопределения областей внутри структуры.
     В командах ассемблера может использоваться прямая адресация по  имени
структуры.  Для ссылки на определенное поле внутри  структуры  в  командах
используется имя структуры (PARAMS в данном примере)  и  через  точку  имя
конкретного поля:

               MOV       AL,PARAMS.ACTLEN

     Используя оператор выделения памяти, можно переопределить  содержимое
полей внутри  структуры.  Правила  для  практического  использования  этой
возможности можно найти в руководстве по Ассемблеру.

__________________________________________________________________________

                        TITLE   DSTRUC  (COM) Определение структуры
0000                    CODESG  SEGMENT PARA 'Code'
                                ASSUME  CS:CODESG,DS:CODESG,SS:CODESG
0100                            ORG     100H
0100 EB 29              BEGIN:  JMP     SHORT MAIN
                        ; ---------------------------------------------
                        PARLIST         STRUC           ;Список параметров
0000 19                 MAXLEN  DB      25              ;
0001 ??                 ACTLEN  DB      ?               ;
0002    19 [ 20 ]       NAMEIN  DB      25 DUP(' ')     ;
001B                    PARLIST         ENDS
                                                        ;
0102 19                 PARAMS  PARLIST <>              ;Область структуры
0103 ??
0104    19 [ 20 ]
011D 57 68 61 74 20 69  PROMPT  DB      'What is name?', 'S'
     73 20 6E 61 6D 65
     3F 24
                        ; ---------------------------------------------
012B                    MAIN    PROC    NEAR
012B B4 09                      MOV     AH,09            ;Выдать запрос
012D 8D 16 011D R               LEA     DX,PROMPT
0131 CD 21                      INT     21H
0133 B4 0A                      MOV     AH,0AH           ;Получить ввод
0135 8D 16 0102 R               LEA     DX,PARAMS
0139 CD 21                      INT     21H
013B A0 0103 R                  MOV     AL,PARAMS.ACTLEN ;Длина ввода
                        ;       ...
013E C3                         RET
013F                    MAIN    ENDP
013F                    CODESG  ENDS
                                END     BEGIN


Structures and records:
                N a m e          Width  # fields
                                 Shift  Width   Masc    Initial
PARLIST. . . . . . . . . . . . . 001B   0003
  MAXLEN . . . . . . . . . . . . 0000
  ACTLEN . . . . . . . . . . . . 0001
  NAMEIN . . . . . . . . . . . . 0002

Segments and Groups:
                N a m e          Size   Align   Combine Class
CODESG . . . . . . . . . . . . . 013F   PARA    NONE    'CODE'

Symbols:
                N a m e          Type   Value   Attr
BEGIN. . . . . . . . . . . . . L NEAR   0100    CODESG
MAIN . . . . . . . . . . . . . N PROC   012B    CODESG  Length =0014
PARAMS . . . . . . . . . . . . L 001B   0102    CODESG
PROMPT . . . . . . . . . . . . L BYTE   011D    CODESG
__________________________________________________________________________

     Рис.24.2. Пpимеp опpеделения стpуктуpы



ГЛАВА 25                            Справочник по командам языка Ассемблер
__________________________________________________________________________

     Ц е л ь: описать набор команд  Ассемблера  и  объяснить  их  машинные
коды.


     ВВЕДЕНИЕ
     ________________________________________________________________

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

     Объектный код:      Символические команды:
          40             INC  AX        ;Увеличение AX на 1
          50             PUSH AX        ;Запись AХ в стек
          С3             RET  (short)   ;Короткий возврат из процедуры
          CB             RET  (far)     ;Длинный возврат из процедуры
          FD             STD            ;Остановка флага направления

     Ни одна  из  перечисленных  команд  не  использует  прямой  адресации
памяти.  Другие команды, использующие непосредственный операнд,  8-битовый
регистр,  регистровую  пару  или  адрес  памяти,  требуют  более  сложного
машинного кода.


     ОБОЗНАЧЕНИЕ РЕГИСТРОВ
     ________________________________________________________________

     Команды, использующие регистр, могут содержать три бита,  указывающих
на конкретный регистр, и один бит "w", определяющий размер регистра:  байт
или слово.  Кроме того,  лишь  некоторые  команды  обеспечивают  доступ  к
сегментным регистрам. На рис.25.1 показана полная идентификация регистров.
     Рассмотрим команду MOV с однобайтовым непосредственным операндом:

               MOV    АН,00   10110 100 00000000
                                  |   |
                                  w  rеg = AН

__________________________________________________________________________

                 Основные, базовые и индексные регистры:

                      Биты:       w = 0       w = 1
                       000          AL          AX
                       001          CL          CX
                       010          DL          DX
                       011          BL          BX
                       100          AH          SP
                       101          CH          BP
                       110          DH          SI
                       111          BH          DI

                        Биты:  Сегментный регистр:
                           00               ES
                           01               CS
                           10               SS
                           11               DS
__________________________________________________________________________

     Рис.25.1. Обозначение регистров


     В данном случае первый байт машинного кода указывает на  однобайтовый
размер (w = 0) и на регистр  AН  (100).  Следующая  команда  MOV  содержит
непосредственный двухбайтовый операнд:

               MOV     AX,00  10111 000 00000000 00000000
Предыдущая страница Следующая страница
1 ... 69 70 71 72 73 74 75  76 77 78 79 80 81 82 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама