Здесь и далее перевод документации на бесплатный дизассемблер 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. |
Комментарии
RSS лента комментариев этой записи