ORG 100H
BEGIN: JMP SHORT MAIN
MULTCND DW 3206H;Элементы данных
DW 2521H
MULTPLR DW 6400H
DW 0A26H
PRODUCT DW 0
DW 0
DW 0
DW 0
MAIN PROC NEAR;Основная процедура
Call E10XMUL;Вызвать 1-е умножение
Call Z10ZERO;Очистить произведение
Call F10XMUL;Вызвать 2-е умножение
Ret
MAIN Endp
; Умножение двойного слова на слово:
E10XMUL PROC
Mov AX,MULTCND+2;Умножить правое слова
Mul MULTPLR; множимого
Mov PRODUCT+4,AX;Записать произведение
Mov PRODUCT+2,DX
Mov AX,MULTCND;Умножить левое слово
Mul MULTPLR;множимого
Add PRODUCT+2,AX;Сложить с полученным ранее
Adc PRODUCT,DX
Ret
E10XMUL Endp
; Перемножение двух двойных слов:
F10XMUL PROC
Mov AX,MULTCND+2;Слово-2 множимого
Mul MULTPLR+2;* слово-2 множителя
Mov PRODUCT+6,AX;Сохранить результат
Mov PRODUCT+4,DX
Mov AX,MULTCND+2;Слово-2 множимого
Mul MULTPLR; * слово-1 множителя
Add PRODUCT+4,AX;Сложить с предыдущим
Adc PRODUCT+6,DX
Adc PRODUCT,00;Прибавить перенос
Mov AX,MULTCND;Слово-1 множимого
Mul MULTPLR+2; * слово-2 множителя
Add PRODUCT+4,AX;Сложить с предыдущим
Adc PRODUCT+6,DX
Adc PRODUCT,00;Прибавить перенос
Mov AX,MULTCND;Слово-1 множимого
Mul MULTPLR; * слово-1 множителя
Add PRODUCT+2,AX;Сложить с предыдущим
Adc PRODUCT,DX
Ret
F10XMUL Endp
; Очистка области результата:
Z10XMUL PROC
Mov PRODUCT,0000
Mov PRODUCT+2,0000
Mov PRODUCT+4,0000
Mov PRODUCT+6,0000
Ret
Z10XMUL Endp
CODESG Ends
end BEGIN
5.2 Сложение чисел в ASCII-формате.
TITLE ASCADD (COM) Сложение чисел в ASCII-формате
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
Org 100H
BEGIN: Jmp SHORT MAIN
ASC1 DB '578';Элементы данных
ASC2 DB '694'
ASC3 DB '0000'
MAIN PROC NEAR
Clc
Lea si,aasc1+2;Адреса ASCII-чисел
Lea di,aasc2+2
Lea bx,aasc1+3
Mov CX,03;Выполнить 3 цикла
A20:
Mov ah,00;Очистить регистр AH
Mov al,[si];Загрузить ASCII-байт
Adc al,[di];Сложение (с переносом)
Aaa;Коррекция для ASCII
Mov [bx],al;Сохранение суммы
Dec si
Dec di
Dec bx
Loop a20;Циклиться 3 раза
Mov [bx],ah;Сохранить перенос
Ret
MAIN Endp
CODESG Ends
End BEGIN
5.3 Многословное сложение
Максимально возможное значение знакового числа в регистрах процессора равное + 32767 и -32768, ограничивает возможности компьютера при выполнении арифметических операций. Потому арифметические операции сложения двухсловных и более чисел выполняют с помощью небольших процедур, которые обеспечивают сначала сложение крайних правых слов с сохранением результата в переменной. А затем складывают левые слова и суммируют результат с переменной, использую команду ADC, так как сумма может превышать емкость шестнадцатиразрядных регистров процессора.
Пример сложения двойных слов:
.Model small
.stack
.data
SDD1 dd 56745890
SDD2 dd 63247659
REZ1 dd (?)
REZ2 dd (?)
.code
beg: Mov ax,@data; Пересылка начального адреса сегмента данных в АХ.
Mov ds,ax; Инициализация сегментного регистра DS.
Call M1; Вызов процедуры сложения двойных слов.
Call M2; Вызов процедуры сложения чисел любой длины.
Jmp M3; Переход на команды выхода из программы.
M1: PROC
Mov ax,word ptr sdd1; Пересылка в АХ правой части 1-го слагаемого.
Add ax,word ptr sdd2; Сложение с правой частью 2-го слагаемого.
Mov word ptr rez1,ax; Пересылка суммы в память.
Mov ax,[sdd1+2]; Пересылка в АХ левой части 1-го слагаемого.
Adc ax,[sdd2+2]; Сложение с левой частью 2-го слагаемого и
содержимым регистра CF.
Mov word ptr [rez1 + 2],ax; Пересылка суммы в память.
Ret; Выход из процедуры.
M1 Endp; Конец процедуры.
M2: PROC
Clc
Mov cx,2
Lea si,word ptr sdd1
Lea di, word ptr sdd2
Lea bx,word ptr rez1
E2: Mov ax,[si]
Adc ax,[di]
Mov [bx],ax
Dec si
Dec si
Dec di
Dec di
Dec bx
Dec bx
Loop E2
Ret
M3: Mov ax,4c00h
Int 21h
End beg
5. 4 Пример использования команды XLAT
5. 4. 1 Преобразование шестнадцатиричной цифры в ASCII код.
Hex ascii - имя подпрограммы получения символьного представления четырехбитового числа. На входе в подпрограмму: исходное число должно находится в младшей половине регистра AL, адрес строки, куда надо поместить результат, находится в регистрах DS:SI. На выходе из подпрограммы: ASCII представление полученного числа в памяти по адресу находящемуся в DS:SI. Исходное содержимое регистра AL разрушается.
.model small;
.stack 300h;
.data
tblhex db ‘0123456789ABCDEF’;
result db ‘*h’,10, 13, ‘$’;
.code;
start: Mov AX,@data;
Mov DS,AX;
……
Mov AL,15;
Lea SI,result;
Call hex asii;
Mov AH,09H;
Lea DX,result;
Int 21H;
Hex ascii proc
Push BX;
Lea BX,tablhex;
Xlat;
Mov [SI],AL;
Pop BX;
Ret;
Hex ascii endp;
…….
……
Mov AX,4C00H;
Int 21H;
End start;
Комментарии к программе.
Пусть исходное число, находится в регистре AL. Для преобразования этого числа в код ASCII, используем команду табличной трансляции XLAT, которая позволяет осуществить выборку байта из таблицы по его индексу. Перед исполнением этой команды в регистрах DS:BX должен находится полный адрес таблицы трансляции, а в регистре AL - смещение в таблице к выбираемому байту, т.е. его индекс. Процедура Hex ascii может быть вызвана из любого места в программе. Поэтому, для того чтобы она не нарушала основную программу, первая команда процедуры сохраняет в стэке регистр BX, который затем настраивается на смещение таблицы трансляции. В регистре AL уже находится преобразуемое число, которое, согласно построению таблицы tblhex, является индексом требуемого символа можно выполнять команду xlat. Результат преобразования из регистра AL отправляется в ячейку памяти, по адресу, находящемуся в регистре SI.
6. Сообщения об ошибках MASM
В этом приложении перечисляются и поясняются сообщения, воспроизводимые MASM, при обнаружении наиболее распространенных ошибок, возникающих при ассемблировании программ.
По окончании обработки воспроизводится сообщение о завершении ассемблирования, и указывается число свободных байт символьного пространства, ошибки и предупреждающие сообщения, обнаруженные в процессе ассемблирования. Если была использована опция IV, то выводится также число исходных строк, общее число строк и число символьных имен.
Пример:
110 Sourse Lines (исходных строк)
145Total Lines (Всего строк)
21 Symbols (символьных имен)
25684 Bytes Symbol space free (байт свободного символьного пространства)
0 Warning Errors (возможных ошибок)
0 Severe Errors (критических ошибок)
Сообщения MASM, об ошибках обнаруженных во время трансляции приведены в порядке их номеров с короткими пояснениями в таблице 6.1.
Таблица 6.1 Сообщения MASM с пояснениями
Код | Сообщение | Пояснение |
Extra characters on line Лишние символы в строке | В командной строке получена достаточная для определения управляющей директивы информация, но в нее уже введены избыточные символы | |
Unknouwn symbol type Неизвестный символьный тип | MASM не смог распознать типоразмер, указанный в метке или внешней декларации | |
Redefinition of symbols Переопределение символьного имени | Если какое-то символьное имя определено в двух местах, то эта ошибка будет обнаружена на первом проходе, при повторном объявлении данного имени. | |
Symbol is multi-defined Многократно определенное символьное имя | Если какое-то символьное имя определено в двух местах, то эта ошибка будет фиксироваться на втором проходе при каждом объявлении данного символьного имени. (см. ошибки 4 и 26) | |
Syntax error Синтаксическая ошибка | Синтаксис конкретного оператора не совпадает ни с одной из распознаваемых синтаксических конструкций. | |
Type illegal in context Недопустимый в контексте тип | Недопустимая размерность конкретного заданного типа | |
Must be declared in pass 1 Должно быть объявление на первом проходе | Существует ссылка на тот или иной компонент до его определения на первом проходе. К примеру: выражение вида IF DEBUG недопустимо, если символьное имя DEBUG не определено | |
Symbol type usage illegal Неправильное использование символьного типа | Неправильное использование символьного наименования PUBLIC | |
Symbol is reserved word В качестве символьного имени использовано зарезервированное слово | Попытка недопустимого использования зарезервированного слова ассемблера. К примеру, объявление переменной с именем MOV. | |
Forward reference is illegal Ссылка вперед недопустима | Попытка ссылки на некий компонент до его определения в первом проходе. | |
Must be register Должен быть указан регистр | Пользователь указал в качестве операнда символьное имя вместо регистра. | |
Wrong type of register Неправильный тип регистра | В директиве или инструкции указан тип регистра, отличный от требуемого. Например: INC CS, поскольку нельзя выполнить увеличение значения кодового сегмента. | |
Must be segment of group Должен быть сегмент или группа | Вместо требуемого сегмента или группы было указано нечто другое. | |
Symbol has no segment Символьное имя без сегмента | Попытка использования символьного имени с SEG, тогда как символьному имени сегмент не отводится. | |
Must be symbol type Должен быть символьный тип | Вместо одного из типов WORD, DW, QW, BYTE, и т.п. получено какое-то другое значение. | |
Already defined locally Уже дано локальное определение | Попытка определить EXTERN как какое-то символьное имя, ранее уже определенное как локальное. | |
Segment parameters are changed Изменены параметры сегмента | Список аргументов для SEGMENT отличается от того, который был при первом использовании сегмента. | |
Non proper align/ combine type Несоответствующий счетный / комбинаторный тип | Некорректные параметры SEGMENT. Следует проверить используемые счетный и комбинаторный типы, чтобы убедиться в том, что введены правильные типы. | |
Reference to multi defined Ссылка на множествен-ное определение | Инструкция ссылается на неоднократно определенное символьное имя (см ошибки с № 4 и 5) | |
Operand was expected Должен быть операнд | Ассемблер обнаружил оператор вместо требуемого операнда | |
Operator was expected Должен быть оператор | Ассемблер обнаружил операнд вместо требуемого оператора | |
Division by 0 or overflow Деление на ноль или переполнение | Приведенное выражение дает деление на 0 или слишком большое число, не имеющее представления | |
Shift count is negative Отрицательный сдвиговый счет | Образовано выражение для сдвига. Дающее его отрицательное значение | |
Operand types must match Типы операндов должны соответствовать | Ассемблер обнаружил разные виды или размерности аргументов в той ситуации, в которой предполагается их соответствие. К примеру, оператор типа mov ax,bh является недопустимым; в качестве обоих операндов должны использоваться либо слова, либо байты. | |
Illegal use of external Недопустимое использование внешнего компонента | Недопустимое использование внешнего определения. | |
Must be record field name Должно быть имя поля записи | Вместо наименования поля записи получено нечто иное | |
Must be record or field name Должно быть имя записи или поля | Вместо наименования поля или записи принято нечто иное. | |
Operand must have size Операнд должен иметь размерность | Операнд должен обладать размерностью, но она не указана. Часто эту ошибку можно исправить, использовав оператор PTR для указания типоразмера. | |
Must be var, label or constant Должна быть переменная, метка или константа | Должна быть переменная, метка или константа, но вместо этого получено что-то другое. | |
Must be structure field name Должно быть имя поля структуры | Вместо имени поля структуры получено что-то другое. | |
Left operand must have segment В левом операнде должен быть указан сегмент | Операнд требует указания сегмента. К примеру, выражение вида:symbol недопустимо, вместо этого должно быть seg:symbol. | |
One operand must be const Один операнд должен быть константой | Случай недопустимого использования оператора сложения. | |
Operand must be same or 1 abs Операнды должны быть одного типа или 1 абс | Недопустимое использование оператора вычитания. | |
Normal type operand expected Должен быть операнд нормального типа | Получены STRUCT, WORD, BYTE или другой недопустимый операнд вместо требуемой метки переменной. | |
Constant was expected Должна быть константа | Должна быть константа, но вместо нее имя переменной. | |
Operand must have segment Операнд должен иметь сегмент | Недопустимое использование директивы SEG. | |
Must be associated with data Должен быть компонент данных | Использование кодового компонента в том месте, где требуется компонент данных | |
Must be associated with code Должен быть компонент данных | Использование компонента данных в том месте где требуется компонент кода. | |
Already have base register Базовый регистр уже есть | В операнде использовано более одного базового регистра. Например: mov ax,[bx+bp] | |
Already have index register Индексный регистр уже есть | В операнде использовано более одного индексного регистра. Например: mov ax,[si+di] | |
Must be index or base register Должен быть индексный или базовый регистр | В инструкции должен быть задан индексный или базовый регистр, тогда как в квадратных скобках уже указан какой-то другой регистр. Например: mov ax, [bx+ax] | |
Illegal use of register Неправильное использование регистра | Использование какого-либо регистра в инструкции, не предусматривающей такое применение регистра или когда невозможно применение никакого регистра. | |
Value is out of range Значение вне диапазона | Значение превышает возможное для ячейки или регистра.. Например: mov al,5000 недопустимо. | |
Operand not in IP segment Операнд не в сегменте IP | Доступ к операнду невозможен, поскольку он находится вне текущего по IP сегмента | |
Improper operand type Неподходящий тип операнда | Способ использования некоторого операнда препятствует формированию операционного кода | |
Relative jump out of range Относительный переход вне диапазона | Условные переходы должны совершаться в пределах от –128 до +127 байтов относительно текущей инструкции, но какой-то отдельный переход оказался вне этого диапазона. | |
Index displ. Must be constant Индексное смещение должно быть постоянным | Недопустимое использование индексного смещения. | |
Illegal register value Недопустимое значение регистра | Указанное регистровое значение не укладывается в поле ‘reg’ (данное значение превышает 7) | |
No immediate mode Непосредственный режим недопустим | Непосредственные данные подставлены в качестве операнда для инструкции, которая не может использовать такие данные. | |
Byte register is illegal Недопустим байтовый регистр | Использование одного из байтовых регистров в непредусмотренном для этого контексте. К примеру недопустим оператор вида PUSH AL; следует употребить вместо этого PUSH AX. | |
CS register illegal usage Недопустимое использование | Попытка непредусмотренного использования регистра CS. Например, недопустимо выражение XCHG CS,AX | |
Must be AX or AL Должен быть указан АХ или АL | Спецификация некоторого регистра, иного, чем AX и AL, в такой ситуации, когда могут быть использованы только они. Например, инструкция IN требует указания в качестве её операнда регистры AX или AL | |
Improper use of segment reg. Неправильно использован сегментный регистр | Спецификация сегментного регистра в том месте, где он не может быть использован. Например, непосредственное перемещение в сегментный регистр. | |
No or unreachable CS Отсутствует или недоступен CS | Попытка перехода к недоступной метке. | |
Operand combination illegal Недопустимая комбинация операндов | Спецификация инструкции, включающей два операнда, с недопустимым в конкретном случае способом их взаимодействия. | |
Near JMP/CALL to different CS Ближние JMP/CALL к разным CS | Попытка выполнения NEAR <ближнего> перехода или обращения к ячейке в кодовом сегменте, определенном другим выражением ASSUME:CS | |
Label can’t have seg. Override Для метки невозможно переопределение сегмента | Недопустимое переопределение сегмента | |
Must have upcode after prefix После префикса должен стоять операционный код | Использование инструкции REPE, REPNE, REPZ или REPZN без указания после нее какого-либо операционного кода. | |
Can’t override ES segment Невозможно переопределение сегмента ES | Попытка переопределения сегмента ES в инструкции, которая не допускает такого переопределения. Например: недопустим оператор вида STOC DS:TARGET | |
Can’t reach with segment reg. Нет доступа через сегментный регистр | Данная переменная не входит ни в одну директиву типа ASSUME, обеспечивающую её доступность. | |
Must be in segment block Выход из сегментного блока | Попытка генерации кода вне сегмента | |
Can’t use EVEN on BYTE segment EVEN на сегменте типа BYTE не используется | Была использована директива EVEN, тогда как задействованный сегмент объявлен байтовым | |
Illegal value for DUP count Недопустимое значение для счета DUP | Счет DUP должен выражаться константой в виде положительного целого числа (больше нуля) | |
Symbol already external Символьное имя уже объявлено внешним | Попытка определения локальным некоторого символьного имени, которое уже объявлено внешним | |
DUP is too large for linker Значение DUP превы-шает возможности компоновщика | Организовано такое вложение операторов DUP, которое образовало слишком большую запись | |
Usage of? (intermediate) bad Неправильное (неопределенное) использование | Неправильное использование неопределенного операнда (?). Например, нельзя записать? +5 | |
Override with DUP is illegal Переопределение с DUP недопустимо | Попытка использования DUP при переопределении в операторе инициализации STRUC | |
Field cannot be overriden Поле не может быть переопределено | Попытка задания значения для какого-то поля в операторе инициализации STRUC, которое не может быть переопределено. | |
Override is wrong type Неправильный тип переопределения | Попытка использования неправильной размерности при переопределении в операторе инициализации STRUC. | |
Register can’t be forward ref Недопустима ссылка вперед на регистр | Имела место попытка ссылки вперед на сегмент | |
Circular chain of EQU aliases Цикличность в EQU | Оказалось, что EQU указывает сам на себя | |
8087 opcode can’t be emulated Невозможна эмуляция операционного кода 8087 | Текущий операционный код 8087 или операнды, которые с ним используются, образуют инструкцию, которую эмулятор не поддерживает | |
End of file, no END directive Конец файла без директивы END | Нет оператора окончания или допущена ошибка вложения. | |
Data emitted with no segment Данные формируются вне сегмента | Попытка генерации данных кодом, расположенным вне сегмента |
7 Сообщения об ошибках LINK.
В этой главе приводятся сообщения об ошибках, которые могут произойти при компоновке программ с помощью объектного компоновщика Microsoft - LINK.
Таблица 7.1 Сообщения компоновщика с пояснениями
Сообщения | Пояснения |
Cannot find library: имя_файла.lib. Enter new file spec:. Не найдена библиотека имя_файла.lib. Ввести новую спецификацию файла: | Компоновщик не может найти файл “имя_файла”.lib. Пользователь должен ответить на выданный ему запрос, задав новое имя файла, новую спецификацию пути или то и другое. |
Warning: no stack is segment Предупреждение: нет стекового сегмента | Программа пользователя не содержит стекового сегмента, который специфицирован с комбинаторным типом, специфицированным как stack. |
Cannot open response file Невозможно открыть объектный файл | LINK не может найти объектный файл, указанный пользователем. Обычно это происходит при ошибке ввода с клавиатуры. |
Cannot nest response file Вложение ответного файла невозможно | Пользователь указал в объектном файле другой объектный файл |
Cannot open run file Невозможно открыть рабочий файл | Диск или корневая система заполнены. Чтобы освободить место, надо удалить или переместить файлы |
Cannot open temporary file Невозможно открыть временный файл | Диск или корневая система заполнены. Чтобы освободить место, надо удалить или переместить файлы |
Common area longer than 65,535K Общая зона превышает 65,535К | В программе пользователя общие переменные занимают более 64К. Эта ошибка не может произойти с объектными файлами, сформированными MASM |
Имя_файла is not a valid library Имя_файла не является правильной библиотекой | Неправильная спецификация некоторого файла как библиотечного. |
Insufficient stack space Недостаточное пространство стека | Не хватает памяти для работы компоновщика |
Invalid object module Неправильный объектный модуль | Один из объектных модулей оказался неправильным. Следует попытаться выполнить повторную компиляцию. |
No object modules specified Не указаны объектные модули | Пользователь не задал компоновщику имен объектных файлов |
Out of space on run file Нет места для рабочего файла | Заполнен диск, на который записывается EXE-файл. Следует освободить необходимое для этого место на диске и повторить попытку. |
Stack size exceeds 65535 bytes Размер стека превышает 65535 байтов | Размер, указанный для стека с применением опции /STACK, превышает 65535 байтов |
8 Краткие сведения об отладчиках программ
Для отладки программ написанных на Ассемблере, обычно используют один из двух отладчиков: DEBUG фирмы BORLAND или Code View фирмы Microsoft. Они обеспечивают интерактивную отладку программ в формате.ЕХЕ- и.СОМ-файлов. Обычно они используется для отладки исполняемых программ, полученных с языка уровня ассемблера. Они позволяют ассемблировать и исполняемые файлы.ЕХЕ и.СОМ, скомпилированные с языков более высокого уровня.
DEBUG и Code View позволяют:
▪ прослеживать выполнение и управлять выполнением программ;
▪ вносить изменения в отлаживаемую программу;
▪ вводить небольшие программы на языке ассемблера, выполнять ассемблирование этих программ и создавать исполняемые программы с расширением.СОМ;
▪ выполнять преобразование машинных шестнадцатеричных кодов команд в формат языка ассемблера (деассемблирование);
▪ отображать текстовые файлы в ASCII и шестнадцатеричном форматах;
▪ просматривать и изменять содержимое регистров памяти МП и ячеек основной памяти;
▪ загружать информацию с дисковых накопителей в основную память, и наоборот (считывать информацию с дисков и записывать на них);
▪ осуществлять поиск конкретных данных в текстах сообщений и программ (с выдачей адреса их хранения);
▪ просматривать регистр флагов с отображением мнемокодов значений этих флагов (таблица 8.1)
Таблица 8.1.Мнемокоды значений флагов
Флаг | Имя флага | Установлен | Сброшен |
OF | Переполнение (да/нет) | OV | NV |
DF | Направление (уменьш./увелич.) | DN | UP |
IF | Прерывания (вкл./откл.) | EI | DI |
SF | Знак (отриц./полож.) | NG | PL |
ZF | Нуль (да/нет) | ZR | NZ |
AF | Вспомогательный перенос (да/нет) | АС | NA |
PF | Четность (четн./нечетн.) | РЕ | PO |
CF | Перенос (да/нет) | SY | NC |
8.1 Основные команды отладчика DEBUG
Для вызова отладчика DEBUG следует набрать debug или DB и, если необходимо, имена файлов, с которыми мы будем работать, например debug prog.exe. Приглашение к вводу команд — -. После завершения работы с DEBUG для выхода из него следует набрать q. После набора каждой команды следует нажимать Enter.
Отладчик DEBUG выполняет команды:
▪ N (name) — объявление имени файла.
▪ R m (register) — отображение на экране дисплея содержимого регистра памяти МП с именем m. Если m не указано, отображается содержимое всех регистров памяти МП, вектор-адрес следующей команды (CS:IP), машинный и мнемокоды этой команды; например:
-R
АХ=0005 ВХ=0005 СХ=0000 DX=0001 SP=FFEE ВР=0000 SI=0000 DI=0000 DS=1A8E ES=1A8E SS=1A8E CS=1A8E IP=010A NV UP EI PL NZ NA PO NC 1A8E:010A B81500 MOV AX,0015;
Если выводится содержимое одного регистра, то команда R позволяет изменить его содержимое:
-R ах
АХ 0005
:45
-R ах
АХ 0045
▪ A n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — начальный вектор-адрес машинных команд.
Пример ввода программы:
-А 100
1А8Е:0100 mov ax,15 1А8Е:0103 mov bx,5 1А8Е:0106 add ax,bx 1А8Е:0108 div bx 1A8E:010A
▪ U nl,n2 L1 (unassembler) — преобразование машинных кодов команд в команды на языке ассемблера и отображение их на экране дисплея, nl — вектор-адрес 1 -и, а п2 — смещение последней из машинных команд, подлежащих деассемблиро-ванию, 1 — длина программы (может указываться либо п2, либо L1). Пример деассемблирования программы:
-U100 1а
1А8Е:0100 В81500 MOV АХ,0015
1A8E:0103 BB0500 MOV BX.0005
А8Е:0106 01D8 ADD AX.BX
1А8Е:0108 F7F3 DIV ВХ
▪ Т k (trassing) — выполнение очередных k команд программы. Если k не указано, то выполняется одна команда (пошаговое выполнение программы). Команды обращения к процедурам и внутренние прерывания командой Т не выполняются, так как по Т будут последовательно выполняться команды процедуры и команды обработки прерывания соответственно. В этих случаях следует использовать команду процедурной трассировки Р (procedure), почти аналогичную команде Т, но позволяющую автоматически полностью выполнять встречающиеся при трассировке процедуры, или команду G п. После выполнения команд (команды) на дисплей выводится:
- содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL выводятся в мнемокоде (см. табл. 9.2);
- вектор-адрес (CS: IP);
- машинный и мнемокоды текущей команды.
▪ G n (go) — выполнение.EXE- или.СОМ-программы до команды с вектор-адресом п, при отсутствии n программа выполняется до конца.
После выполнения команд (команды) на дисплей выводится:
- содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);
- флаги регистра FL в мнемокоде
- вектор-адрес (CS: IP), машинный и мнемокоды текущей команды. После выполнения программы получим:
-G 10а
AX-0005 BX-0005 CX-0000 DX-0001 SP-FFEE BP-0000 SI-0000 DI-0000 DS=1A8E ES=1A8E SS-1A8E CS-1A8E IP-010A NV UP El PL NZ NA PO NC 1A8E:010A 48 DEC AX
▪ D n,s Ll (dump) — отобразить на экране дисплея содержимое ячеек памяти, начиная с ячейки по вектор-адресу n (по умолчанию n — текущий вектор-адрес + 1 и l = 128), то есть, нажав клавиши D и Enter, можно посмотреть следующие 128 ячеек:
-D
1D20:0C00 F7 07 01 00 75 12 2Е С7-06 СВ 98 02 00 ЕВ 09 Е8....и...........
1D20:0C10 96 00 F8 ЕВ 00 F9 ЕВ ОА-50 ВО 03 В4 FF E8 03 00........Р.......
1020:0020 58 F8 СЗ 57 26 8В 7F 04-2Е 89 ЗЕ CF 98 26 88 05 X..W&.....>..&..
1020:0СЗ0 26 88 65 01 50 2Е Al DE-98 26 89 45 02 58 ЗС 01 &.6.Р....&.Е.Х<.
:
1020:0С70 75 ОА 26 89 55 04 26 89-40 06 ЕВ 5А ЗС 02 75 06 &
- если S и L1 не указаны (есть только D n), то осуществляется вывод 128 ячеек памяти, например:
-D 405
1А8Е:0400 69 6С 65-66 69 6С 65 66 69 6С 65 llefileflle 1А8Е:0410 66 69 6С 65 66 69 6С 65-66 69 6С 65 66 69 6С 67
1А8Е:0420 00 44 СО 21 F6 С2 80 74-05 F6 С2 10 75 05 55 86
1А8Е:0430 FD 8С DB 53 81 СЗ 20 00-03 DA 8С СО 8В С2 80
1А8Е:0440 OF 81 04 8В F2 03 Е6 8В-СЕ D1 Е9 4Е 4Е 8В FE.......NN..+
1А8Е:0450 Е8 2В 08 8Е С5 8Е DB F3-A5 FC 8E DO 07 06 BF +..............
1А8Е:0460 01 33 F6 АО 95 ВА 10 00-ЕВ 2В АО 95 В2 10 ЕВ......+.....5
1А8Е:0470 АО 95 В2 10 ЕВ 36 АО 95-В2 10 ЕВ 3В АО 95 В2....6.....;....
1А8Е:0480 ЕВ 5D АО 95 В2.]...
Содержимое выводится в шестнадцатеричном коде и в соответствующих символах ASCII (символы расширенного стандарта ASCII выводятся в виде точки (.)).
▪ En 'текст1', 'текст2'... (enter) — изменение содержимого ячеек памяти, начиная с вектор-адреса n; количество ячеек определяется размером указанных в команде текстов, например, по результатам команды -е 200 'pole', 'файл', 'file' выводится информация:
-d 200 1с
1А8Е:0200 70 6F 6С 65 Е4 АО А9 АВ-66 69 6С 65 pole...file:
При вводе числовой информации (машинных кодов команд) следует набрать Е n, нажать клавишу Enter и после отображенного байта информации и точки ввести новую информацию (1 байт), например:
-е 300
1А8Е:0300 73.20
Для ввода последующих байтов следует нажать клавишу Space и выполнить ввод очередного байта.
▪ F n L1 'текст!' (fill) — заполнение блока памяти длиной 1 байт, начиная с вектор-адреса п, однобайтовыми фрагментами текст!: -f 400 120 'file',
Результат выполнения команды:
d 400 130
1А8Е:0400 66 69 6С 65 66 69 6С 65-66 69 6С 65 66 69 6С 65 1А8Е:0410 66 69 6С 65 66 69 6С 65-66 69 6С 65 66 69 6С 65 1А8Е:0420 00 44 CD 21 F6 С2 80 74-05 F6 С2 10 75 05 Е8 52.D.!..
▪ S n L1 "текст" (search) — поиск фрагмента «текст» в поле памяти длиной 1 ячеек с выдачей вектор-адреса ячейки, хранящей искомый текст: -s 200 ПО 'fi'.
Результат команды: 1А8Е: 0208.
▪ W (write) — запись программы на диск; в регистр СХ должна быть предварительно записана длина программы в байтах, в регистр ВХ — нуль, а командой N задано имя файла (N — имя_файла);
▪ L (load) — загрузка файла с диска в ОП, предварительно следует в регистр ВХ записать нуль, в регистр СХ записать длину файла в байтах и объявить его имя командой N; для стандартно оформленных.СОМ- и.ЕХЕ-программ это же можно выполнить, набрав debug имя_файла.
Необходимо помнить что:
• ввод всех числовых данных осуществляется в шестнадцатеричной системе счисления, текстов — в символах ASCII, помещенных в кавычки;
• вектор-адрес содержит: адрес сегмента: адрес смещения;адрес сегмента может быть задан в явном виде 4-разрядным шестнадцатеричным кодом или указанием соответствующего сегментного регистра; сегмент команд может быть задан по умолчанию; адрес смещения задается в явном виде шестнадцатеричным кодом. Примеры задания вектор- адреса: 4FC5:10B. 13Сб:1АВВ. DS:0. CS:100:
• при вводе и отображении 2-байтовых слов старший байт размещается правее младшего. Пример: при отображении машинного кода команды
mov ax,0123 на экране получим: В82301 (В8 — машинный код команды ассемблера 'mov ax').
8.2 Основные команды отладчика CodeView Microsoft
Для вызова отладчика CodeView следует набрать в командной строке CV и, если необходимо, имена файлов, с которыми мы будем работать, например CV prog.exe. Затем нажать Enter. Отладчик выдаст на экран монитора листинг Вашей программы и установит курсор на первую команду программы. Нажмите F2. Справа от программы отобразятся регистры процессора. Нажимая клавишу F8, Вы будете исполнять программу по одной команде.
Управляющие клавиши:
< Alt > - активизация строки меню в верхней части экрана.
< Alt >/F/X - выход из Code View.
< Alt >/R/R – рестарт программы (возвращение её в исходное состояние для повторного пуска с самого начала).
< Ctrl >/G – увеличение размера (каждый раз на одну строку информационного окна с курсором).
< Ctrl >/T – уменьшение размера (каждый раз на одну строку информационного окна с курсором).
< Esc > - выход из меню.
Фукциональные клавиши:
< F1 > - вывод справочника
< F2 > - вывод на экран информационного поля с содержимым регистров процессора.
< F3 > - переключение вида основного информационного кадра (только машинные команды, только исходный текст).
< F4 > - переключение на экран DOS и обратно.
< F5 > - выполнение программы до конца или до точки останова.
< F6 > - перевод курсора на информационное поле программы или на поле командной строки.
< F7 > - выполнение программы до курсора или до точки останова.
< F8 > - выполнение одной команды (подпрограммы и циклы выполняются команда за командой).
< F9 > - установка или снятие точки останова в положение курсора.
< F10 > - выполнение одной команды (подпрограммы и циклы выполняются как одна команда, если в них нет точки останова).
Команды командной строки:
G seg: addr- выполнение программы до адреса seg: addr, точки останова или
конца програмы. В качестве параметра seg может использоваться обозначение сегментного регистра или число. По умолчанию seg = CS.
P n – выполнение n команд, с выполнением подпрограмм и циклов как одной команды. По умолчанию n =1.
T n - выполнение n команд со входом в подпрограммы и циклы. По умолчанию n =1.
D type seg: addr L nmb- дамп nmb байтов в формате type начиная с адреса seg: addr. В качестве параметра seg может использоваться обозначение сегментного
регистра или число. По умолчанию seg = CS. Параметр type (тип)- может принимать следующие значения: А- только коды ASCII,
В- байты и коды ASCII, W- слова.
После выполнения одной команды D указанный тип остаётся
установленным. Между командой и типом не должно быть пробела.
D type seg: addr1 addr2- дамп памяти от адреса seg: addr1 до адреса seg: addr2. R reg- вывод содержимого регистра reg и запрос его изменение.
R reg= n - занесение в регистр reg значения n.
E type seg: addr n1 n2 …- занесение в память начиная с адреса seg: addr значений n1, n2 в формате type. Возможные значения type приведены в описании команды D. По умолчанию seg= DS. Между командой и типом не дожно быть пробелов.
N radix- изменение системы счисления в параметрах командной строки. Параметр radix может принимать значения 16 и 10. Команда N без параметра выводит действующее значение системы счисления.
BP seg: addr- установка точки останова по адресу seg: addr. По умолчанию seg:= CS.
BP seg: addr step- установка точки останова по адресу seg: addr с пропуском её при выполнении первых step раз. Команда используется при отладке многошаговых циклов.
BL- вывод списка точек останова с их адресами.
BC n - снятие точки останова с номером n.
BC*- снятие всех точек останова.
BD n- выключение (но не снятие) точки останова с номером n.
Be n- включение (но не установка новой точки останова) точки останова
с номером n.
Библиографический список
1. Каган Б. М. Электронные вычислительные машины и системы.
М.: Энергоатомиздат, 1991.- 592с.
2. Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке Ассемблера. М.: Радио и связь, 1989.- 336с.
3. Гилмор Ч. Введение в микропроцессорную технику. М.: Мир, 1984.- 334с.
4. Зельцин Е. А. Цифровые интегральные микросхемы в информационно-измерительной аппарат<