Программирование MCS51 DIS8051 кросс-дизассемблер, руководство по использованию Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


DIS8051 кросс-дизассемблер, руководство по использованию Печать
Добавил(а) microsin   

Здесь и далее перевод документации на бесплатный дизассемблер DIS8051 "DIS8051 Cross-Disassembler User's Guide" компании Data Sync Engineering. Несмотря на то, что этот дизассемблер появился на свет в начале 90-х годов, он до сих пор хорошо подходит для разборок с двоичным кодом микроконтроллеров на ядре MCS-51 (8051, 8052 и т. п.). Непонятные термины и сокращения см. в разделе Словарик, в конце статьи.

[1.0. Пакет поставки DIS8051, назначение файлов]

Дизассемблер DIS8051 поставляется в виде набора из следующих файлов [2]:

DIS8051.COM Исполняемый файл дизассемблера.
DIS8051.DOC Руководство пользователя (на английском языке).
EXAMPLE.BIN Пример программы, ассемблированной в двоичный файл (BIN, BINARY).
EXAMPLE.HEX Пример программы, ассемблированной в HEX файл (формат Intel HEX).
EXAMPLE.LST Листинг ассемблирования программы примера.
OPERAND.BIT Текстовый файл, где заданы мнемоники битов SFR для адресуемого пространства бит.
OPERAND.BYT Текстовый файл, где заданы мнемоники для названий SFR, находящихся в области DATA.

[1.1. Общее описание DIS8051]

DIS8051 относится к инструментарию кросс-дизассеблирования (cross-disassembly). Словечко "кросс" означает, что программа запускается на компьютере (процессор 8080, 8086, x86 и т. п.), но обрабатывает при этом код другого микроконтроллера. Во многих случаях DIS8051 работает так же, как и отладчик, но с тем отличием, что DIS8051 генерирует файл исходного кода, который можно скомпилировать кросс-ассемблером (и получить обратно двоичный файл).

Примечание от переводчика: DIS8051 по умолчанию, без каких-то дополнительных настроек генерирует файл, полностью совместимый с кросс-ассемблером IAR [2]. Однако наличие настроек TAG-файла позволяет адаптировать вывод DIS8051 практически к любому кросс-ассемблеру.

DIS8051 оснащен полезными функциями, такими как отображение символов ASCII, соответствующих байтам кода (это позволяет проще распознать в коде текстовые данные), генерация меток, создание списков перекрестных ссылок (cross-reference lists). Это упрощает сложную задачу по реконструкции или отладке кода (иногда этот процесс называют реверс-инжинирингом).

Отдельный управляющий файл, так называемый файл TAG, позволяет пользователю пометить (или обозначить, tag) специальные области программы, которые должны быть дизассемблированы как операторы текста (Text statements), операторы вставки байтов db (HEX byte statements), или должны просто игнорироваться при дизассемблировании.

Внешние текстовые файлы мнемонических операндов (OPERAND.BIT, OPERAND.BYT) позволяют адаптировать DIS8051 к различным микроконтроллерам обширного семейства 8051.

[1.2. Системные требования]

Примечание от переводчика: вообще-то требований никаких нет, так что перевод этой секции приведен просто как дань уважения к разработчикам. DIS8051 заработает на любом компьютере с операционной системой DOS или Windows, или в среде их симуляции, где есть возможность запустить интерпретатор команд CMD. Имейте в виду, что очень большие программы иногда придется дизассемблировать по кускам (из-за ограничений самого дизассемблера DIS8051).

DIS8051 работает под управлением MS-DOS 2.0 или более поздней версии, и использует при этом около 15 килобайт памяти. Дополнительно задействовано 390 килобайт памяти для временного хранения символов и таблиц. Типичные требования к системе - наличие около 512 килобайт памяти.

DIS8051 генерирует дизассемблированный листинг с перекрестными ссылками за 3 прохода. На проходе 1 читается входной файл, и генерируются символы и ссылки. На проходе 2 входной файл перечитывается, и начинается запись каждой строки листинга программы. На последнем, 3 проходе дописывается сортированные списки перекрестных ссылок (cross-reference lists) для меток (Labels), памяти данных DATA (Data Memory), побитово адресуемой памяти (Bit Addressable Memory) и просто байтов (Immediate Bytes).

К примеру, BIN файл 8K, который в HEX-формате занимает 23K, может быть дизассемблирован в файл размером 173K. Несмотря на то, что можно запустить DIS8051 прямо с флоппи-диска, все же для ускорения работы рекомендуется использовать жесткий диск.

[2.0. Выходной формат дизассемблера]

Весь сгенерированный код программы будет написан в общепринятом формате кода на языке ассемблера. Этот формат подразумевает деление строки кода на 4 основные части (поля): метка (label), код операции (op code), операнд (operand) и комментарий.

Поле метки LABEL используется для того, чтобы присвоить символическое имя месту размещения инструкции кода (или пометить это место, label). К примеру, инструкция LJMP L0100 приведет к безусловной загрузке программного счетчика адресом памяти 0100H, на который была назначена метка L0100. Команда по метке L0100 будет следующей выполняемой инструкцией после выполнения инструкции перехода LJMP (сокращение от Long JuMP, дальний переход). Большинство инструкций кода не имеют меток, но если на инструкцию где-то была ссылка, то метка появится в крайнем левом столбце кода (первое поле строки кода ассемблера). При этом метка будет начинаться с задаваемого опцией символа "L" (L символ по умолчанию для обозначения метки), и заканчиваться на задаваемый опцией символ двоеточия (по умолчанию ":"), за которым будет следовать символ табуляции. Если в метка отсутствует, то поле метки будет пустым, и будет пропущено использованием символа табуляции.

Поле кода операции OP CODE обязательно для каждой строки программы, которая содержит инструкцию микроконтроллера. Код операции находится в поле 2 строки, и оно отделено от поля метки символом табуляции.

Поле операнда OPERAND используется для того, чтобы указать данные или адрес для инструкций, которые требуют наличия операнда. Операнд находится в поле 3, и отделен от кода операции также символом табуляции. DIS8051 использует 3 типа формы операнда:

   000H - 0FFH                Шестнадцатеричный (hexadecimal) формат.
   L0000 - LFFFF              Формат метки.
   ACC, DPL, SBUF             Формат мнемоники.

Последнее поле комментария COMMENT используется для добавления заметок, относящихся к оператору. Содержимое поле комментария будет игнорироваться ассемблером. Текст комментария начинается с выбираемого опцией символа (по умолчанию это точка с запятой ";"). Строка комментария также может быть не только добавлена к строке с оператором, но и использоваться отдельно (даже с начала строки). DIS8051 может использовать поле комментария в трех формах:

1. Чтобы идентифицировать место размещения (адрес) и содержимое (байты кода) текущей инструкции.
2. Чтобы разблокировать сегменты программы для простой их интерпретации.
3. Чтобы добавить в конец генерируемого кода списки перекрестных ссылок.

[2.1. Типы входных файлов]

DIS8051 может дизассемблировать файлы в формате HEX или BIN.

HEX Файлы в формате HEX являются транслированными версиями двоичных файлов (файлов в формате BIN). Эти трансляции используют для кодирования символы ASCII. Весь HEX-файл разбит на группы однобайтовых цифр (каждая из которых является символом ASCII). Каждая такая группа имеет отдельный адрес загрузки (load address, обозначает место, кода код будет загружаться в память), счетчик (количество символов в группе) и дополнительная контрольная сумма (которая служит для детектирования ошибок). HEX-файлы можно передавать с компьютера на компьютер, или их можно загрузить в программатор (EEPROM, FLASH).

Если Вы посмотрите на внутренность реального HEX-файла (его можно открыть и посмотреть обычным текстовым редактором), то увидите что-то наподобие следующего текста:

:03000000020100FA
:1001000090011812010880FEE493A3B4000122308C
:1001100099FDC299F59921084558414D504C45002B
:00000001FF

BINARY файлы являются двоичными образами программы точно в таком виде, как она находится в памяти микроконтроллера. .. Просмотреть двоичный файл можно специальными программами, которые обычно называются DUMP или HEXDUMP (от переводчика: можно использовать WinHEX. Кроме того, менеджеры файлов Volkov Commander, Midnight Commander, Norton Commander, Far, Total Commander имеют удобные встроенные HEX-просмотрщики двоичных файлов). Вот пример того, как отображает двоичный файл программа HEXDUMP:

0000  02 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
0010  FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
      :  :  :  :  :  :  :  :  :  :  :  :  :  :  :  :
0100  90 01 18 12 01 08 80 FE E4 93 A3 B4 00 01 22 30   .............."0
0110  99 FD C2 99 F5 99 21 08 45 58 41 4D 50 4C 45 00   ......!.EXAMPLE.

[2.2. Быстрый старт, с чего начать (GETTING STARTED)]

Данные в формате HEX и BINARY, как они были показаны выше поставляются в виде примеров в пакете DIS8051. Эти примеры находятся в файлах EXAMPLE.HEX и EXAMPLE.BIN. Оригинальный текстовый листинг ассемблирования EXAMPLE.LST предоставлен для дополнительной информации. Мы будем использовать эти файлы примеров для описания команд и синтаксиса командной строки DIS8051.

Для того, чтобы дизассемблировать программу EXAMPLE.HEX в самом простом формате, просто введите в командной строке следующее (если Вы находитесь в среде Windows, то для ввода команды запустите интерпретатор CMD и перейдите в каталог, где находится распакованные файлы пакета DIS8051):

DIS8051 EXAMPLE.HEX < Enter >

После этого в консоли появится следующий текст:

......................................................................
.                                                                    .
.   DIS8051  Cross Disassembler    Version 2.x    PC/MS-DOS          .
.   Copyright (C) 1989 Data Sync Engineering   All rights reserved.  .
.                                                                    .
.   Memory initialization ...                                        .
.   No Tag File                                                      .
.   Starting PASS Number 1  -  Processing: 0110                      .
.   Starting PASS Number 2  -  Processing: 0110                      .
.                                                                    .
.   Successful Disassembly -- Source File Created.                   .
......................................................................

Файл EXAMPLE.HEX будет дизассемблирован, и будет создан файл EXAMPLE.SRC. Этот новый файл (выходной файл) содержит исходный код программы EXAMPLE.HEX на языка ассемблера 8051.

[2.3. Выходной файл]

Созданный файл исходного кода (EXAMPLE.SRC) получится следующий:

;===============================================================;
; Disassembled Using DIS8051 - (C)1989 Data Sync Engineering    ;
;===============================================================;
;
        ORG     00000H
;
        LJMP    L0100
;
        ORG     00100H
;
L0100:  MOV     DPTR,#L0118
        LCALL   L0108
;
L0106:  SJMP    L0106
;
L0108:  CLR     A
        MOVC    A,@A+DPTR
        INC     DPTR
        CJNE    A,#000H,L010F
        RET        
;
L010F:  JNB     TI,L010F
        CLR     TI
        MOV     SBUF,A
        AJMP    L0108
;
L0118:  ORL     A,058H
        AJMP    L024D
;
        JNC     L016A
        ORL     A,000H
;
; Unresolved Address Reference list
;
L016A:          EQU        0016AH
L024D:          EQU        0024DH
;
        END

Как Вы можете видеть, DIS8051 автоматически вставил метки для обозначения позиций (адресов) в памяти, и добавил директивы для управления ассемблером. Метод сегментации кода добавляет пустые строки комментария после определенных инструкций - таких как RET и JMP (команды безусловной передачи управления), и перед строками, которые содержат метку.

В то время как проход 1 назначает операнды меток на инструкции, ссылающиеся на память, проход 2 вставляет эти метки по их соответствующим адресам. Если в коде не найдено соответствующее место для метки (нет кода инструкции с таким адресом), то DIS8051 автоматически добавляет выражение эквивалентности (оператор EQU) метки значению, и добавляет метку в список нераспознанных перекрестных ссылок (Unresolved Reference list).

Появление нераспознанных ссылок (Unresolved References) в дизассемблированном коде происходит по причине наличия текстовых (например символы ASCII), табличных данных программы, или при доступе к неопределенным устройствам ввода/вывода I/O или к другой внешней памяти. Если Вы знаете такие места в коде, то можете использовать специальный файл (так называемый Tag-файл), чтобы управлять процессом дизассемблирования - области данных могут быть помечены и исключены из интерпретации их как кода программы (они не будут восприниматься как инструкции выполняемого кода).

[2.4. Описание формата файла TAG]

TAG-файл говорит дизассемблеру DIS8051, в какой режим дизассемблирования надо переключиться. TAG-файл можно создать в любом текстовом редакторе и назначить ему такое же расширение, как и входной файл, только расширение файла назначить на "TAG" (*.TAG). Записи в TAG-файле состоят из четырех шестнадцатеричных цифр, обозначающих стартовый адрес, за которыми идет символ "=" и затем символ команды, задающей режим дизассемблирования. Имеется 4 базовых режима дизассемблирования: обычное дизассемблирование кода (Instruction disassembly), пропуски или игнорирование байтов (Skip or ignore byte disassembly), дизассемблирование в виде шестнадцатеричной таблицы (Hex Byte table disassembly), дизассемблирование как текст ASCII (ASCII Text disassembly, будут определены операторы вставки байт в виде текстовых символов ASCII). Имеется дополнительная команда, называемая "Generate Label equate" (генерирование определения метки), которая принуждает DIS8051 построить список EQU, в котором будут определены адреса ввода/вывода (I/O) и адреса внешней памяти (External Memory). Этот список "Equate List" вписывается в начале выходного файла дизассемблированного кода, и встречающиеся в таком списке метки не попадут в нераспознанные адреса ссылок (Unresolved Address References). В таблице ниже показаны команды TAG-файла.

Команда Описание
G или g Сгенерировать выражение EQU, где будет задана метка для указанного адреса.
S или s Пропустить (SKIP) данные кода (не дизассемблировать это место).
I или i Дизассемблирование кода как инструкций (INSTRUCTION disassembly).
B или b Дизассемблировать как определение байтов (Define BYTE disassembly, DB 000H).
T или t Дизассемблировать как текст (TEXT disassembly, DB 'text').

Примечание: для получения дополнительной информации по возможностям TAG-файла см. "Изменение формата дизассемблирования" (ALTERING DISASSEMBLER FORMAT).

[2.5. Расширенные опции DIS8051 (ADVANCED DIS8051 OPTIONS)]

DIS8051 имеет мощные опции дизассемблирования, которые предоставляют более полное и детальное представление дизассемблированной программы. В таблице ниже приведены эти опции.

Опция Описание
B или b Говорит для DIS8051, что входной файл двоичный бинарный (BIN).
C или c Добавить поле комментария в каждую строку с инструкцией, в котором будет HEX-дамп адреса и содержимого байтов инструкции.
L или l Преобразование символов выходного ассемблерного кода в нижний регистр (lower case characters).
R или r Добавить в конец выходного файла кода списки перекрестных ссылок (Cross-reference lists).
T или t Добавить параметры дизассемблирования из из TAG-файла.
X или x Сгенерировать только списки перекрестных ссылок, не генерировать код ассемблера.

Буквы опций в командной строке должны быть указаны вместе с предшествующим символом слеша "/", и их можно группировать друг с другом (например, DIS8051 EXAMPLE.HEX /LCTR).

Шестнадцатеричный дамп в поле комментария (COMMENT FIELD HEXDUMP)

В каждую строку с инструкцией может быть добавлено поле комментария. Оно показывает значение программного счетчика (PC, Program Counter), шестнадцатеричное значение байт инструкции, и уместное соответствующее символьное представление байт инструкции. Если применимо, то вставляется символ ASCII, а если соответствующего символа ASCII нету (к примеру, это управляющий символ, или байт, значение которого превышает 07Fh), то вставляется точка.

Списки перекрестных ссылок (CROSS-REFERENCE LISTS)

Списки перекрестных ссылок, которые генерирует DIS8051 отражают взаимосвязь программного кода использования памяти. Листинг показывает метку (Label) или адрес памяти, за которым следуют все места, в которых используется ссылка на этот адрес. Ссылающиеся места идентифицируются по программному счетчику, показанному в поле комментария (HEX-дамп адреса и кода).

[2.6. Экскурс в практическое использование]

ШАГ 1 - дизассемблируйте программу EXAMPLE.HEX с HEX-дампом в строке комментария и списками перекрестных ссылок. Для этого введите в командной строке:

DIS8051 EXAMPLE.HEX /RC < Enter >

В результате выведется следующее сообщение:

......................................................................
.                                                                    .
.   DIS8051  Cross Disassembler    Version 2.x    PC/MS-DOS          .
.   Copyright (C) 1989 Data Sync Engineering   All rights reserved.  .
.                                                                    .
.   Memory initialization ...                                        .
.   No Tag File                                                      .
.   Starting PASS Number 1  -  Processing: 0110                      .
.   Starting PASS Number 2  -  Processing: 0110                      .
.   Starting PASS Number 3  -  Xref lists: 0000                      .
.                                                                    .
.   Successful Disassembly -- Source File Created.                   .
......................................................................

ШАГ 2 - просмотрите полученный файл листинга дизассемблированного кода (EXAMPLE.SRC).

;===============================================================;
; Disassembled Using DIS8051 - (C)1989 Data Sync Engineering    ;
;===============================================================;
;
        ORG     00000H
;
        LJMP    L0100              ;0000  02 01 00       ...
;
        ORG     00100H
;
L0100:  MOV     DPTR,#L0118        ;0100  90 01 18       ...
        LCALL   L0108              ;0103  12 01 08       ...
;
L0106:  SJMP    L0106              ;0106  80 FE          ..
;
L0108:  CLR     A                  ;0108  E4             .
        MOVC    A,@A+DPTR          ;0109  93             .
        INC     DPTR               ;010A  A3             .
        CJNE    A,#000H,L010F      ;010B  B4 00 01       ...
        RET                        ;010E  22             "
;
L010F:  JNB     TI,L010F           ;010F  30 99 FD       0..
        CLR     TI                 ;0112  C2 99          ..
        MOV     SBUF,A             ;0114  F5 99          ..
        AJMP    L0108              ;0116  21 08          !.
;
L0118:  ORL     A,058H             ;0118  45 58          EX
        AJMP    L024D              ;011A  41 4D          AM
;
        JNC     L016A              ;011C  50 4C          PL
        ORL     A,000H             ;011E  45 00          E.
;
; Unresolved Address Reference list
;
L016A:          EQU        0016AH
L024D:          EQU        0024DH
;
; Cross-references to LABELS
;
; L0100= 0000 
; L0106= 0106 
; L0108= 0103 0116 
; L010F= 010B 010F 
; L0118= 0100 
; L016A= 011C 
; L024D= 011A 
;
; Cross-references to Data Memory locations
;
; M: 00= 011E 
; M: 58= 0118 
; M: 99= 0114 
;
; Cross-references to BIT addressable locations
;
; B: 99= 010F 0112 
;
; Immediate Byte references
;
; #: 00= 010B 
;
        END

Когда будете просматривать полученный листинг кода, обратите внимание на область между адресами 0118h и 011Eh, которая содержит символы текста ASCII. Эта та же самая область, которая сгенерирована в таблице нераспознанных адресных ссылок (Unresolved Address References).

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

ШАГ 3 - с использованием текстового редактора создайте файл EXAMPLE.TAG. В этом файле введите следующие строки:

0118=T
011F=B
FFFF

Ранее описанные команды TAG-файла здесь указывают следующее: начиная с адреса 0118h переключиться в режим дизассемблирования текста, на адресе 011Fh переключиться в режим Define Byte (вставка байтов оператором ассемблера DB). FFFF используется как маркер окончания списка команд TAG-файла.

Каждая строка TAG-файла содержит только одну команду, но здесь нет ограничений на длину списка, за исключением того, что адрес "FFFF" должен использоваться как сигнал окончания списка команд.

ШАГ 4 - теперь проведите дизассемблирование программы EXAMPLE.HEX снова, но уже с использованием дополнительных параметров из файла TAG, с опцией нижнего регистра символов и выводом HEX-дампа команд в комментарии. Введите:

DIS8051 EXAMPLE.HEX /TCL < Enter >

......................................................................
.                                                                    .
.   DIS8051  Cross Disassembler    Version 2.x    PC/MS-DOS          .
.   Copyright (C) 1989 Data Sync Engineering   All rights reserved.  .
.                                                                    .
.   Memory initialization ...                                        .
.   Tag File Processed                                               .
.   Starting PASS Number 1  -  Processing: 0110                      .
.   Starting PASS Number 2  -  Processing: 0110                      .
.                                                                    .
.   Successful Disassembly -- Source File Created.                   .
......................................................................

ШАГ 5 - мы использовали опцию нижнего регистра, чтобы удовлетворить общепринятого среди программистов стиля написания листинга кода. Результирующий файл EXAMPLE.SRC будет выглядеть так:

;===============================================================;
; Disassembled Using DIS8051 - (C)1989 Data Sync Engineering    ;
;===============================================================;
;
        org     00000h
;
        ljmp    L0100              ;0000  02 01 00       ...
;
        org     00100h
;
L0100:  mov     dptr,#L0118        ;0100  90 01 18       ...
        lcall   L0108              ;0103  12 01 08       ...
;
L0106:  sjmp    L0106              ;0106  80 FE          ..
;
L0108:  clr     a                  ;0108  E4             .
        movc    a,@a+dptr          ;0109  93             .
        inc     dptr               ;010A  A3             .
        cjne    a,#000h,L010F      ;010B  B4 00 01       ...
        ret                        ;010E  22             "
;
L010F:  jnb     ti,L010F           ;010F  30 99 FD       0..
        clr     ti                 ;0112  C2 99          ..
        mov     sbuf,a             ;0114  F5 99          ..
        ajmp    L0108              ;0116  21 08          !.
;
L0118:  db      'EXAMPLE'
        db      000h               ;011F  00             .
;
; Unresolved Address Reference list
;
;
        end

[2.7. Описание дизассемблированного выходного листинга]

Директива ассемблера ORG была вставлена на основании информации, взятой из HEX-файла.

                 ORG     00000H
         ;
                 LJMP    L0100              ;0000  02 01 00        ...
         ;
                 ORG     00100H
 
         :03 0000 00 020100 FA
         :10 0100 00 90011812010880FEE493A3B400012230 8C
             ----
               |
               +---> HEX-файл, информация об адресе загрузки кода.
 
         L0100:  MOV     DPTR,#L0118        ;0100  90 01 18        ...
                 LCALL   L0108              ;0103  12 01 08        ...
         ;
         L0106:  SJMP    L0106              ;0106  80 FE           ..
         ;
         L0108:  CLR     A                  ;0108  E4              .
                 MOVC    A,@A+DPTR          ;0109  93              .
                 INC     DPTR               ;010A  A3              .
                 CJNE    A,#000H,L010F      ;010B  B4 00 01        ...
                 RET                        ;010E  22              "
         ;
         L010F:  JNB     TI,L010F           ;010F  30 99 FD        0..
                 CLR     TI                 ;0112  C2 99           ..
                 MOV     SBUF,A             ;0114  F5 99           ..
                 AJMP    L0108              ;0116  21 08           !.
         ;
         L0118:  ORL     A,058H             ;0118  45 58           EX
                 AJMP    L024D              ;011A  41 4D           AM
         ;
                 JNC     L016A              ;011C  50 4C           PL
                 ORL     A,000H             ;011E  45 00           E.
                                            -----  --------        ---
                                               |      |             |
        PC, программный счетчик <--------------+      |             |
                                                      |             |
  HEX-значение используемых в команде байт  <---------+             |
                                                                    |
                                 ASCII-эквивалент кода байт  <------+

[2.8. Изменение формата дизассемблирования" (ALTERING DISASSEMBLER FORMAT)]

Поскольку ассемблеры разных производителей программного обеспечения иногда требуют некоторых отличий в формате ассемблерного файла и в синтаксисе операторов, то может потребоваться изменить основные директивы и последовательности разделителей. TAG-файл может использоваться для изменения значений по умолчанию для этого формата. В таблице ниже перечислены выходные форматы и их значения по умолчанию.

Тип формата Значение по
умолчанию 
Функция
TAG-файла 
Макс.
размер 
Директива размещения кода по нужному адресу. ORG O 4
Директива эквивалентности. EQU E 4
Директива объявления байта в HEX-формате. DB D 4
Директива объявления текста ASCII. DB A 4
Начальный символ для метки. L L 1
Символ разделителя конца имени EQU. : W 1
Символ разделителя конца имени метки. : X 1
Символ разделителя символов. ' Y 1
Разделитель для комментария. ; Z 1
Расширение выходного файла. SRC F 3
7-битная маска для HEX-дампа ASCII. 8 бит M -
Альтернативная нотация HEX-формата. 0--H $ -

Примеры допустимого изменения формата:

Командная строка TAG-файла Было Стало
0000=O.ORG ORG .ORG
0000=EEQ EQU EQ
0000=DDFB DB DFB
0000=ATEXT DB TEXT
0000=LZ L Z
0000=X X (нет разделителя)
0000=Y" ' "
0000=Z* ; *
0000=FTST SRC TST
0000=$ 0--H $--

[2.9. Листинги перекрестных ссылок (CROSS REFERENCE LISTS)]

; Cross-references to LABELS
; (перекрестные ссылки на метки)
;
; L0100=  0000 
; L0106=  0106 
; L0108=  0103 0116 
; L010F=  010B 010F 
; L0118=  0100 
; L016A=  011C 
; L024D=  011A 
  -----   ----
    |      |
    |      +-------> Адрес программы, из которого была ссылка на метку.
    |
    +----------> Метка, на которую была ссылка (метка соответствует адресу инструкции).
 
; Cross-references to Data Memory locations
; (перекрестные ссылки на места в памяти DATA)
;
; M: 99=  0114 
  -- --   ----
  |  |     |
  |  |     +--------> Адрес программы, из которого была ссылка.
  |  |
  |  +---------> Адрес памяти DATA (в этом примере 99 = адресу SFR-регистра SBUF).
  |
  +------> Показывает адрес для памяти DATA или байта памяти.
 
; Cross-references to BIT addressable locations
; (перекрестные ссылки на адресуемые биты)
;
; B: 99=  010F  0112 
  -- --   ----  ----
  |  |     |     |
  |  |     +-----+--> Адреса программы, из которых были ссылки.
  |  |
  |  +---------> Адрес в побитно адресуемой памяти (99 = битовый адрес TI).
  |
  +------> Показывает, что адрес относится к побитно адресуемой памяти.
 
; Immediate Byte references
; (Прямое использование значений байта)
;
; #: 00=  010B 
  -- --   ----  
  |  |     |         
  |  |     +--------> Адрес программы, из которого была ссылка.
  |  |
  |  +---------> Прямое значение (immediate Value, обычно такие значения называют константами).
  |
  +------> Показывает, что это значение байта-константы (immediate byte value).

[2.10. Тестовые файлы операндов (OPERAND)]

Когда процесс дизассемблирования запущен, DIS8051 ищет и загружает два текстовых файла, OPERAND.BYT и OPERAND.BIT. Эти файлы содержат текстовые замены как мнемоники для адресов байтов (BYTE) и битов (BIT) соответственно. Эти файлы используются для того, чтобы адаптировать дизассемблер DIS8051 для других мнемоник регистров микроконтроллеров семейства 8051.

При модификации файлов OPERAND.BYT и OPERAND.BIT следует соблюдать следующие правила. Записи (строки) в файлах должны начинаться с адреса байта или бита "00" и заканчиваться адресом "FF". Каждая строка содержит до 10 символов, включая возврат каретки (CR) и перевод строки (LF). Мнемоника операнда завершается символом "=". Любой текст после этого символа игнорируется. Следующие примеры показывают различия между назначениями мнемоники регистров SFR у микроконтроллеров 8052 и 80C152.

Байтовый адрес SFR (файл OPERAND.BYT):

Адрес байта          8052            80C152
-----------        --------         --------
    C8             T2CON===         IEN1====

Битовый адрес SFR (файл OPERAND.BIT):

Адрес байта          8052            80C152
-----------        --------         --------
    C8             T2CP====         EGSRV===
    C9             T2C=====         EGSRE===
    CA             TR2=====         EDMA0===
    CB             EXEN2===         EGSTV===
    CC             TLCK====         EDMA1===
    CD             RCLK====         EGSTE===
    CE             EXF2====         0CEH====
    CF             TF2=====         0CFH====

[2.11. Правила модификации текстовых файлов]

1. Весь текст должен быть введен символами в верхнем регистре (большие буквы).
2. The "=" используется для окончания слова текста мнемоники.
3. Может быть использовано только до 7 символов для мнемоники.
4. Каждая строка должна содержать 8 символов плюс CR и LF (итого 10 символов). Для заполнения строки мнемоники может использоваться любой символ, пока не появится символ "=".
5. Все символы после "=" не будут вставлены в выходной файл кода ассемблера.
6. Недопустимые мнемоники, такие как BIT-адреса CE & CF микроконтроллера 80C152, должны содержать как минимум один печатаемый символ. Обычно рекомендуется использовать шестнадцатеричные нотации (0--H).
7. Поскольку адреса от 00 до 7F не относятся к диапазону адресов SFR, то они установлены в HEX-нотации 000H .. 07FH. Вместо них также можно использовать символьные имена.

[2.12. Сообщения об ошибках (ERROR MESSAGES)]

Error -- No Input File Specified. В командной строке пропущено указание имени файла. Синтаксис командной строки: DIS8051[.ext] [/options]

Error -- Input File Did Not Open. Входной файл не найден. Проверьте в пути файла диск, путь (имена папок) или имя файла.

Error -- Input File Empty. Во входном файле не найдены никакие данные. Проверьте содержимое файла.

Error -- Insufficient Disk Space. Диск или директория переполнены. Вставьте новый диск или удалите файлы, которые не нужны.

Load Error In HEX File. Во входном файле встретилась ошибка контрольной суммы. Попробуйте другой HEX-файл.

Error When Loading Operand Text Files. Либо недопустимая длина файла, либо файл пуст, либо файл не найден. Проверьте наличие файлов OPERAND.BIT и OPERAND.BYT, они должны находиться в том же каталоге, что исполняемый файл DIS8051.COM.

Еще одна ошибка связана с тем, что под таблицы перекрестных ссылок выделено слишком много памяти (A large amount of memory has been allocated for Cross-reference tables). Если такое маловероятное событие все-таки случится, и произойдет переполнение, то отобразится предупреждающее сообщение, и отдельный список ссылок будет обрезан до своего максимального размера из 32766 ссылок.

[3.0. Формат INTEL HEX]

DATA RECORD (запись с данными программы) ---
        № байта  1                Двоеточие (:), обозначает начало записи.
                 2 & 3            Количество байт данных в этой записи.
                 4 & 5            Адрес загрузки для этой записи, старший байт.
                 6 & 7            Адрес загрузки для этой записи, младший байт.
                 8 & 9            Тип записи, здесь должен быть текст "00".
                 10 .. X          Байты данных в шестнадцатеричной кодировке,
                                  по 2 символа ASCII hex на байт.
                 X+1 & X+2        Контрольная сумма, два символа ASCII hex.
                 X+3 & X+4        CR & LF, (carriage return & line-feed).
 
END RECORD (запись окончания файла) ---
        № байта  1                Двоеточие (:), обозначает начало записи.
                 2 & 3            Длина записи, тут должен быть текст "00".
                 4 to 7           Стартовый адрес, "0000" обозначает запись конца.
                 8 & 9            Тип записи.
                 10 & 11          Контрольная сумма, два символа ASCII hex.
                 12 & 13          CR & LF, (carriage return & line-feed).

Контрольная сумма вычисляется как 8-битная сумма с дополнением до 2 от длины записи, двух байт адреса загрузки, типа записи и всех байт данных. Информацию по формату файлов Intel HEX см. также в [1].

[3.1. Команды 8051 - арифметические операции (ARITHMETIC OPERATIONS)]

Ассемблер Байт/Цикл Флаги,
примечание 
Описание
ADD A,Rn 1/1 AC,CY,OV Добавить значение регистра к Acc
ADD A,direct 2/1 AC,CY,OV Добавить значение прямо адресованной ячейки RAM к Acc
ADD A,@Ri 1/1 AC,CY,OV Добавить значение косвенно адресованной ячейки RAM к Acc
ADD A,#data 2/1 AC,CY,OV Добавить константу к Acc
ADDC A,Rn 1/1 AC,CY,OV Добавить регистр к Acc с учетом переноса
ADDC A,direct 2/1 AC,CY,OV Добавить значение прямо адресованной ячейки RAM к Acc с учетом переноса
ADDC A,@Ri 1/1 AC,CY,OV Добавить значение косвенно адресованной ячейки RAM к Acc с учетом переноса
ADDC A,#data 2/1 AC,CY,OV Добавить константу к Acc с учетом переноса
DA A 1/1 CY,4 Десятичная коррекция Acc
DEC A 1/1 Декремент Acc
DEC Rn 1/1 Декремент регистра
DEC direct 2/1 Декремент прямо адресованной ячейки RAM
DEC @Ri 1/1 Декремент косвенно адресованной ячейки RAM
DIV AB 1/4 CY=0,OV,5 Разделить Acc на значение регистра B (A=A/B)
INC A 1/1 Инкремент Acc
INC Rn 1/1 Инкремент регистра
INC direct 2/1 Инкремент прямо адресованной ячейки RAM
INC @Ri 1/1 Инкремент косвенно адресованной ячейки RAM
INC DPTR 1/2 Инкремент указателя DPTR
MUL AB 1/4 CY=0,OV,7 Умножение Acc на значение регистра B (AB = A*B)
SUBB A,Rn 1/1 AC,CY,OV Вычитание значения регистра из Acc с учетом необходимости заема в CY
SUBB A,direct 2/1 AC,CY,OV Вычитание значения прямо адресованной ячейки RAM из Acc с учетом необходимости заема в CY
SUBB A,@Ri 1/1 AC,CY,OV Вычитание значения косвенно адресованной ячейки RAM из Acc с учетом необходимости заема в CY
SUBB A,#data 2/1 AC,CY,OV Вычитание константы из Acc с учетом необходимости заема в CY

[3.2. Команды 8051 - логические операции (LOGICAL OPERATIONS)]

Ассемблер Байт/Цикл Флаги,
примечание
Описание
ANL A,Rn 1/1 Операция И (AND) над регистром и Acc (результат в Acc)
ANL A,direct 2/1 Операция И (AND) над значением ячейки RAM и Acc (результат в Acc)
ANL A,@Ri 1/1 Операция И (AND) над значением косвенно адресованной ячейки RAM и Acc (результат в Acc)
ANL A,#data 2/1 Операция И (AND) над константой и Acc (результат в Acc)
ANL direct,A 2/1 Операция И (AND) над Acc и значением ячейки RAM (результат в ячейке памяти)
ANL direct,#data 3/2 Операция И (AND) над константой и прямо адресованной ячейкой RAM (результат в ячейке памяти)
CLR A 1/1 Очистка Acc (A=0)
CPL A 1/1 Операция инверсии (complement, дополнение) Acc
ORL A,Rn 1/1 Операция И (OR) над регистром и Acc (результат в Acc)
ORL A,direct 2/1 Операция И (OR) над значением ячейки RAM и Acc (результат в Acc)
ORL A,@Ri 1/1 Операция И (OR) над над значением косвенно адресованной ячейки RAM и Acc (результат в Acc)
ORL A,#data 2/1 Операция И (OR) над над константой и Acc (результат в Acc)
ORL direct,A 2/1 Операция И (OR) над Acc и значением ячейки RAM (результат в ячейке памяти)
ORL direct,#data 3/2 Операция И (OR) над константой и прямо адресованной ячейкой RAM (результат в ячейке памяти)
RL A 1/1 Сдвиг содержимого Acc влево
RLC A 1/1 CY Сдвиг содержимого Acc влево через перенос
RR A 1/1 Сдвиг содержимого Acc вправо
RRC A 1/1 CY Сдвиг содержимого Acc вправо через перенос
SWAP A 1/1 Перестановка местами тетрад (нибблов) в Acc
XRL A,Rn 1/1 Исключающее ИЛИ (Exclusive-OR) над регистром и Acc (результат в Acc)
XRL A,direct 2/1 Исключающее ИЛИ (Exclusive-OR) над значением ячейки RAM и Acc (результат в Acc)
XRL A,@Ri 1/1 Исключающее ИЛИ (Exclusive-OR) над значением косвенно адресованной ячейки RAM и Acc (результат в Acc)
XRL A,#data 2/1 Исключающее ИЛИ (Exclusive-OR) над константой и Acc (результат в Acc)
XRL direct,A 2/1 Исключающее ИЛИ (Exclusive-OR) над Acc и значением ячейки RAM (результат в ячейке памяти)
XRL direct,#data 3/2 Исключающее ИЛИ (Exclusive-OR) над константой и прямо адресованной ячейкой RAM (результат в ячейке памяти)

[3.3. Команды 8051 - перемещения данных (DATA TRANSFER)]

Ассемблер Байт/Цикл Флаги,
примечание
Описание
MOV A,Rn 1/1 Загрузить значение регистра в Acc
MOV A,direct 2/1 Загрузить значение ячейки памяти RAM в Acc
MOV A,@Ri 1/1 Загрузить значение косвенно адресованной ячейки памяти RAM в Acc
MOV A,#data 2/1 Загрузить значение константы в Acc
MOV Rn,A 1/1 Загрузить в регистр значение Acc
MOV Rn,direct 2/2 Загрузить в регистр значение ячейки памяти RAM
MOV Rn,#data 2/1 Загрузить в регистр значение константы
MOV direct,A 2/1 Загрузить в ячейку памяти RAM значение Acc
MOV direct,Rn 2/2 Загрузить в ячейку памяти RAM значение регистра
MOV direct,direct 3/2 Загрузить в ячейку памяти RAM значение другой ячейки RAM
MOV direct,@Ri 2/2 Загрузить в ячейку памяти RAM значение косвенно адресованной ячейки RAM
MOV direct,#data 3/2 Загрузить в ячейку памяти RAM значение константы
MOV @Ri,A 1/1 Загрузить в косвенно адресованную ячейку RAM значение Acc
MOV @Ri,direct 2/2 Загрузить в косвенно адресованную ячейку RAM значение другой прямо адресованной ячейки RAM
MOV @Ri,#data 2/1 Загрузить в косвенно адресованную ячейку RAM значение константы
MOV DPTR,#data16 3/2 Загрузить в указатель DPTR значение 16-битной константы
MOVC A,@A+DPTR 1/2 Загрузить в Acc значение байта кода по адресу в DPTR с индексом в Acc
MOVC A,@A+PC 1/2 Загрузить в Acc значение байта кода по адресу в PC с индексом в Acc
POP direct 2/2 Выбрать значение из стека в ячейку памяти RAM
PUSH direct 2/2 Сохранить в стеке значение ячейки памяти RAM
XCH A,Rn 1/1 Обмен значениями между регистром и Acc
XCH A,direct 2/1 Обмен значениями между ячейкой памяти RAM и Acc
XCH A,@Ri 1/1 Обмен значениями между косвенно адресованной ячейкой памяти RAM и Acc
XCHD A,@Ri 1/1 Обмен значениями младшей тетрады между косвенно адресованной ячейкой памяти RAM и Acc

[3.4. Команды 8051 - операции над битами (BOOLEAN VARIABLE MANIPULATION)]

Ассемблер Байт/Цикл Флаги,
примечание
Описание
ANL C,bit 2/2 CY Логическое И (AND) переноса и бита (результат в CY)
ANL C,/bit 2/2 CY Логическое И (AND) переноса и инверсии бита (результат в CY)
CLR C 1/1 CY Очистка переноса
CLR bit 2/1 Очистка бита
CPL C 1/1 CY Инверсия переноса
CPL bit 2/1 Инверсия бита
JB bit,rel 3/2 Переход, если бит установлен
JNB bit,rel 3/2 Переход, если бит не установлен
JBC bit,rel 3/2 AC,CY,OV,6 Переход, если бит установлен, с очисткой бита
JC rel 2/2 Переход, если перенос установлен
JNC rel 2/2 Переход, если перенос не установлен
MOV C,bit 2/1 CY Загрузить в перенос значение бита
MOV bit,C 2/2 Загрузить в бит значение переноса
ORL C,bit 2/2 CY Логическое ИЛИ (OR) переноса и бита (результат в CY)
ORL C,/bit 2/2 CY Логическое ИЛИ (OR) переноса и инверсии бита (результат в CY)
SETB C 1/1 CY Установка переноса
SETB bit 2/1 Установка бита

[3.5. Команды 8051 - переходы в программе (PROGRAM BRANCHING)]

Ассемблер Байт/Цикл Флаги,
примечание
Описание
ACALL addr 11 2/2 1 Абсолютный вызов подпрограммы, адрес 11-битный.
AJMP addr 11 2/2 2 Абсолютный переход, адрес 11-битный.
CJNE A,direct,rel 3/2 CY,3 Сравнение байта в регистре (Dir) с Acc и переход, если не равно.
CJNE A,#data,rel 3/2 CY,3 Сравнение константы (Immed) с Acc и переход, если не равно.
CJNE Rn,#data,rel 3/2 CY,3 Сравнение константы (Immed) с регистром и переход, если не равно.
CJNE @Ri,#data,rel 3/2 CY,3 Сравнение константы (Immed) с косвенно (Indir) адресованной (через Ri) ячейкой памяти и переход, если не равно.
DJNZ Rn,rel 2/2 Декремент регистра и переход, если не равно.
DJNZ direct,rel 3/2 Декремент Dir байта (ячейка памяти, указанная по адресу) и переход, если не равно.
JMP @A+DPTR 1/2 Непрямой переход (Jump indirect) относительно адреса в DPTR. В Acc содержится индекс адреса перехода.
JNZ rel 2/2 Переход, если Acc не равен 0.
JZ rel 2/2 Переход, если Acc равен 0.
LCALL addr 16 3/2 Дальний вызов подпрограммы, адрес 16-битный.
LJMP addr 16 3/2 Дальний переход, адрес 16-битный.
NOP 1/1 Нет операции (пустая операция).
RET 1/2 Возврат из подпрограммы.
RETI 1/2 Возврат из прерывания.
SJMP rel 2/2 Короткий переход по относительному адресу.

Примечания к таблицам:

1. Начиная с 11H в качестве базового значения для кода операции, результирующий код операции формируется размещением битов 8 .. 10 целевого адреса в биты 5 .. 7 кода операции. Вот 8 возможных значения кода операции (hex): 11, 31, 51, 71, 91, B1, D1, F1.
2. Начиная с 01H в качестве базового значения для кода операции, результирующий код операции формируется размещением битов 8 .. 10 целевого адреса в биты 5 .. 7 кода операции. Вот 8 возможных значения кода операции (hex): 01, 21, 41, 61, 81, A1, C1, E1.
3. Флаг переноса устанавливается, если результат операции меньше, чем исходный операнд, иначе перенос будет очищен.
4. Флаг переноса устанавливается, если BCD результат в Acc больше, чем десятичное число 99.
5. Флаг переполнения устанавливается, если регистр B равен 0 (что сигнализирует о делении на 0). Иначе флаг переполнения очищается.
6. Если в операнде инструкции указан любой флаг условия и этот флаг установлен, то указанный флаг будет очищен инструкцией.
7. Старший байт 16-битного результата будет помещен в регистр B, а младший байт будет помещен в Acc.

Обозначение адресации в таблицах:

addr 11 11-битный адрес назначения. Используется в командах ACALL и AJMP. Ветвление будет происходить в пределах 2K страницы памяти программ (CODE) относительно первого байта следующей инструкции.
addr 16 - 16-битный адрес назначения. Используется в командах LCALL и LJMP. Ветвление может произойти в любое место 64K пространства памяти программ (CODE).
bit прямо адресованный бит во внутренней памяти данных (Internal Data RAM) или в SFR.
direct 8-битный адрес внутренней ячейки памяти данных. Этот адрес может соответствовать либо внутренней RAM (адрес в диапазоне 0 .. 127), либо SFR (адрес в диапазоне 128 .. 255, например порт I/O, регистр управления, регистр статуса и т. п.).
rel 8-битное значение со знаком (дополнение до 2). Используется в командах SJMP и во всех командах условных переходов. Значение может быть в диапазоне -128 .. +127, адрес перехода вычисляется относительно первого байта следующей инструкции.
Rn любой из регистров R0 .. R7 текущего выбранного банка регистров.
@Ri 8-битное содержимое внутренней ячейки памяти RAM (0 .. 255), косвенно адресованной через значение регистра R0 или R1.
#data 8-битная константа, значение которой содержится в коде инструкции.
#data 16 16-битная константа, значение которой содержится в коде инструкции.

[3.6. Карта памяти SFR (SPECIAL FUNCTION REGISTER MAP)]

M: 80= P0         M: A0= P2          M: C0=             M: E0= ACC
M: 81= SP         M: A1=             M: C1=             M: E1= 
M: 82= DPL        M: A2=             M: C2=             M: E2= 
M: 83= DPH        M: A3=             M: C3=             M: E3= 
M: 84=            M: A4=             M: C4=             M: E4= 
M: 85=            M: A5=             M: C5=             M: E5= 
M: 86=            M: A6=             M: C6=             M: E6= 
M: 87= PCON       M: A7=             M: C7=             M: E7= 
M: 88= TCON       M: A8= IE          M: C8= T2CON       M: E8= 
M: 89= TMOD       M: A9=             M: C9=             M: E9= 
M: 8A= TL0        M: AA=             M: CA= RCAP2L      M: EA= 
M: 8B= TL1        M: AB=             M: CB= RCAP2H      M: EB= 
M: 8C= TH0        M: AC=             M: CC= TL2         M: EC= 
M: 8D= TH1        M: AD=             M: CD= TH2         M: ED= 
M: 8E=            M: AE=             M: CE=             M: EE= 
M: 8F=            M: AF=             M: CF=             M: EF= 
M: 90= P1         M: B0= P3          M: D0= PSW         M: F0= B
M: 91=            M: B1=             M: D1=             M: F1= 
M: 92=            M: B2=             M: D2=             M: F2= 
M: 93=            M: B3=             M: D3=             M: F3= 
M: 94=            M: B4=             M: D4=             M: F4= 
M: 95=            M: B5=             M: D5=             M: F5= 
M: 96=            M: B6=             M: D6=             M: F6= 
M: 97=            M: B7=             M: D7=             M: F7= 
M: 98= SCON       M: B8= IP          M: D8=             M: F8= 
M: 99= SBUF       M: B9=             M: D9=             M: F9= 
M: 9A=            M: BA=             M: DA=             M: FA= 
M: 9B=            M: BB=             M: DB=             M: FB= 
M: 9C=            M: BC=             M: DC=             M: FC= 
M: 9D=            M: BD=             M: DD=             M: FD= 
M: 9E=            M: BE=             M: DE=             M: FE= 
M: 9F=            M: BF=             M: DF=             M: FF= 

[3.7. Карта памяти битов в регистрах (BIT ADDRESSABLE REGISTER MAP)]

B: 80= P0.0       B: A0= P2.0        B: C0=             B: E0= ACC.0
B: 81= P0.1       B: A1= P2.1        B: C1=             B: E1= ACC.1
B: 82= P0.2       B: A2= P2.2        B: C2=             B: E2= ACC.2
B: 83= P0.3       B: A3= P2.3        B: C3=             B: E3= ACC.3
B: 84= P0.4       B: A4= P2.4        B: C4=             B: E4= ACC.4
B: 85= P0.5       B: A5= P2.5        B: C5=             B: E5= ACC.5
B: 86= P0.6       B: A6= P2.6        B: C6=             B: E6= ACC.6
B: 87= P0.7       B: A7= P2.7        B: C7=             B: E7= ACC.7
B: 88= IT0        B: A8= EX0         B: C8= T2CP        B: E8= 
B: 89= IE0        B: A9= ET0         B: C9= T2C         B: E9= 
B: 8A= IT1        B: AA= EX1         B: CA= TR2         B: EA= 
B: 8B= IE1        B: AB= ET1         B: CB= EXEN2       B: EB= 
B: 8C= TR0        B: AC= ES          B: CC= TCLK        B: EC= 
B: 8D= TF0        B: AD= ET2         B: CD= RCLK        B: ED= 
B: 8E= TR1        B: AE=             B: CE= EXF2        B: EE= 
B: 8F= TF1        B: AF= EA          B: CF= TF2         B: EF= 
B: 90= P1.0       B: B0= P3.0        B: D0= P           B: F0= B.0
B: 91= P1.1       B: B1= P3.1        B: D1=             B: F1= B.1
B: 92= P1.2       B: B2= P3.2        B: D2= OV          B: F2= B.2
B: 93= P1.3       B: B3= P3.3        B: D3= RS0         B: F3= B.3
B: 94= P1.4       B: B4= P3.4        B: D4= RS1         B: F4= B.4
B: 95= P1.5       B: B5= P3.5        B: D5= F0          B: F5= B.5
B: 96= P1.6       B: B6= P3.6        B: D6= AC          B: F6= B.6
B: 97= P1.7       B: B7= P3.7        B: D7= CY          B: F7= B.7
B: 98= RI         B: B8= PX0         B: D8=             B: F8=      
B: 99= TI         B: B9= PT0         B: D9=             B: F9= 
B: 9A= RB8        B: BA= PX1         B: DA=             B: FA= 
B: 9B= TB8        B: BB= PT1         B: DB=             B: FB= 
B: 9C= REN        B: BC= PS          B: DC=             B: FC= 
B: 9D= SM2        B: BD= PT2         B: DD=             B: FD= 
B: 9E= SM1        B: BE=             B: DE=             B: FE= 
B: 9F= SM0        B: BF=             B: DF=             B: FF= 

[3.8. Биты регистров SFR (SPECIAL FUNCTION REGISTER ASSIGNMENTS)]

Имя    Адрес       Адрес бита                  Описание
рег.   байта 7  6  5  4  3  2  1  0
------------ ------------------------  --------------------------
 
P0     80    87 86 85 84 83 82 81 80   Port 0
             |  |  |  |  |  |  |  +--> P0.0  Port 0 bit 0
             |  |  |  |  |  |  +-----> P0.1  Port 0 bit 1
             |  |  |  |  |  +--------> P0.2  Port 0 bit 2
             |  |  |  |  +-----------> P0.3  Port 0 bit 3
             |  |  |  +--------------> P0.4  Port 0 bit 4
             |  |  +-----------------> P0.5  Port 0 bit 5
             |  +--------------------> P0.6  Port 0 bit 6
             +-----------------------> P0.7  Port 0 bit 7
 
SP     81    -  -  -  -  -  -  -  -    Stack Pointer (указатель стека)
 
DPL    82    -  -  -  -  -  -  -  -    Младший байт указателя данных (DPTR)
 
DPH    83    -  -  -  -  -  -  -  -    Старший байт указателя данных (DPTR)
 
PCON   87    -  -  -  -  -  -  -  -    Регистр управления питанием
             |  |  |  |  |  |  |  |     (Power Control register)
             |  |  |  |  |  |  |  +--> IDL   Бит режима ожидания (Idle mode bit)
             |  |  |  |  |  |  +-----> PD    Бит выключения питания (Power down bit)
             |  |  |  |  |  +--------> GF0   Флаг общего назначения (General Purpose flag)
             |  |  |  |  +-----------> GF1   Флаг общего назначения (General Purpose flag)
             |  |  |  +-------------->
             |  |  +----------------->
             |  +-------------------->
             +-----------------------> SMOD  Бит удвоенной скорости передачи
                                             (Double Baud Rate bit)
 
TCON   88    8F 8E 8D 8C 8B 8A 89 88   Управление таймерами / счетчиками
             |  |  |  |  |  |  |  +--> IT0   INT0 управление срезом
             |  |  |  |  |  |  +-----> IE0   INT0 флаг детектирования среза
             |  |  |  |  |  +--------> IT1   INT1 управление срезом
             |  |  |  |  +-----------> IE1   INT1 флаг детектирования среза
             |  |  |  +--------------> TR0   Timer 0 управление счетом (start/stop)
             |  |  +-----------------> TF0   Timer 0 флаг переполнения
             |  +--------------------> TR1   Timer 1 управление счетом (start/stop)
             +-----------------------> TF1   Timer 1 флаг переполнения
 
TMOD   89    -  -  -  -  -  -  -  -    Управление режимами таймеров / счетчиков
             |  |  |  |  |  |  |  +--> M0    Режим работы таймера 0
             |  |  |  |  |  |  +-----> M1    Режим работы таймера 0
             |  |  |  |  |  +--------> C/T   Выбор режима: счетчик 0 или таймер 0
             |  |  |  |  +-----------> GATE  Затвор таймера 0
             |  |  |  +--------------> M0    Режим работы таймера 1
             |  |  +-----------------> M1    Режим работы таймера 1
             |  +--------------------> C/T   Выбор режима: счетчик 1 или таймер 1
             +-----------------------> GATE  Затвор таймера 1
 
TL0    8A    -  -  -  -  -  -  -  -    Timer / Counter 0 low byte
TL1    8B    -  -  -  -  -  -  -  -    Timer / Counter 1 low byte
TH0    8C    -  -  -  -  -  -  -  -    Timer / Counter 0 high byte
TH1    8D    -  -  -  -  -  -  -  -    Timer / Counter 1 high byte
 
P1     90    97 96 95 94 93 92 91 90   Port 1
             |  |  |  |  |  |  |  +--> P1.0  Port 1 bit 0
             |  |  |  |  |  |  +-----> P1.1  Port 1 bit 1
             |  |  |  |  |  +--------> P1.2  Port 1 bit 2
             |  |  |  |  +-----------> P1.3  Port 1 bit 3
             |  |  |  +--------------> P1.4  Port 1 bit 4
             |  |  +-----------------> P1.5  Port 1 bit 5
             |  +--------------------> P1.6  Port 1 bit 6
             +-----------------------> P1.7  Port 1 bit 7
 
SCON   98    9F 9E 9D 9C 9B 9A 99 98   Управление последовательным портом (UART, RS-232)
             |  |  |  |  |  |  |  +--> RI    Флаг прерывания приемника
             |  |  |  |  |  |  +-----> TI    Флаг прерывания передатчика
             |  |  |  |  |  +--------> RB8   9-й бит приема, стоп-бит
             |  |  |  |  +-----------> TB8   9-й бит передачи
             |  |  |  +--------------> REN   Разрешение работы приемника
             |  |  +-----------------> SM2   Выбор режима работы последовательного порта
             |  +--------------------> SM1   Выбор режима работы последовательного порта
             +-----------------------> SM0   Выбор режима работы последовательного порта
 
SBUF   99    -  -  -  -  -  -  -  -    Буфер данных последовательного порта
 
P2     A0    A7 A6 A5 A4 A3 A2 A1 A0   Port 2
             |  |  |  |  |  |  |  +--> P2.0  Port 2 bit 0
             |  |  |  |  |  |  +-----> P2.1  Port 2 bit 1
             |  |  |  |  |  +--------> P2.2  Port 2 bit 2
             |  |  |  |  +-----------> P2.3  Port 2 bit 3
             |  |  |  +--------------> P2.4  Port 2 bit 4
             |  |  +-----------------> P2.5  Port 2 bit 5
             |  +--------------------> P2.6  Port 2 bit 6
             +-----------------------> P2.7  Port 2 bit 7
 
IE     A8    AF AE AD AC AB AA A9 A8   Регистр разрешения прерываний
             |  |  |  |  |  |  |  +--> EX0   Разрешение прерывания INT0
             |  |  |  |  |  |  +-----> ET0   Разрешение прерывания от переполнения таймера 0
             |  |  |  |  |  +--------> EX1   Разрешение прерывания INT1
             |  |  |  |  +-----------> ET1   Разрешение прерывания от переполнения таймера 1
             |  |  |  +--------------> ES    Разрешение прерывания последовательного порта
             |  |  +-----------------> ET2   Разрешение прерывания от переполнения таймера 2
             |  |                             или захвата
             |  +-------------------->                              
             +-----------------------> EA    Разрешить все прерывания
 
P3     B0    B7 B6 B5 B4 B3 B2 B1 B0   Port 3
             |  |  |  |  |  |  |  +--> P3.0  Port 3 bit 0
             |  |  |  |  |  |  +-----> P3.1  Port 3 bit 1
             |  |  |  |  |  +--------> P3.2  Port 3 bit 2
             |  |  |  |  +-----------> P3.3  Port 3 bit 3
             |  |  |  +--------------> P3.4  Port 3 bit 4
             |  |  +-----------------> P3.5  Port 3 bit 5
             |  +--------------------> P3.6  Port 3 bit 6
             +-----------------------> P3.7  Port 3 bit 7
 
IP     B8    BF BE BD BC BB BA B9 B8   Управление приоритетами прерываний
             |  |  |  |  |  |  |  +--> PX0   Приоритет INT0
             |  |  |  |  |  |  +-----> PT0   Приоритет таймера 0
             |  |  |  |  |  +--------> PX1   Приоритет INT1
             |  |  |  |  +-----------> PT1   Приоритет таймера 1
             |  |  |  +--------------> PS    Приоритет последовательного порта
             |  |  +-----------------> PT2   Приоритет таймера 2
             |  +-------------------->                     
             +----------------------->                      
 
T2CON  C8    CF CE CD CC CB CA C9 C8   Управление таймером / счетчиком 2
             |  |  |  |  |  |  |  +--> T2CP  флаг захвата / перезагрузки счетчика
             |  |  |  |  |  |  +-----> T2C   выбор внутренний / внешний
             |  |  |  |  |  +--------> TR2   Timer 2 управление счетом (start/stop)
             |  |  |  |  +-----------> EXEN2 Timer 2 разрешение внешнего входа
             |  |  |  +--------------> TCLK  Флаг тактов передачи
             |  |  +-----------------> RCLK  Флаг тактов приема
             |  +--------------------> EXF2  Timer 2 внешний флаг
             +-----------------------> TF2   Timer 2 флаг переполнения
 
RCAP2L CA    -  -  -  -  -  -  -  -    T/C 2 регистр захвата, младший байт
 
RCAP2H CB    -  -  -  -  -  -  -  -    T/C 2 регистр захвата, старший байт
 
TL2    CC    -  -  -  -  -  -  -  -    таймер / счетчик 2, младший байт
 
TH2    CD    -  -  -  -  -  -  -  -    таймер / счетчик 2, старший байт
 
PSW    D0    D7 D6 D5 D4 D3 D2 D1 D0   Слово статуса программы (Program Status Word)
             |  |  |  |  |  |  |  +--> P     флаг четности Acc
             |  |  |  |  |  |  +-----> --    Флаг пользователя
             |  |  |  |  |  +--------> OV    Флаг переполнения
             |  |  |  |  +-----------> RS0   Выбор банка регистров 0
             |  |  |  +--------------> RS1   Выбор банка регистров 1
             |  |  +-----------------> F0    Флаг общего назначения 0
             |  +--------------------> AC    Флаг дополнительного переноса
             +-----------------------> CY    Флаг переноса
 
ACC    E0    E7 E6 E5 E4 E3 E2 E1 E0   Acc, аккумулятор
             |  |  |  |  |  |  |  +--> ACC.0
             |  |  |  |  |  |  +-----> ACC.1
             |  |  |  |  |  +--------> ACC.2
             |  |  |  |  +-----------> ACC.3
             |  |  |  +--------------> ACC.4
             |  |  +-----------------> ACC.5
             |  +--------------------> ACC.6
             +-----------------------> ACC.7
 
B      F0    F7 F6 F5 F4 F3 F2 F1 F0   Регистр B
             |  |  |  |  |  |  |  +--> B.0
             |  |  |  |  |  |  +-----> B.1
             |  |  |  |  |  +--------> B.2
             |  |  |  |  +-----------> B.3
             |  |  |  +--------------> B.4
             |  |  +-----------------> B.5
             |  +--------------------> B.6
             +-----------------------> B.7

[3.10. Векторы и приоритеты прерываний (INTERRUPT VECTORS & PRIORITY LEVELS)]

Событие Вектор Уровень приоритета
Сброс (Reset) 0000
Внешнее прерывание INT0 0003 Самый высокий приоритет
Counter / Timer 0 000B
Внешнее прерывание INT1 0013
Counter / Timer 1 001B
Прерывание UART 0023
Timer 2 & и внешнее прерывание External 2 002B Самый низкий приоритет

[3.11. Карта памяти ОЗУ пользователя (USER RAM MEMORY MAP)]

Адрес               Адрес бита                    
байта      7   6   5   4   3   2   1   0          Описание
-------- ---------------------------------  ---------------------------
30 -> 7F   -   -   -   -   -   -   -   -    80 байт пользовательской памяти RAM      
 
2F         7F  7E  7D  7C  7B  7A  79  78   Ячейка RAM с адресуемыми битами
2E         77  76  75  74  73  72  71  70   Ячейка RAM с адресуемыми битами
2D         6F  6E  6D  6C  6B  6A  69  68   Ячейка RAM с адресуемыми битами
2C         67  66  65  64  63  62  61  60   Ячейка RAM с адресуемыми битами
2B         5F  5E  5D  5C  5B  5A  59  58   Ячейка RAM с адресуемыми битами
2A         57  56  55  54  53  52  51  50   Ячейка RAM с адресуемыми битами
29         4F  4E  4D  4C  4B  4A  49  48   Ячейка RAM с адресуемыми битами
28         47  46  45  44  43  42  41  40   Ячейка RAM с адресуемыми битами
27         3F  3E  3D  3C  3B  3A  39  38   Ячейка RAM с адресуемыми битами
26         37  36  35  34  33  32  31  30   Ячейка RAM с адресуемыми битами
25         2F  2E  2D  2C  2B  2A  29  28   Ячейка RAM с адресуемыми битами
24         27  26  25  24  23  22  21  20   Ячейка RAM с адресуемыми битами
23         1F  1E  1D  1C  1B  1A  19  18   Ячейка RAM с адресуемыми битами
22         17  16  15  14  13  12  11  10   Ячейка RAM с адресуемыми битами
21         0F  0E  0D  0C  0B  0A  09  08   Ячейка RAM с адресуемыми битами
20         07  06  05  04  03  02  01  00   Ячейка RAM с адресуемыми битами
 
18 -> 1F   -   -   -   -   -   -   -   -    Регистровый банк 3 (R0 .. R7)
10 -> 17   -   -   -   -   -   -   -   -    Регистровый банк 2 (R0 .. R7)
08 -> 0F   -   -   -   -   -   -   -   -    Регистровый банк 1 (R0 .. R7)
00 -> 07   -   -   -   -   -   -   -   -    Регистровый банк 0 (R0 .. R7)

[Словарик]

Acc, A сокращение от accumulator (применяется в таблицах команд 8051). Это специальный регистр 8051, с содержимым которого производятся все основные операции ассемблера.

BIN binary - в контексте этого руководства двоичный файл программы firmware, который без каких-либо изменений прошивается в адресной пространство программ CODE микроконтроллера 8051.

cross-reference list список перекрестных ссылок. В этом списке нет ничего загадочного. Каждая строка такого списка содержит значение чего-нибудь (значение метки, значение адреса байта, значение адреса бита, значение байта) вместе с обозначением места, где это значение упоминалось в коде программы. Например, строка "; L2C17= 1EE4 1F05 1F23" означает, что метка встречалась в коде программы по адресам 1EE4h, 1F05h, и 1F23h. Список перекрестных ссылок позволяет проще ориентироваться в коде программы.

CY сокращение от Carry (применяется в таблицах команд 8051).

Dir сокращение от direct (применяется в таблицах команд 8051), обозначает прямую адресацию байта по адресу регистра.

Immed сокращение от immediate (применяется в таблицах команд 8051), что означает непосредственную адресацию значения байта. Значение прямо указано в коде команды.

Indir сокращение от indirect, что означает косвенную адресацию значения байта (применяется в таблицах команд 8051). Адрес значения содержится в в индексном регистре Ri.

HEX hexadecimal - в контексте этого руководства файл программы firmware в формате Intel HEX. Это специальный текстовый формат, где каждый байт firmware закодирован в текстовом шестнадцатеричном виде, а также присутствуют абсолютные адреса размещения байтов кода, и имеются контрольные суммы. Подробнее см. [1]. Между форматом BIN и HEX имеется полное соответствие, т. е. из HEX можно получить BIN и наоборот (для этого есть специальные программы типа bin2hex.exe и hex2bin.exe [2]). В HEX-файле некоторые области кода могут отсутствовать, если они не нужны. Тогда в памяти программ CODE эти области обычно заполняются ничего не значащим байтом 0x00 или 0xFF.

PC сокращение от Program Counter - специальный 16-битный регистр 8051, в котором хранится адрес текущей исполняемой инструкции программы.

rel сокращение от relative (применяется в таблицах команд 8051), что обозначает адрес перехода относительно текущего адреса.

SFR Special Function Registers - регистры специального назначения, которые находятся в адресном пространстве DATA, в адресах выше 0x7F. Обычно это регистры таймеров, порта UART и другие специальные регистры 8051.

Дизассемблирование процесс перевода двоичного кода программы (firmware) в файл исходного кода на языке ассемблера (в нашем случае это микроконтроллер 8051). Двоичный код обычно бывает в формате BIN или HEX.

[Ссылки]

1. Формат Intel HEX site:ru.wikipedia.org.
2. 130528mcs-51-tools.zip - основные утилиты для работы с кодом MCS-51 (дизассемблер DIS8051, ассемблер MCS-51 IAR ver. 4.05, утилиты bin2hex и hex2bin, документация), пароль на архив mcs51tools.

 

Комментарии  

 
0 #1 Александр 06.10.2022 12:24
Спасибо тебе, добрый человек.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page