Міністерство РФ по зв'язку та інформатизації
Поволзька державна академія телекомунікацій
та інформатики
Кафедра «ОБЧИСЛЮВАЛЬНА ТЕХНІКА»
Контрольна робота
З ПРЕДМЕТУ
«Організація ЕОМ та систем»
Самара
2009
Програма копіювання рядка в зворотному порядку
Скласти програму копіювання рядки з 15 символів у поруч розташовану область пам'яті, але в зворотному порядку.
Для цього ми створюємо два рядки. Одна виконує роль джерела даних, а інша - приймач. Потім ми визначаємо адресу джерела і одержувача за допомогою команди Lea, яка є альтернативою оператору асемблера offset. На відміну від offset команда lea допускає індексацію операнда, що дозволяє більш гнучко організувати адресацію операндів. Так як нам потрібно заповнити пам'ять у зворотному порядку, то ми відразу зміщуємо адресу приймача DI на 15 байтів. Організовуємо цикл і за допомогою проміжного регістра AL заносимо наші символи в регістр DI, зменшуючи, з кожним кроком, байти запису. Після того, як лічильник CX зменшиться до 0, програма завершить свою роботу
Лістинг ЗАВДАННЯ «Програмування рядки у зворотному порядку»
Завдання 17
Data Segment; відкрити сегмент даних
text1 DB 'My name Valerij', 13, 10, '$'
text2 DB 25 DUP (?); рядок одержувач
Data ENDS; Закрити сегмент даних
;-----------------------------------------------
STK Segment; відкрити сегмент даних
DB 100 DUP (?); Зарезервувати під стік 100 осередків пам'яті
STK ENDS; закрити сегмент стека
;------------------------------------------------- -
ASSUME SS: STK, CS: CODE, DS: DATA; призначити сегментні регістри
;------------------------------------------------- ----
CODE Segment; відкрити сегмент коду
START: mov AX, DATA; завантаження сегментного регістра DS
mov DS, AX; регістра DS
lea SI, TEXT1; початковий адреса рядка-джерела занести в SI
lea DI, TEXT2; початковий адреса рядка одержувача занести в DI
mov CX, 15; переслати 15 байтів
Metka1: mov AL, [SI]; виконати пересилання
mov [DI + 15], AL; через проміжний регістр AL
INC SI; збільшити адресу джерела на 1
DEC DI; зменшити адресу джерела на 1
LOOP Metka1; (CX) -1, повторити цикл поки CX не дорівнює 0
mov AL, 0; завершити програму через
mov AH, 4Ch; системну функцію повернення
int 21h; в DOS
CODE ENDS; закрити сегмент коду
END START; закрити програму
Програма копіювання рядка на пряму
Скласти програму виробляє копіювання рядки з 15 символів у розташовану поруч область пам'яті.
Завдання, практично ідентична попередньої. За винятком способу пересилки рядка. У даному випадку нам вже не потрібно вести запис у зворотному порядку. Також, створюємо два рядки. Одна виконує роль джерела даних, а інша - приймач. Потім ми визначаємо адресу джерела і одержувача за допомогою команди Lea. Приймач DI на 15 байтів більше не зміщуємо.
Організовуємо цикл і за допомогою проміжного регістра AL заносимо наші символи в регістр DI. При кожному кроці байти будемо збільшувати в регістрі DI на один. Після того, як лічильник CX зменшиться до 0, програма завершить свою роботу.
Лістинг ЗАВДАННЯ «Програма копіювання рядка на пряму»
Задача 1
Data Segment; відкрити сегмент даних
text1 DB 'abcdefghijklmno', 13, 10, '$'
text2 DB 25 DUP (?); рядок одержувач
Data ENDS; Закрити сегмент даних
;-----------------------------------------------
STK Segment; відкрити сегмент даних
DB 100h DUP (?); Зарезервувати під стік 100 осередків пам'яті
STK ENDS; закрити сегмент стека
;------------------------------------------------- -
ASSUME SS: STK, CS: CODE, DS: DATA; призначити сегментні регістри
;------------------------------------------------- ----
CODE Segment; відкрити сегмент коду
START: mov AX, DATA; завантаження сегментного регістра DS
mov DS, AX; регістра DS
lea SI, TEXT1; початковий адреса рядка-джерела занести в SI
lea DI, TEXT2; початковий адреса рядка одержувача занести в DI
mov CX, 15; переслати 15 байтів
Metka1: mov AL, [SI]; виконати пересилання
mov [DI], AL; через проміжний регістр AL
INC SI; збільшити адресу джерела на 1
INC DI; збільшити адресу приймача на 1
LOOP Metka1; (CX) -1 повторити цикл поки CX не дорівнює 0
mov AL, 0; завершити програму через
mov AH, 4Ch; системну функцію повернення
int 21h; в DOS
CODE ENDS; закрити сегмент коду
END START; закрити програму