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 ;Помножить правое ASSUME CS:CODESG,DS:CODESG,SS:CODESG слова

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

; Перемножение 2-ух двойных слов:

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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG 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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG,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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG,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 Многоречивое сложение

Очень ASSUME CS:CODESG,DS:CODESG,SS:CODESG вероятное значение знакового числа в регистрах микропроцессора равное + 32767 и -32768, ограничивает способности компьютера при выполнении арифметических операций. Поэтому арифметические операции сложения двухсловных и поболее чисел делают при помощи маленьких процедур, которые обеспечивают поначалу сложение последних правых слов с сохранением результата в переменной. А потом складывают левые слова и суммируют ASSUME CS:CODESG,DS:CODESG,SS:CODESG итог с переменной, использую команду 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 M ASSUME CS:CODESG,DS:CODESG,SS:CODESG1 ; Вызов процедуры сложения двойных слов.

Call M2 ; Вызов процедуры сложения чисел хоть какой длины.

Jmp M3 ; Переход на команды выхода из программки.

M1: PROC

Mov ax,word ptr sdd1 ; Пересылка в АХ правой части 1-го слагаемого.

Add ax,word ptr sdd2 ; Сложение с правой частью 2-го слагаемого.

Mov word ptr ASSUME CS:CODESG,DS:CODESG,SS:CODESG 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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG,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 - имя подпрограммы ASSUME CS:CODESG,DS:CODESG,SS:CODESG получения символьного представления четырехбитового числа. На входе в подпрограмму: начальное число должно находится в младшей половине регистра AL, адресок строчки, куда нужно поместить итог, находится в регистрах DS:SI. На выходе из подпрограммы: ASCII представление приобретенного числа в памяти по адресу находящемуся в DS:SI. Начальное содержимое регистра AL ASSUME CS:CODESG,DS:CODESG,SS:CODESG разрушается.

.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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG ascii endp ;

…….

……

Mov AX,4C00H;

Int 21H;

End start;

Комменты к программке.

Пусть начальное число, находится в регистре AL. Для преобразования этого числа в код ASCII, используем команду табличной трансляции XLAT, которая позволяет выполнить подборку б из таблицы по его индексу. Перед исполнением этой команды в ASSUME CS:CODESG,DS:CODESG,SS:CODESG регистрах DS:BX должен находится полный адресок таблицы трансляции, а в регистре AL - смещение в таблице к избираемому б, т.е. его индекс. Процедура Hex ascii может быть вызвана из хоть какого места в программке. Потому, для того чтоб она не нарушала основную программку, 1-ая команда процедуры сохраняет в стэке ASSUME CS:CODESG,DS:CODESG,SS:CODESG регистр BX, который потом настраивается на смещение таблицы трансляции. В регистре AL уже находится преобразуемое число, которое, согласно построению таблицы tblhex, является индексом требуемого знака можно делать команду xlat. Итог преобразования из регистра AL отчаливает в ячейку памяти, по адресу, находящемуся в регистре SI.

6. Сообщения об ошибках MASM

В ASSUME CS:CODESG,DS:CODESG,SS:CODESG этом приложении перечисляются и поясняются сообщения, воспроизводимые MASM, при обнаружении более всераспространенных ошибок, возникающих при ассемблировании программ.

По окончании обработки воспроизводится сообщение о окончании ассемблирования, и указывается число свободных б символьного места, ошибки и предупреждающие сообщения, обнаруженные в процессе ассемблирования. Если была применена функция IV, то выводится также число начальных строк, общее ASSUME CS:CODESG,DS:CODESG,SS:CODESG число строк и число символьных имен.

Пример:

110 Sourse Lines (начальных строк)

145Total Lines (Всего строк)

21 Symbols (символьных имен)

25684 Bytes Symbol space free (б свободного символьного места)

0 Warning Errors (вероятных ошибок)

0 Severe Errors (критичных ошибок)

Сообщения MASM, об ошибках найденных во время трансляции приведены в порядке их номеров с ASSUME CS:CODESG,DS:CODESG,SS:CODESG маленькими пояснениями в таблице 6.1.

Таблица 6.1 Сообщения MASM с пояснениями

Код Сообщение Пояснение
Extra characters on line Излишние знаки в строке В командной строке получена достаточная для определения управляющей директивы информация, но в нее уже введены лишниие знаки
Unknouwn symbol type Неведомый символьный тип MASM не сумел распознать типоразмер, обозначенный в метке ASSUME CS:CODESG,DS:CODESG,SS:CODESG либо наружной декларации
Redefinition of symbols Переопределение символьного имени Если какое-то символьное имя определено в 2-ух местах, то эта ошибка будет найдена на первом проходе, при повторном объявлении данного имени.
Symbol is multi-defined Неоднократно определенное символьное имя Если какое-то символьное имя определено в ASSUME CS:CODESG,DS:CODESG,SS:CODESG 2-ух местах, то эта ошибка будет фиксироваться на втором проходе при каждом объявлении данного символьного имени. (см. ошибки 4 и 26)
Syntax error Синтаксическая ошибка Синтаксис определенного оператора не совпадает ни с одной из опознаваемых синтаксических конструкций.
Type illegal in context Недопустимый в контексте тип Недопустимая размерность определенного данного типа
Must be declared in ASSUME CS:CODESG,DS:CODESG,SS:CODESG pass 1 Должно быть объявление на первом проходе Существует ссылка на тот либо другой компонент до его определения на первом проходе. К примеру: выражение вида IF DEBUG неприемлимо, если символьное имя DEBUG не определено
Symbol type usage illegal Неверное внедрение символьного типа Неверное внедрение символьного наименования PUBLIC
Symbol is reserved ASSUME CS:CODESG,DS:CODESG,SS:CODESG word В качестве символьного имени применено зарезервированное слово Попытка недопустимого использования зарезервированного слова ассемблера. Например, объявление переменной с именованием MOV.
Forward reference is illegal Ссылка вперед недопустима Попытка ссылки на некоторый компонент до его определения в первом проходе.
Must be register Должен быть указан регистр Юзер указал в ASSUME CS:CODESG,DS:CODESG,SS:CODESG качестве операнда символьное имя заместо регистра.
Wrong type of register Неверный тип регистра В директиве либо аннотации указан тип регистра, хороший от требуемого. К примеру: INC CS, так как нельзя выполнить повышение значения кодового сектора.
Must be segment of group Должен быть сектор либо группа Заместо требуемого сектора ASSUME CS:CODESG,DS:CODESG,SS:CODESG либо группы было обозначено нечто другое.
Symbol has no segment Символьное имя без сектора Попытка использования символьного имени с SEG, тогда как символьному имени сектор не отводится.
Must be symbol type Должен быть символьный тип Заместо 1-го из типов WORD, DW, QW, BYTE, и т.п. получено какое-то другое значение ASSUME CS:CODESG,DS:CODESG,SS:CODESG.
Already defined locally Уже дано локальное определение Попытка найти EXTERN как какое-то символьное имя, ранее уже определенное как локальное.
Segment parameters are changed Изменены характеристики сектора Перечень аргументов для SEGMENT отличается от того, который был при первом использовании сектора.
Non proper align/ combine type Несоответствующий счетный ASSUME CS:CODESG,DS:CODESG,SS:CODESG / комбинаторный тип Неправильные характеристики SEGMENT. Следует проверить применяемые счетный и комбинаторный типы, чтоб убедиться в том, что введены правильные типы.
Reference to multi defined Ссылка на множествен-ное определение Аннотация ссылается на не один раз определенное символьное имя (см ошибки с № 4 и 5)
Operand was expected Должен быть операнд Ассемблер ASSUME CS:CODESG,DS:CODESG,SS:CODESG нашел оператор заместо требуемого операнда
Operator was expected Должен быть оператор Ассемблер нашел операнд заместо требуемого оператора
Division by 0 or overflow Деление на ноль либо переполнение Приведенное выражение дает деление на 0 либо очень огромное число, не имеющее представления
Shift count is negative Отрицательный сдвиговый счет Образовано выражение для сдвига. Дающее ASSUME CS:CODESG,DS:CODESG,SS:CODESG его отрицательное значение
Operand types must match Типы операндов должны соответствовать Ассемблер нашел различные виды либо размерности аргументов в той ситуации, в какой подразумевается их соответствие. Например, оператор типа mov ax,bh является недопустимым; в качестве обоих операндов должны употребляться или слова, или байты.
Illegal use of external Недопустимое ASSUME CS:CODESG,DS:CODESG,SS:CODESG внедрение наружного компонента Недопустимое внедрение наружного определения.
Must be record field name Должно быть имя поля записи Заместо наименования поля записи получено нечто другое
Must be record or field name Должно быть имя записи либо поля Заместо наименования поля либо записи принято нечто другое.
Operand must have ASSUME CS:CODESG,DS:CODESG,SS:CODESG size Операнд обязан иметь размерность Операнд должен владеть размерностью, но она не указана. Нередко эту ошибку можно поправить, использовав оператор PTR для указания типоразмера.
Must be var, label or constant Должна быть переменная, метка либо константа Должна быть переменная, метка либо константа, но заместо этого получено что-то другое.
Must ASSUME CS:CODESG,DS:CODESG,SS:CODESG be structure field name Должно быть имя поля структуры Заместо имени поля структуры получено что-то другое.
Left operand must have segment В левом операнде должен быть указан сектор Операнд просит указания сектора. Например, выражение вида :symbol неприемлимо, заместо этого должно быть seg:symbol.
One operand must be const ASSUME CS:CODESG,DS:CODESG,SS:CODESG Один операнд должен быть константой Случай недопустимого использования оператора сложения.
Operand must be same or 1 абс Операнды должны быть 1-го типа либо 1 abs Недопустимое внедрение оператора вычитания.
Normal type operand expected Должен быть операнд обычного типа Получены STRUCT, WORD, BYTE либо другой недопустимый операнд заместо требуемой метки переменной.
Constant was expected ASSUME CS:CODESG,DS:CODESG,SS:CODESG Должна быть константа Должна быть константа, но заместо нее имя переменной.
Operand must have segment Операнд обязан иметь сектор Недопустимое внедрение директивы SEG.
Must be associated with data Должен быть компонент данных Внедрение кодового компонента в том месте, где требуется компонент данных
Must be associated with ASSUME CS:CODESG,DS:CODESG,SS:CODESG code Должен быть компонент данных Внедрение компонента данных в том месте где требуется компонент кода.
Already have base register Базисный регистр уже есть В операнде применено более 1-го базисного регистра. К примеру: mov ax,[bx+bp]
Already have index register Индексный регистр уже есть В операнде применено более 1-го индексного ASSUME CS:CODESG,DS:CODESG,SS:CODESG регистра. К примеру: mov ax,[si+di]
Must be index or base register Должен быть индексный либо базисный регистр В аннотации должен быть задан индексный либо базисный регистр, тогда как в квадратных скобках уже указан некий другой регистр. К примеру: mov ax, [bx+ax]
Illegal use of register Неверное внедрение регистра ASSUME CS:CODESG,DS:CODESG,SS:CODESG Внедрение какого-нибудь регистра в аннотации, не предусматривающей такое применение регистра либо когда нереально применение никакого регистра.
Value is out of range Значение вне спектра Значение превосходит вероятное для ячейки либо регистра.. К примеру: mov al,5000 неприемлимо.
Operand not in IP segment Операнд не в секторе IP ASSUME CS:CODESG,DS:CODESG,SS:CODESG Доступ к операнду неосуществим, так как он находится вне текущего по IP сектора
Improper operand type Неподходящий тип операнда Метод использования некого операнда препятствует формированию операционного кода
Relative jump out of range Относительный переход вне спектра Условные переходы должны совершаться в границах от –128 до +127 байтов относительно текущей аннотации, но некий ASSUME CS:CODESG,DS:CODESG,SS:CODESG отдельный переход оказался вне этого спектра.
Index displ. Must be constant Индексное смещение должно быть неизменным Недопустимое внедрение индексного смещения.
Illegal register value Недопустимое значение регистра Обозначенное регистровое значение не укладывается в поле ‘reg’ (данное значение превосходит 7)
No immediate mode Конкретный режим недопустим Конкретные данные подставлены в качестве операнда для ASSUME CS:CODESG,DS:CODESG,SS:CODESG аннотации, которая не может использовать такие данные.
Byte register is illegal Недопустим байтовый регистр Внедрение 1-го из байтовых регистров в непредусмотренном для этого контексте. К примеру недопустим оператор вида PUSH AL; следует употребить заместо этого PUSH AX.
CS register illegal usage Недопустимое внедрение Попытка непредусмотренного использования ASSUME CS:CODESG,DS:CODESG,SS:CODESG регистра CS. К примеру, неприемлимо выражение XCHG CS,AX
Must be AX or AL Должен быть указан АХ либо АL Спецификация некого регистра, другого, чем AX и AL, в таковой ситуации, когда могут быть применены только они. К примеру, аннотация IN просит указания в качестве её операнда регистры AX ASSUME CS:CODESG,DS:CODESG,SS:CODESG либо AL
Improper use of segment reg. Некорректно применен сегментный регистр Спецификация сегментного регистра в том месте, где он не может быть применен. К примеру, конкретное перемещение в сегментный регистр.
No or unreachable CS Отсутствует либо недоступен CS Попытка перехода к труднодоступной метке.
Operand combination illegal Недопустимая композиция операндов Спецификация аннотации, включающей ASSUME CS:CODESG,DS:CODESG,SS:CODESG два операнда, с недопустимым в определенном случае методом их взаимодействия.
Near JMP/CALL to different CS Ближние JMP/CALL к различным CS Попытка выполнения NEAR перехода либо воззвания к ячейке в кодовом секторе, определенном другим выражением ASSUME:CS
Label can’t have seg. Override Для метки нереально переопределение ASSUME CS:CODESG,DS:CODESG,SS:CODESG сектора Недопустимое переопределение сектора
Must have upcode after prefix После префикса должен стоять операционный код Внедрение аннотации REPE, REPNE, REPZ либо REPZN без указания после нее какого-нибудь операционного кода.
Can’t override ES segment Нереально переопределение сектора ES Попытка переопределения сектора ES в аннотации, которая не ASSUME CS:CODESG,DS:CODESG,SS:CODESG допускает такового переопределения. К примеру: недопустим оператор вида STOC DS:TARGET
Can’t reach with segment reg. Нет доступа через сегментный регистр Данная переменная не заходит ни в одну директиву типа ASSUME, обеспечивающую её доступность.
Must be in segment block Выход из сегментного блока Попытка генерации кода вне сектора
Can’t ASSUME CS:CODESG,DS:CODESG,SS:CODESG use EVEN on BYTE segment EVEN на секторе типа BYTE не употребляется Была применена директива EVEN, тогда как задействованный сектор объявлен байтовым
Illegal value for DUP count Недопустимое значение для счета DUP Счет DUP должен выражаться константой в виде положительного целого числа (больше нуля)
Symbol already external ASSUME CS:CODESG,DS:CODESG,SS:CODESG Символьное имя уже объявлено наружным Попытка определения локальным некого символьного имени, которое уже объявлено наружным
DUP is too large for linker Значение DUP превы-шает способности компоновщика Скооперировано такое вложение операторов DUP, которое образовало очень огромную запись
Usage of ? (intermediate) bad Неверное (неопределенное) внедрение Неверное внедрение неопределенного операнда (?). К ASSUME CS:CODESG,DS:CODESG,SS:CODESG примеру, нельзя записать ? +5
Override with DUP is illegal Переопределение с DUP неприемлимо Попытка использования DUP при переопределении в операторе инициализации STRUC
Field cannot be overriden Поле не может быть переопределено Попытка задания значения для какого-то поля в операторе инициализации STRUC, которое не может быть переопределено.
Override is wrong type Неверный тип ASSUME CS:CODESG,DS:CODESG,SS:CODESG переопределения Попытка использования неверной размерности при переопределении в операторе инициализации STRUC.
Register can’t be forward ref Недопустима ссылка вперед на регистр Имела место попытка ссылки вперед на сектор
Circular chain of EQU aliases Цикличность в EQU Оказалось, что EQU показывает сам на себя
8087 opcode can ASSUME CS:CODESG,DS:CODESG,SS:CODESG’t be emulated Невозможна эмуляция операционного кода 8087 Текущий операционный код 8087 либо операнды, которые с ним употребляются, образуют аннотацию, которую эмулятор не поддерживает
End of file, no END directive Конец файла без директивы END Нет оператора окончания либо допущена ошибка вложения.
Data emitted with no segment Данные формируются вне сектора Попытка генерации данных ASSUME CS:CODESG,DS:CODESG,SS:CODESG кодом, размещенным вне сектора

7 Сообщения об ошибках LINK.

В этой главе приводятся сообщения об ошибках, которые могут произойти при сборке программ при помощи объектного компоновщика Microsoft - LINK.

Таблица 7.1 Сообщения компоновщика с пояснениями

Сообщения Пояснения
Cannot find library: имя_файла.lib. Enter new file spec:. Не найдена библиотека имя ASSUME CS:CODESG,DS:CODESG,SS:CODESG_файла.lib. Ввести новейшую спецификацию файла: Компоновщик не может отыскать файл “имя_файла”.lib. Юзер должен ответить на выданный ему запрос, задав новое название файла, новейшую спецификацию пути либо то и другое.
Warning: no stack is segment Предупреждение: нет стекового сектора Программка юзера не содержит стекового сектора, который ASSUME CS:CODESG,DS:CODESG,SS:CODESG специфицирован с комбинаторным типом, специфицированным как stack.
Cannot open response file Нереально открыть объектный файл LINK не может отыскать объектный файл, обозначенный юзером. Как правило это происходит при ошибке ввода с клавиатуры.
Cannot nest response file Вложение ответного файла нереально Юзер указал в объектном файле другой объектный файл
Cannot ASSUME CS:CODESG,DS:CODESG,SS:CODESG open run file Нереально открыть рабочий файл Диск либо корневая система заполнены. Чтоб высвободить место, нужно удалить либо переместить файлы
Cannot open temporary file Нереально открыть временный файл Диск либо корневая система заполнены. Чтоб высвободить место, нужно удалить либо переместить файлы
Common area longer than 65,535K Общая зона превосходит ASSUME CS:CODESG,DS:CODESG,SS:CODESG 65,535К В программке юзера общие переменные занимают более 64К. Эта ошибка не может произойти с объектными файлами, сформированными MASM
Имя_файла is not a valid library Имя_файла не является правильной библиотекой Некорректная спецификация некого файла как библиотечного.
Insufficient stack space Недостающее место стека Не хватает памяти для работы ASSUME CS:CODESG,DS:CODESG,SS:CODESG компоновщика
Invalid object module Неверный объектный модуль Один из объектных модулей оказался неверным. Следует попробовать выполнить повторную компиляцию.

No object modules specified Не указаны объектные модули Юзер не задал компоновщику имен объектных файлов
Out of space on run file Нет места для рабочего файла Заполнен диск, на который ASSUME CS:CODESG,DS:CODESG,SS:CODESG записывается EXE-файл. Следует высвободить нужное для этого место на диске и повторить попытку.
Stack size exceeds 65535 bytes Размер стека превосходит 65535 байтов Размер, обозначенный для стека с применением функции /STACK, превосходит 65535 байтов

8 Короткие сведения об отладчиках программ

Для отладки программ написанных на Ассемблере, обычно употребляют один из 2-ух отладчиков: DEBUG ASSUME CS:CODESG,DS:CODESG,SS:CODESG компании BORLAND либо Code View компании Microsoft. Они обеспечивают интерактивную отладку программ в формате .ЕХЕ- и .СОМ-файлов. Обычно они употребляется для отладки исполняемых программ, получен­ных с языка уровня ассемблера. Они позволяют ассемблировать и исполняемые фай­лы .ЕХЕ и .СОМ, скомпилированные с языков более высочайшего уровня.

DEBUG и Code View позволяют ASSUME CS:CODESG,DS:CODESG,SS:CODESG:

▪ прослеживать выполнение и управлять выполнением программ;

▪ заносить конфигурации в отлаживаемую программку;

▪ вводить маленькие программки на языке ассемблера, делать ассемблирова­ние этих программ и создавать исполняемые программки с расширением .СОМ;

▪ делать преобразование машинных шестнадцатеричных кодов команд в фор­мат языка ассемблера (деассемблирование);

▪ показывать текстовые файлы в ASCII и шестнадцатеричном ASSUME CS:CODESG,DS:CODESG,SS:CODESG форматах;

▪ просматривать и изменять содержимое регистров памяти МП и ячеек основ­ной памяти;

▪ загружать информацию с дисковых накопителей в основную память, и наобо­рот (считывать информацию с дисков и записывать на их);

▪ производить поиск определенных данных в текстах сообщений и программ (с вы­дачей адреса их хранения);

▪ просматривать регистр ASSUME CS:CODESG,DS:CODESG,SS:CODESG флагов с отображением мнемокодов значений этих фла­гов (таблица 8.1)

Таблица 8.1.Мнемокоды значений флагов

Флаг Имя флага Установлен Сброшен
OF Переполнение (да/нет) OV NV
DF Направление (уменьш./увелич.) DN UP
IF Прерывания (вкл./откл.) EI DI
SF Символ (отриц./полож.) NG PL
ZF Нуль (да/нет) ZR NZ
AF ASSUME CS:CODESG,DS:CODESG,SS:CODESG Вспомогательный перенос (да/нет) АС NA
PF Четность (четн./нечетн.) РЕ PO
CF Перенос (да/нет) SY NC

8.1 Главные команды отладчика DEBUG

Для вызова отладчика DEBUG следует набрать debug либо DB и, если нужно, названия файлов, с которыми мы будем работать, к примеру debug prog.exe. Приглашение к вводу команд — -. После ASSUME CS:CODESG,DS:CODESG,SS:CODESG окончания работы с DEBUG для выхода из него сле­дует набрать q. После набора каждой команды следует жать Enter.

Отладчик DEBUG делает команды:

▪ N (name) — объявление названии файла.

▪ R m (register) — отображение на дисплее монитора содержимого регистра памяти МП с именованием m. Если m не обозначено, отображается содержимое всех ASSUME CS:CODESG,DS:CODESG,SS:CODESG регистров памяти МП, вектор-адрес последующей команды (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 1A ASSUME CS:CODESG,DS:CODESG,SS:CODESG8E:010A B81500 MOV AX,0015 ;

Если выводится содержимое 1-го регистра, то команда R позволяет поменять его содержимое:

-R ах

АХ 0005

:45

-R ах

АХ 0045

▪ A n (assembler) — прием команд ассемблера с клавиатуры и преобразование их в машинные коды, n — исходный вектор-адрес машинных команд.

Пример ввода программки:

-А 100

1А8Е:0100 mov ax ASSUME CS:CODESG,DS:CODESG,SS:CODESG,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 — смещение последней из машинных команд, подлежащих деассемблиро-ванию ASSUME CS:CODESG,DS:CODESG,SS:CODESG, 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 не обозначено, то производится одна команда ASSUME CS:CODESG,DS:CODESG,SS:CODESG (пошаговое выполнение программки). Команды воззвания к процедурам и внутренние прерывания командой Т не выполняют­ся, потому что по Т будут поочередно производиться команды процедуры и ко­манды обработки прерывания соответственно. В этих случаях следует исполь­зовать команду процедурной трассировки Р (procedure), практически аналогичную команде Т, но позволяющую автоматом на ASSUME CS:CODESG,DS:CODESG,SS:CODESG сто процентов делать встречаю­щиеся при трассировке процедуры, либо команду G п. После выполнения ко­манд (команды) на экран выводится:

- содержимое всех регистров памяти МП в шестнадцатеричном коде (значения флагов регистра FL выводятся в мнемокоде (см. табл. 9.2);

- вектор-адрес (CS: IP);

- машинный и мнемокоды текущей команды.

▪ G n (go) — выполнение .EXE ASSUME CS:CODESG,DS:CODESG,SS:CODESG- либо .СОМ-программы до команды с вектор-адре­сом п, при отсутствии n программка производится до конца.

После выполнения команд (команды) на экран выводится:

- содержимое всех регистров памяти МП в шестнадцатеричном коде (значения);

- флаги регистра FL в мнемокоде

- вектор-адрес (CS: IP), машинный и мнемокоды текущей команды. После выполнения ASSUME CS:CODESG,DS:CODESG,SS:CODESG программки получим:

-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) — показать на дисплее монитора содержимое ячеек ASSUME CS:CODESG,DS:CODESG,SS:CODESG памяти, начиная с ячейки по вектор-адресу 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 E ASSUME CS:CODESG,DS:CODESG,SS:CODESG8 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С ASSUME CS:CODESG,DS:CODESG,SS:CODESG 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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG 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 ASSUME CS:CODESG,DS:CODESG,SS:CODESG 'текст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:

При вводе числовой инфы (машинных кодов команд ASSUME CS:CODESG,DS:CODESG,SS:CODESG) следует набрать Е n, надавить кнопку Enter и после отображенного б инфы и точки вве­сти новейшую информацию (1 б), к примеру:

-е 300

1А8Е:0300 73.20

Для ввода следующих байтов следует надавить кнопку Space и выполнить ввод еще одного б.

▪ F n L1 'текст!' (fill) — наполнение блока памяти ASSUME CS:CODESG,DS:CODESG,SS:CODESG длиной 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 яче­ек ASSUME CS:CODESG,DS:CODESG,SS:CODESG с выдачей вектор-адреса ячейки, хранящей разыскиваемый текст: -s 200 ПО 'fi'.

Итог команды: 1А8Е: 0208.

▪ W (write) — запись программки на диск; в регистр СХ должна быть предвари­тельно записана длина программки в б, в регистр ВХ — нуль, а командой N задано название файла (N — имя_файла);

▪ L ASSUME CS:CODESG,DS:CODESG,SS:CODESG (load) — загрузка файла с диска в ОП, за ранее следует в регистр ВХ записать нуль, в регистр СХ записать длину файла в б и объявить его имя командой N; для стандартно оформленных .СОМ- и .ЕХЕ-программ это мож­но выполнить, набрав debug имя_файла.

Нужно держать в голове ASSUME CS:CODESG,DS:CODESG,SS:CODESG что:

• ввод всех числовых данных осуществляется в шестнадцатеричной системе счисления, текстов — в знаках ASCII, помещенных в кавычки;

• вектор-адрес содержит: адресок сектора: адресок смещения;адресок сектора мо­жет быть задан в очевидном виде 4-разрядным шестнадцатеричным кодом либо указанием соответственного сегментного регистра; сектор команд может быть задан по дефлоту; адресок смещения задается в ASSUME CS:CODESG,DS:CODESG,SS:CODESG очевидном виде шестна­дцатеричным кодом. Примеры задания вектор- адреса: 4FC5:10B. 13Сб:1АВВ. DS:0. CS:100:

• при вводе и отображении 2-байтовых слов старший б располагается пра­вее младшего. Пример: при отображении машинного кода команды

mov ax,0123 на дисплее получим: В82301 (В8 — машинный код команды ассемблера 'mov ax').

8.2 Главные ASSUME CS:CODESG,DS:CODESG,SS:CODESG команды отладчика CodeView Microsoft

Для вызова отладчика CodeView следует набрать в командной строке CV и, если нужно, названия файлов, с которыми мы будем работать, к примеру CV prog.exe. Потом надавить Enter. Отладчик выдаст на экран монитора листинг Вашей программки и установит курсор на первую команду программки. Нажмите F2. Справа от ASSUME CS:CODESG,DS:CODESG,SS:CODESG программки отобразятся регистры микропроцессора. Нажимая кнопку F8, Вы будете исполнять программку по одной команде.

Управляющие кнопки:

- активизация строчки меню в высшей части экрана.

/F/X - выход из Code View.

/R/R – рестарт программки (возвращение её в начальное состояние для повторного запуска с самого начала).

/G – повышение размера (всякий раз на одну ASSUME CS:CODESG,DS:CODESG,SS:CODESG строчку информационного окна с курсором).

/T – уменьшение размера (всякий раз на одну строчку информационного окна с курсором).

- выход из меню.

Фукциональные кнопки:

- вывод справочника

- вывод на экран информационного поля с содержимым регистров микропроцессора.

- переключение вида основного информационного кадра (только машинные команды, только начальный текст).

- переключение на экран DOS ASSUME CS:CODESG,DS:CODESG,SS:CODESG и назад.

- выполнение программки до конца либо до точки останова.

- перевод курсора на информационное поле программки либо на поле командной строчки.

- выполнение программки до курсора либо до точки останова.

- выполнение одной команды (подпрограммы и циклы производятся команда за командой).

- установка либо снятие точки останова в положение курсора.

- выполнение ASSUME CS:CODESG,DS:CODESG,SS:CODESG одной команды (подпрограммы и циклы производятся как одна команда, если в их нет точки останова).

Команды командной строчки:

G seg: addr- выполнение программки до адреса seg: addr, точки останова либо

конца програмы. В качестве параметра seg может употребляться обозначение сегментного регистра либо число. По дефлоту seg= CS.

P n – выполнение ASSUME CS:CODESG,DS:CODESG,SS:CODESG n команд, с выполнением подпрограмм и циклов как одной команды. По дефлоту n =1.

T n- выполнение n команд со входом в подпрограммы и циклы. По дефлоту n =1.

D type seg: addr L nmb- дамп nmb байтов в формате type начиная с адреса seg: addr. В качестве параметра seg может употребляться ASSUME CS:CODESG,DS:CODESG,SS:CODESG обозначение сегментного

регистра либо число. По дефлоту seg= CS. Параметр type (тип)- может принимать последующие значения: А- только коды ASCII,

В- байты и коды ASCII, W- слова.

После выполнения одной команды D обозначенный тип остаётся

установленным. Меж командой и типом не должно быть пробела.

D type seg: addr1 addr2- дамп памяти ASSUME CS:CODESG,DS:CODESG,SS:CODESG от адреса seg: addr1 до адреса seg: addr2. R reg- вывод содержимого регистра reg и запрос его изменение.

R reg= n- занесение в регистр reg значения n.

E type seg: addr n1 n2 …- занесение в память начиная с адреса seg: addr значений n1, n2 в формате type. Вероятные значения ASSUME CS:CODESG,DS:CODESG,SS:CODESG type приведены в описании команды D. По дефлоту seg= DS. Меж командой и типом не дожно быть пробелов.

N radix- изменение системы счисления в параметрах командной строчки. Параметр radix может принимать значения 16 и 10. Команда N без параметра выводит действующее значение системы счисления.

BP seg: addr- установка точки останова по ASSUME CS:CODESG,DS:CODESG,SS:CODESG адресу seg: addr. По дефлоту seg:= CS.

BP seg: addr step- установка точки останова по адресу seg: addr с пропуском её при выполнении первых step раз. Команда применяется при отладке многошаговых циклов.

BL- вывод перечня точек останова с их адресами.

BCn- снятие точки останова с номером n.

BC*- снятие ASSUME CS:CODESG,DS:CODESG,SS:CODESG всех точек останова.

BDn- выключение (но не снятие) точки останова с номером n.

Ben- включение (но не установка новейшей точки останова) точки останова

с номером n.

Библиографический перечень

1. Каган Б. М. Электрические вычислительные машины и системы.

М.: Энергоатомиздат, 1991.- 592с.

2. Скэнлон Л. Индивидуальные ЭВМ IBM PC и XT. Программирование на языке Ассемблера. М.: Радио ASSUME CS:CODESG,DS:CODESG,SS:CODESG и связь, 1989.- 336с.

3. Гилмор Ч. Введение в микропроцессорную технику. М.: Мир, 1984.- 334с.


assessment-of-natural-resource-potential-of-the-region.html
assignment-4-metodicheskie-razrabotki-po-kursu-domashnee-chtenie-sostavitel-v-o-pavlov-k-f-n-docent-kafedri.html
assimetrichnoe-raspredelenie.html