ASSUME CS:CODESG,DS:CODESG,SS:CODESG




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. Зельцин Е. А. Цифровые интегральные микросхемы в информационно-измерительной аппарат<



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: