Примітка. Якщо шістнадцяткове число починається з букви, перед нею необхідно записати 0 (нуль), інакше воно сприймається як деяке логічне ім’я!
Приклад :
(lab1_1.asm)
Програма виконує наступні дії:
result:= val1+ val2
Примітка. Змінні програми згідно директиви db мають тип byte. Червоним кольором позначені команди, що обчислюють суму.
data SEGMENT byte
val1 db 3
val2 db 2
result db ?
data ENDS
code SEGMENT
ASSUME cs:code, ds:data
; assume інформує Асемблер про зміст
; сегментних регістрів
begin:
mov ax,data ; адреса сегменту даних
mov ds,ax ; завантаження в регістр DS
mov al,val1 ; завантаження регістра AL вмістом
; комірки пам'яті val1
add al,val2 ; додавання вмісту регістру AL і
; вмісту комірки пам'яті val2
; результат відсилається в регістр AL
mov result,al ; пересилання результату з регістра AL
; в комірку пам'яті result
mov ax,4c00h ; вихід в MS-DOS
int 21h
code ENDS
end begin
Приклад:
(lab1_2.asm)
В сегменті кодів програми визначені різні змінні: 6 символьних рядків ms1… ms6; масив adrms1 вказівників на ці рядки (їхніх адрес), а також інші змінні, які не використовують процедури програми. Вони наведені як приклад визначення (корисно ознайомитися).
Процедура show програми послідовно виводить на екран рядок за рядком, використовуючи для цього масив adrms1 (команди циклу позначені червоним кольором).
data SEGMENT ; початок сегменту даних
; ms1… ms6 – символьні рядки
ms1 db 'Іванов Віктор Сергійович',0dh,0ah,'$'
ms2 db 'Рік народження - хххх',0dh,0ah,'$'
ms3 db 'Місяць - хх, дата - хх ',0dh,0ah,'$'
ms4 db 'Відділення ********',0dh,0ah,'$'
ms5 db 'Група - хх ',0dh,0ah,'$'
ms6 db 'хх.хх.хххх',0dh,0ah,'$' ; число, місяць, рік
; adrms1 – масив вказівників на символьні рядки
adrms1 dw ms1,ms2,ms3,ms4,ms5,m6
; інші змінні
s_char db '1' ; одиничний символ
string db "0123456789" ; символьний рядок
date db 12,29 ; дата у вигляді послідовності з
; двох байтів
positive dw 1029 ; слово
negative dw -1029 ; слово даних з від'ємним знаком
adrseg dd data:ms2 ; повна адреса поля ms2
offset_adr dw ms2 ; відносна адреса (зміщення)
; змінної ms2
data ENDS ; кінець сегменту даних
stack SEGMENT stack ; початок сегменту стеку
dw 20 dup (?) ; 20 машинних слів сегмента стеку
stack ENDS ; кінець сегменту стеку
code SEGMENT ; початок сегменту кодів
ASSUME ds:data,cs:code,ss:stack
main PROC FAR ; початок основної програми
mov bx,data ; завантаження адреси
; сегменту даних
mov ds,bx ; в DS
; --------------кінець секції ініціалізації--------------
call show ; звернення до підпрограми
; відображення
mov ax,4c00h ; вихід в MS-DOS
int 21h
main ENDP ; кінець головної процедури
; show - підпрограма виводить на екран інформацію,
; представлену в ms1 - ms6 (по одному повідомленню в
; циклі)
show proc ; початок програми відображення
mov cx,6 ; завантаження лічильника циклів
xor ax,ax ; очищення акумулятора
mov bx,offset adrms1 ; завантаження зміщення масиву
; адрес повідомлень
; цикл виведення
beg: mov dx,[bx] ; завантаження адреси чергового
; повідомлення
mov ah,9 ; завантаження коду функції DOS
; для виведення повідомлення
int 21h ; виклик функції DOS
add bx,2 ; обчислення адреси наступного
; повідомлення
loop beg ; організація циклу виведення
ret ; вихід з локальної процедури
show ENDP ; кінець підпрограми відображення
code ENDS ; кінець сегменту кодів
END main ; кінець програмного модуля
Приклад :
(lab1_3.asm з помилками)
Програма виконує наступні обчислення:
a1:= 0bbbbh
b:= a1+1111h-a2
Примітка. Використані регістри ax (word), al (byte), ds (word); змінні програми згідно директиви dw мають тип word.
data SEGMENT
a1 dw ?
a2 dw 5555h
b dw ?
ENDS
code
ASSUME cs:code, ds:data
begin:
mov ax,data
mov ds,ax
mov a13,0bbbbh ; присвоєння a1 значення 0bbbbh
mov ax,a1 ; запис (копіювання) a1 у регістр ax
add ax,1111h ; збільшення вмісту ax на 1111h
sub al,a2 ; зменшення вмісту ax на значення a2
mov b,ax ; запис результату в змінну b
code ENDS
mov ax,4c00h
int 21h
end begin
