Вы здесь: HomeУрокиУрок 2. Переменные в ассемблере и работа с ними

Урок 2. Переменные в ассемблере и работа с ними

Снова приветствую Вас на нашем сайте по языку ассемблер, и представляю второй урок в котором мы рассмотрим как делать ввод и вывод строки на ассемблере, а также поговорим о переменных и как их объявлять.

Перемеренные 

Предложения языка ассемблера делятся на команды и псевдокоманды (директивы). Команды ассемблера — это символические имена машинных команд, обработка их компилятором приводит к генерации машинного кода. Псевдокоманды же управляют работой самого компилятора. На одной и той же аппаратной архитектуре могут работать различные ассемблеры: их команды обязательно будут одинаковыми, но псевдокоманды могут быть разными.

Так вот объявление переменных осуществляется с помощью псевдокоманд. Переменная это по сути область памяти с которой мы работаем. Для того чтоб объявить ее используют директивы (псевдокоманды) DB, DW DD,DQ и DT . Вернее эти директивы просто говорят ассемблеру что нужно заполнить память указанным количеством байт, а также чем именно заполнить.

  • DD  - говорит что нужно выделить 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 

Давайте теперь рассмотрим пример программы которая выводит строку на экран:

.model small
.data ;начало сегмента даты
tempstr     DB "Hello World! $"
.code ;начало сегмента кода
main: ;начало нашей программы

mov ax, @data ; настраивается сегментный регистр, вносим адрес сегмента даты в AX
mov ds, ax ; а затем с АХ помещаем адрес в DS чтоб можно было работать с переменными которые в ;сегменте даты

mov ah, 09
mov dx, offset tempstr ; вывод сообщения
int 21h

mov ax,4c00h ; выход
int 21h

end main


Как собрать и выполнить программы мы рассматривали в первом уроке по ассемблеру.

Ввод строки

Для ввода строк предусмотрено множество функций. Мы для примера возьмем все тоже прерывание DOS 21h в котором есть функция под номером 0ah. Данная функция принимает строку первый элемент которой число которое указывает за максимальное количество вводимых символов, а на выходе второй элемент будет указывать на количество введенных пользователем символов. 

|5|0|0|0|0|0|0|0|$|  наша строка на начале ввода, и затем мы ввели HELLO

|5|5|H|E|L|L|O|#|$| такая строка у нас получается на выходе.

И это все нужно учитывать! Для вывода  нам нужно к адресу строки прибавить 2 чтоб мы вывели суму введенную строку.  Вот пример программы которая принимает строку а затем выводит ее на экран: 

.model small
.data

 
EnterS DB "Enter String:$"
endl     DB 10,13,'$'
buf db  20 dup('$')

.code
main:

mov ax, @data ; настраивается сегментный регистр
mov ds, ax

mov ah, 9
mov dx, offset EnterS 
int 21h

mov ah, 0ah
mov dx, offset buf 
int 21h

mov ah, 9
mov dx, offset endl
int 21h

mov ah, 09
mov dx, offset buf 
add dx,2
int 21h

mov ah, 9
mov dx, offset endl 
int 21h

mov ax,4c00h ; выход
int 21h

end main

Результат работы программы:

Ввод и вывод строки, ассемблер

В программе есть для вас новая директива DUP. К примеру если Вам нужно ввести 100 одинаковых символов или вам просто требуется выделить память для того чтоб ее потом использовать вот для этого и служит эта директива. В данном примере мы выделили 20 байт которые заполнили символом $ . Эта переменная из 20 байт служила для того чтоб в нее вводилась строка.  И обратите внимание когда мы выводим нашу введенную строку , сначала мы получаем адрес ее а потом прибавляем  2 с помощь команды AAD, про которую мы поговорим в следующем уроке, для того чтоб пропустить 2 первых элемента которые нужны для ее ввода.

 На этом второй урок из цикла уроки ассемблера окончен. Желаю успехов Вам! 

Добавить комментарий


Защитный код
Обновить