Поле МЕТКА не является обязательным, оно помечает адрес той ячейки памяти, в которой размещен первый байт отмеченной команды. Метки используются в качестве адресов перехода команд передачи управления, и благодаря их наличию программист может не оперировать абсолютными адресами, а использовать символические адреса, что значительно удобнее. Метка может иметь длину от одного до шести символов, первым из которых должна быть буква. Во многих ассемблерах допускается использование меток любой длины, но распознаются только первые шесть символов. Метка не должна содержать пробелов и знаков пунктуации. В некоторых ассемблерах за последним символом метки должно следовать двоеточие.
В поле метки каждая метка должна быть определенна только один раз, но ссылок к ней можно использовать столько раз, сколько это необходимо. В противном случае ассемблер выдаст диагностическое сообщение о многократно определенной метке.
Поле КОД содержит символическое имя выполняемой команды или псевдокоманды. Мнемоника большинства команд представляет собой аббревиатуру предложений на английском языке, характеризующих их основную функцию.
Например:
MOV (MOVE) -передать, переслать
ADD (ADDITION) -сложение
SUB (SUBSTRACT) -вычитание
LDA (LOAD DIRECT
ACCUMULATOR) -непосредственная загрузка
INR (INSCREMENT аккумулятора
REGISTER) -инкремент регистра
DCR (DECREMENT
REGISTER) декремент регистра
Мнемоники команд являются ключевыми словами ассемблера, и если они не входят во множество допустимых мнемоник, то ассемблер выдает сообщение о недействительной команде.
Поле ОПЕРАНД определяется обычно в зависимости от поля кода команды. Оно может содержать либо один, либо несколько операндов, разделенных запятыми, либо не содержать ни одного операнда для тех команд, которые оперируют внутренними рабочими регистрами.
Операнд представляет собой выражение, содержащее мнемоническое обозначение, константы и операторы.
Простейшие операнды содержат одно мнемоническое обозначение или одну константу.
В качестве мнемонического обозначения могут использоваться идентификаторы внутренних рабочих регистров, метки и текущее значение программного счетчика.
Константы могут быть представлены в различных системах счисления.
Программная часть
Описание программы
В этой работе мы рассмотрим один из способов перевода числа из десятичной системы исчисления в двоичную и шестнадцатеричную с помощью языка Ассемблера. Прежде чем создавать программу, детально рассмотрим, какие шаги для этого надо предпринять, то есть другими словами напишем алгоритм решения нашей задачи. Для того чтобы компьютер мог обрабатывать данные, эти данные ему надо ввести, а значит первым шагом в решении нашей задачи будет ввод числа. Вторым шагом в работе будет вывод сообщения о введеном числе. После этого мы переводим десятичное число в двоичную систему и выводим наше число в двоичном эквиваленте на экран. Следующим шагом будет перевод числа в шестнадцатеричный эквивалент и последний шаг это цикл который позволяет продолжить ввод нового десятичного числа. Теперь соберём все пункты вместе:
1. Ввод числа с клавиатуры.
2. Вывод сообщения о введеном числе.
3. Перевод числа в двоичный эквивалент.
4. Вывод на экран двоичного числа.
5. Перевод числа в шестнадцатеричную систему.
6. Вывод на экран шестнадцатеричного числа.
7. Цикл (продолжим?) если ДА то пункт 1, иначе пункт 8
8. Выход из программы.
Это и есть алгоритм программы на естественном языке.
этапы разработки ассемблерных программ
1. Постановка задачи. Включает в себя содержательное описание задачи и разработку алгоритма.
2. Разработка текста программ.
3. Ввод текста в компьютер. Текст программы в мнемокодах вводится в ЭВМ при помощи любого текстового редактора. Так же при этом создает ся текстовый Файл с расширением *.ASM.
4. Компиляция или ассемблирование. Осуществляется преобразование текстового Файла с расширением *.ASM в объектный Файл, содержащий программу в машинном коде с расширением *.OBJ. Так же на этом этапе может быть создан листинг программы. Файл с расширением *.LST, в котором содержится основная информация о программе, а так же Файл перекрёстных ссылок с расширением *.CRF. На этом этапе происходит проварка текста программ на наличие ошибок. Ассемблирование осуществляется при помощи программы транслятора TASM.EXE (ASM.EXE – в ассемблере, MASM.EXE - в макроассемблере). TASM [опции] *.ASM [,,] - команда для выполнения трансляции. Если в команде указана одна запятая, то Файл листинга Формируется. В TASM имеются две опции: /ZI и /N. Они вызываются: ТАSМ.
5. Компоновка. На этом этапе создается перемещаемая программа способная загружаться а любую область памяти. Сохраняется в Файле с расширением *.ЕХЕ или *.СОМ. Для этого используется TLINK.exe (для макроассемблера LINK.EXE). Имеются опции: /Т и /X.
6. Выполнение и отладка (DEBUG).
7. Занесение машинного кода программы в ПЗУ (может отсутствовать) Теперь мы посмотрим блок-схему нашей программы, то есть упорядоченные действия.
;ПРОГРАММА ПЕРЕВОДА ДЕСЯТИЧНОГО ЧИСЛА В;ДВОИЧНУЮ И ШЕСТНАДЦАТЕРИЧНУЮ СИСТЕМЫ;СЧИСЛЕНИЯ
.MODEL small
.STACK 64
.DATA
;Сегмент данных
;____________________________________________________________________
;Таблица преобразования “цифра – ASCII-код”
org 100h
tabl_ascii db '0123456789abcdef'
;____________________________________________________________________
;Таблица преобразования “ASCII-код - цифра”
org 130h
db 0,1,2,3,4,5,6,7,8,9
org 41h
db 0ah,0bh, 0ch, 0dh, 0eh, 0fh
;____________________________________________________________________
;Резервация и инициализация переменных в памяти
org 150h
x_ascii db 20h dup(?)
t1 db 0dh,0ah,"Введите число и нажмите Enter"
db 0dh, 0ah, "$"
t2 db 0dh,0ah,"Вы ввели число”,0dh,0ah "$"
t3 db 0dh, 0ah, "В двоичной системе оно выглядет так"
db 0dh,0ah,"$"
t4 db 0dh, 0ah, "В шестнадцатеричной так"
db 0dh, 0ah, "$"
buf db 16 dup(?),"$"
t5 db 0dh,0ah, "Будем продолжать процесс? (Y/N)?"
db 0dh,0ah,"$"
;____________________________________________________________________
;Сегмент кодов
.CODE
;Главная процедура
g_k proc
mov ax,@data
mov ds, ax
mov es, ax
d: lea dx, t1
mov ah,09h
int 21h
lea di, x_ascii
call ink
call des_2
push ax
lea dx,t3
mov ah,9h
int 21h
pop ax
call bin_dis
push ax
lea dx,t4
mov ah,9h
int 21h
pop ax
call outhex
lea dx,t5
mov ah,9h
int 21h
mov ah,1h
int 21h
cmp al,"Y"
loope d
cmp al,"y"
loop d
mov ah,4ch
int 21h
g_k endp
ink proc
;Процедура ввода десятичного числа
xor cx,cx
l1:
mov ah,1
int 21h
stosb
inc cx
cmp al,0dh
jnz l1
dec cx
ret
ink endp
dis proc
;Процедура вывода на экран десятичного числа
r1: mov dl,[di]
mov ah,2
int 21h
inc di
loop r1
ret
dis endp
des_2 proc
;Перевод числа(десятичного) в двоичную систему
mov si,10
lea di,x_ascii
sub ax,ax
v1: mul si
mov bp,ax
mov al,[di]
sub al,48
inc di
mov ah,ch
add ax,bp
loop v1
ret
des_2 endp
bin_dis proc
;Процедура вывода на экран двоичного числа
lea di,buf
mov cx,16
mov bx,ax
mov dx,ax
conv:
mov al,ch
shl dx,1
adc al,'0'
stosb
loop conv
mov ah,9h
lea dx,buf
int 21h
mov ax,bx
ret
bin_dis endp
;Процедура перевода числа(двоичного)в шестнадцатеричную
;и вывод его на экран
outhex:
mov ch,al
mov al,ah
mov ah,2
call prnbh
mov al,ch
prnbh:
mov dh,al
shr al,1
shr al,1
shr al,1
shr al,1
call prnd
mov al,dh
and al,15
prnd:
or al,48
cmp al,58
jc prnc
add al,7
prnc:
mov dl,al
int 33
ret
end g_k
Примечания:
Ниже приведины команды использовались в программе:
sub – двоичное вычитание. Вычитается из первого операнда содержимое второго операнда
Мнемоника: sub <операнд 1>,<операнд 2>
call – вызов процедуры. Передает управление процедуре адрес которой задан операндом, после завершения процедуры, выполнение продолжается командой следующей за командой call
Мнемоника: call <имя процедуры>
ret – возврат к процедуре
shr – сдвинуть логически вправо
xor – исключающее ИЛИ
Мнемоника: xor <операнд 1>,<операнд 2>
lea – загрузить ЕА
Мнемоника: lea reg,<операнд>
push – включить в stack
Мнемоника: push <операнд>
pop – извлечь из stack
Мнемоника: pop <операнд>
mov – переслать
Мнемоника: mov <приемник>,<источник>
inc – увеличение на 1
Мнемоника: inc <операнд>
dec – уменьшение на 1
Мнемоника: dec <операнд>
stosb – пересылает соединения регистра al или ax на который указывает регистр di
loop – команда организации цикла со счетчиком, также короткие переходы (127б) команда уменьшает значение счетчика cx, без изменения каких-либо флагов, если соединение cx >0, то осуществляется переход на заданную метку, в противном случае цикл завершается.
Мнемоника: loop <метка>
.CODE – открывает сегмент кода
.DATA -- открывает сегмент данных
.STACK N –определяет сегмент stack(а); дерективы закрытия сегментов в этом случае не используются; N – показывает размер stack(a) в байтах
Примечание: при использовании таких деректив регистр ds инициализируется следующим образом: mov ax,@data
mov ds,ax
assume в этом случае не используется
Список литературы
1. "Я зык ассемблера для IBM PC и программирования" Высшая школа 1992.
2. "Персональный компьютер Фирмы IBM и операционная система MS-DOS" Радио и связь 1991.
3. Илюшечкин В.Н., Костин А.Е, Хохлов М.М. “Системное программное обеспечение“, М., “Высшая школа”, 1987 г.
4. Нортон П., Соухэ Д. “Язык ассемблера для IBM PC”, М., Издательство “Компьютер”,1993