Создание программы на языке Ассемблер



Открыв окно интегрированной оболочки (asm.bat), создайте новый файл (File/New), присвоив ему имя 1.asm. Наберите следующую программу

 

; команды пересылки

; задача: скопировать таблицу чисел

; из одной области памяти в другую

 

stack1 segment stack ; сегмент стека

db 100h dup (?) ; резервирование места в памяти

stack1 ends

 

dseg segment para ; сегмент данных

source db 10,20,30,40 ; исходная таблица

dest db 4 dup (?) ; место под результирующую таблицу

dseg ends

 

cseg segment ; сегмент кода

assume cs: cseg, ds: dseg, ss: stack1 ; связь сегментов с регистрами

our_prog: ; точка входа программы

mov ax,dseg ; инициализация регистра DS

mov ds,ax

; здесь команда mov используется для пересылки регистр/регистр

 

; присвоить элементам таблицы dest нулевые начальные значения,

mov dest,0 ; обнуление первого байта

mov dest+1,0 ; обнуление второго байта

mov dest+2,0 ; и т.д.

mov dest+3,0

; здесь команда mov используется для пересылки константы в ячейку памяти

 

; копирование таблицы source в таблицу dest

mov al,source

mov dest,al

mov al,source+1

mov dest+1,al

mov al,source+2

mov dest+2,al

mov al,source+3

mov dest+3,al

 

;здесь команда mov используется для пересылки ячейка памяти/регистр и  ;регистр/ячейка памяти. Непосредственно между двумя ячейками памяти пересылку данных ;осуществлять нельзя. 

 

; завершение работы программы

mov ah,4ch 

int 21h ;очистка памяти

 

cseg ends ; конец сегмента кода

end our_prog ; конец программы

 

Откомпилируйте (Run/Compile) и скомпонуйте (Run/Link) созданную программу.

Запустите отладчик (debug.bat) и откройте файл 1.exe. Пройдите программу по шагам, нажимая клавишу F8. Для просмотра регистров процессора и содержимого сегмента данных перед первым шагом откройте окно состояния процессора (View/CPU). Обратите внимание, что все значения приведены в 16-ричном коде. Так, например, исходная таблица выглядит как 0A 14 1E 28, что соответствует десятичным числам 10 20 30 40.

 

Типы данных «байт» и «слово»

 

Оператор db в сегменте данных определяет следующие за ним данные как имеющие тип «байт». Если этот оператор заменить на dw, то данные будут обозначать тип «слово» (2 байта). Оператор mov одинаково успешно копирует оба типа данных, однако при копировании типа «слово» следует помнить, что арифметические операции с адресами приводят к адресу байта, а не слова.

Составьте и откомпилируйте программу 1-1.asm.

 

; команды пересылки

; задача: скопировать таблицу чисел

; из одной области памяти в другую

 

;отличие от 1.asm - копирование слов, а не байтов

 

stack1 segment stack ; сегмент стека

db 100h dup (?) ; резервирование места в памяти

stack1 ends

 

 

dseg segment para ; сегмент данных

source dw 10,20,30,40 ; исходная таблица

dest dw 4 dup (0ffffh); место под результирующую таблицу

dseg ends

 

cseg segment ; сегмент кода

assume cs: cseg, ds: dseg, ss: stack1 ; связь сегментов с регистрами

our_prog: ; точка входа программы

mov ax,dseg ; инициализация регистра DS

mov ds,ax

; здесь команда mov используется для пересылки регистр/регистр

 

; присвоить элементам таблицы dest нулевые начальные значения,

mov dest,0 ; обнуление первого слова

mov dest+2,0 ; обнуление второго слова

mov dest+4,0 ; и т.п.

mov dest+6,0

 

; здесь команда mov используется для пересылки константы в ячейку памяти

 

; копирование таблицы source в таблицу dest

 

mov ax,source

mov dest,ax

mov ax,source+2

mov dest+2,ax

mov ax,source+4

mov dest+4,ax

mov ax,source+6

mov dest+6,ax

; здесь команда mov используется для пересылки ячейка памяти/регистр и ; регистр/ячейка памяти. Непосредственно между двумя ячейками памяти   ; пересылку данных осуществлять нельзя. 

 

; завершение работы программы

mov ah,4ch 

int 21h

 

cseg ends ; конец сегмента кода

end our_prog ; конец программы

 

Пройдите программу по шагам, особое внимание обращая на дамп памяти. Размещение исходных данных имеет вид 0A 00 14 00 1E 00 28 00, демонстрируя общий принцип адресации слов в памяти для процессоров фирмы Intel: младшие байты слов размещены в младших адресах. Таким образом, число 10 имеет вид не 000A, а 0A00.

 

Самостоятельная работа

 

1. Напишите программу, копирующую 5 байтов (100, 110, 120, 130, 140) из одной области памяти в другую в обратном порядке.

  1. Напишите программу, копирующую 5 слов (1000, 2000, 3000, 4000, 5000) из одной области памяти в другую в обратном порядке.

3. Напишите программу, копирующую символы Вашей фамилии из одной области памяти в другую. Указание. Для задания исходной таблицы достаточно, например, написать

source db ‘Ivanov’.

 

 

Косвенная адресация. Циклы.

Наберите следующую программу (2.asm):

 

; Задача: скопировать строку из N байтов

; из одной области памяти в другую

 

stack1 segment stack ; сегмент стека

db 100h dup (?) ; резервирование места в памяти

stack1 ends

 

dseg segment para ; сегмент данных

source db 'Assembler is the best' ; исходная строка (21 символ)

dest db 21 dup (?) ; место под результирующую строку

dseg ends

 

cseg segment ; сегмент кода

assume cs: cseg, ds: dseg, ss: stack1 ; связь сегментов с регистрами

 

start: ; точка входа программы

mov ax,dseg ; инициализация регистра DS

mov ds,ax

     

mov cx,21 ; в cx - количество копируемых символов

lea si,source ; в si - адрес (смещение) начала строки-источника

lea di,dest ; в di - адрес (смещение) начала строки-приемника

cycle: ; начало цикла

mov al,[si] ; в al занести байт по адресу si

mov [di],al ; из al занести байт по адресу di

inc si ; увеличить si на 1 (перйти к следующему символу)   

inc di ; увеличить di на 1 (перйти к следующему символу)     

loop cycle ; уменьшить cx на 1; если cx>0, перейти на метку cycle

 

; завершение работы программы

mov ah,4ch 

int 21h

 

cseg ends ; конец сегмента кода

end start ; конец программы

 

Обратите внимание на следующие участки программы:

  • Оператор lea si,source заносит в регистр si адрес участка памяти source. Адрес состоит из двух частей (сегмент/смещение). В регистре si находится смещение адреса. Сегментная часть адреса находится в регистре ds. Таким образом, полный адрес этого участка может быть записан как ds:si
  • Оператор mov al,[si] заносит в регистр al байт из участка памяти по адресу ds:si. Такой способ указания адреса называется косвенной адресацией.
  • Обратите внимание на организацию цикла со счетчиком. Он состоит из трех шагов:

1. Занести в регистр cx количество шагов цикла

2. Начало цикла обозначить меткой

3. В конце цикла записать оператор loop <метка>

При прохождении цикла по шагам выбирайте пункт Trace into (клавиша F7). Нажатие клавиши F8 приведет к выполнению цикла целиком.

 

Самостоятельная работа.

  1. Напишите программу, заносящую последовательно числа 1000, 1001, 1002 ... 1010 в ячейки памяти. Указание: задайте эти ячейки как
    dest dw  11 dup(?). При написании программы обратите внимание на особенности работы со словами.

2. Напишите программу, копирующую строку1 в строку2, а строку2 - в строку3. Примите, что все три строки содержат равное количество символов. Например, эти строки можно обозначить как
stroka1       db   ‘Stroka nomer 1'
stroka2       db   ‘Vtoraja stroka’

stroka3                   db   14 dup(?)

Указание. Для сохранения адресов используйте регистры si, di и bx.

 

 


Дата добавления: 2018-04-04; просмотров: 1018; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!