Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab13.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
445 Кб
Скачать
☆

Примітка. Якщо шістнадцяткове число починається з букви, перед нею необхідно записати 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

  

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]