Снова приветствую Вас на нашем сайте по языку ассемблер, и представляю второй урок в котором мы рассмотрим как делать ввод и вывод строки на ассемблере, а также поговорим о переменных и как их объявлять.
Перемеренные
Предложения языка ассемблера делятся на команды и псевдокоманды (директивы). Команды ассемблера — это символические имена машинных команд, обработка их компилятором приводит к генерации машинного кода. Псевдокоманды же управляют работой самого компилятора. На одной и той же аппаратной архитектуре могут работать различные ассемблеры: их команды обязательно будут одинаковыми, но псевдокоманды могут быть разными.
Так вот объявление переменных осуществляется с помощью псевдокоманд. Переменная это по сути область памяти с которой мы работаем. Для того чтоб объявить ее используют директивы (псевдокоманды) DB, DW DD,DQ и DT . Вернее эти директивы просто говорят ассемблеру что нужно заполнить память указанным количеством байт, а также чем именно заполнить.
DB — говорит что нужно выделить 1 байт.
DW — что два байта (define word — определить слово)
DD — определить двойное слово (четыре байта)
DQ -определить восемь байт или четыре слова
DT -определить десть байт
К примеру чтоб объявить перемененную на ассемблере в 1 байт которая будет равна 10:
имя_переменной DD 10
Все наши перемеренные должны быть облеплены в сегменте данных нашей программы. А также нужно явно определить сегментный регистр даты (DS) чтоб он указывал на область памяти где находятся наши переменные. С переменными можно работать как и с регистрами. К примеру чтоб занести значение в переменную можно воспользоваться командой MOV :
mov ax,100 ; mov temp,ax ;теперь наша переменная равна 100(прошу обратить внимание что в данном случае переменная должна равняться два байта )
Я думаю Вы уже за метели что в тексте программы ассемблера часто встречаться точка с запятой, так вот это комментарии, вернее все то что после точки запятой к примеру: команда ; комментарий
Теперь давайте рассмотрим ситуацию когда нам нужно объявить строку, для это нужно всего навсего написать такой код:
tempstr DB «hello world$»
Код выше что мы объявили строку в 12 байт! Прошу Вас заметить что при работе со строками в DOS символ $ является концом строки.
Для вывода строк используется прерывание 21h и его 9я функция. То есть регистр AH должен содержать номер функции а регистр DX должен хранить адрес переменной которую хотим вывести на экран. Для того чтобы поучить адрес переменно используется директива OFFSET. К примеру чтоб внести в DX адрес переменной tempstr нужно выполнить следующее:
MOV DX, OFFEST tempstr
Давайте теперь рассмотрим пример программы которая выводит строку на экран:view source
01
.model small
02
.data ;начало сегмента даты
03
tempstr DB "Hello World! $"
04
.code ;начало сегмента кода
05
main: ;начало нашей программы
06
07
movax, @data ; настраивается сегментный регистр, вносим адрес сегмента даты в AX
08
movds, ax; а затем с АХ помещаем адрес в DS чтоб можно было работать с переменными которые в ;сегменте даты
09
10
movah, 09
11
movdx, offset tempstr ; вывод сообщения
12
int21h
13
14
movax,4c00h ; выход
15
int21h
16
17
end main
Как собрать и выполнить программы мы рассматривали в первом уроке по ассемблеру.
Ввод строки
Для ввода строк предусмотрено множество функций. Мы для примера возьмем все тоже прерывание DOS 21h в котором есть функция под номером 0ah. Данная функция принимает строку первый элемент которой число которое указывает за максимальное количество вводимых символов, а на выходе второй элемент будет указывать на количество введенных пользователем символов.
|5|0|0|0|0|0|0|0|$| наша строка на начале ввода, и затем мы ввели HELLO
|5|5|H|E|L|L|O|#|$| такая строка у нас получается на выходе.
И это все нужно учитывать! Для вывода нам нужно к адресу строки прибавить 2 чтоб мы вывели суму введенную строку. Вот пример программы которая принимает строку а затем выводит ее на экран:
view source
01
.model small
02
.data
03
04
05
EnterS DB "Enter String:$"
06
endl DB 10,13,'$'
07
buf db20 dup('$')
08
09
.code
10
main:
11
12
movax, @data ; настраивается сегментный регистр
13
movds, ax
14
15
movah, 9
16
movdx, offset EnterS
17
int21h
18
19
movah, 0ah
20
movdx, offset buf
21
int21h
22
23
movah, 9
24
movdx, offset endl
25
int21h
26
27
movah, 09
28
movdx, offset buf
29
adddx,2
30
int21h
31
32
movah, 9
33
movdx, offset endl
34
int21h
35
36
movax,4c00h ; выход
37
int21h
38
39
end main
Результат работы программы:
Ввод и вывод строки, ассемблер
В программе есть для вас новая директива DUP. К примеру если Вам нужно ввести 100 одинаковых символов или вам просто требуется выделить память для того чтоб ее потом использовать вот для этого и служит эта директива. В данном примере мы выделили 20 байт которые заполнили символом $ . Эта переменная из 20 байт служила для того чтоб в нее вводилась строка. И обратите внимание когда мы выводим нашу введенную строку , сначала мы получаем адрес ее а потом прибавляем 2 с помощь команды AAD, про которую мы поговорим в следующем уроке, для того чтоб пропустить 2 первых элемента которые нужны для ее ввода.
На этом второй урок из цикла уроки ассемблера окончен. Желаю успехов Вам!