Операційна система Windows. Системне програмування в MASM.

Зміст

 

Операційна система Linux (Ubuntu ). Системне програмування в

shell – інтерпретаторі………...………..……………………………………….…3

Графічний інтерфейс користувача Linux……..…………………............3

Система X Window….………………..…….………………………3

Менеджери вікон…………………….……………………..………..4

Робочі столи користувача …………….……….……………….....5

Загальні відомості про робочі столи користувача в

Linux ………………….………………………………………………5

Робочий стіл KDE ……………………………………….. 6

Робочий стіл GNOME ………………………..…………… 6

Завдання 1……………………………………………………………. 8

Постановка задачі ………………………………………… .. 8

Алгоритм вирішення задачі …………….…………………. 8

Код програми…………..…………………………………….. 9

Операційна система Windows. Системне програмування в MASM………..10

Флаговий регістр………………………………………………….. 10

Команда порівняння..……...……………………………………….12

Завдання 2……….………………………………………………… 13

Постановка задачі ………………………………………… 13

Алгоритм вирішення задачі …………….…………………13

EXE модуль програми…………..…………………….……13

COM модуль програми………..…..…………………….….15

Завдання 3………………………………………………………… 15

Постановка задачі ………………………………………… 16

Алгоритм вирішення задачі …………….…………………16

Код програми ……….…………..…………………….……17 Список використаної літератури………………………………………..19

 

 

 
 


Операційна система Linux (Ubuntu ). Системне програмування в shell – інтерпритаторі.

 

Графічний інтерфейс користувача Linux

Система X Window

Система X Window версії 11 (далі X Window або Х11) – це бібліотека графічних програм, що використовується для створення графічного інтерфейсу користувача в операційній системі Linux.

В основу X Window покладена мережна архітектура типу “клієнт-сервер”, проте її реалізація відрізняється від загальноприйнятих уявлень. В функції Х-клієнта, який може знаходитись на будь-якій машині комп’ютерної мережі, входить обробка даних, тобто виконання будь-якої конкретної задачі. Х-сервер приймає запити від користувача, відсилає їх Х-клієнту, а потім відображає на дисплей користувача отримані відповіді від Х-клієнта. Саме тому Х-сервер повинен працювати на локальному комп’ютері, відображаючи інформацію користувачеві, в той час як Х-клієнт може знаходитись на будь-якій машині, підключеній до мережі. До одного Х-клієнта можуть надходити запити від різних користувачів, тобто Х-клієнт стає спільно використовуваним ресурсом. Така клієнт-серверна архітектура дозволяє взаємодіяти програмам, які працюють під керуванням різних операційних систем і на різних апаратних платформах.

X Window орієнтована не тільки на мережі, в багатьох випадках Х-сервер і Х-клієнт знаходяться на одному комп’ютері. Наприклад, якщо запустити на виконання програму xcalc, тоді головна програма системи X Window, що знаходиться в каталозі /usr/X11R6/bin/X, виконує роль Х-сервера, а програма xcalc – роль Х-клієнта. Є велика кількість різноманітних Х-клієнтів, найважливішими з яких є такі:

- менеджери дисплея;

- менеджери вікон;

- робочі столи;

- стандартні програми (калькулятор, годинник і т.д.)

В Linux, як і в Unix, на одному комп’ютері є 7 умовних консолей (консоль – це сукупність “клавіатура + дисплей”). Після завантаження Linux користувач попадає в одну з консолей, а потім він може перемикатися між різними консолями і працювати в будь-якій з них. В перших шести консолях реалізований текстовий режим роботи, а в сьомій консолі працює Х-сервер. Для переходів із текстової консолі в будь-яку іншу консоль необхідно натиснути комбінацію клавіш <Alt> + <Fz> (де z=1,2,…,7), а для переходу з графічної консолі потрібно натиснути комбінацію клавіш <Ctrl> + <Alt> + <Fz>, де z=1,2,…,6.

Менеджери вікон

Менеджер вікон (інша назва – диспетчер вікон, адміністратор вікон) – це Х-клієнт, який дає можливість керувати вікнами прикладних і системних програм: змінювати їх розміри, переміщати по екрану, згортати вікна в піктограму і виконувати багато інших функцій. На основі менеджерів вікон реалізовані найбільш складні програмні продукти графічного інтерфейсу Linux – робочі столи GNOME та KDE. Проте, менеджери вікон можуть працювати і самостійно, забезпечуючи мінімальний набір послуг з керування вікнами.

Розглянемо можливості менеджерів вікон на прикладі менеджера twm (tab window manager). Завдяки малому розміру і зручності в використанні twm до цих пір широко використовується. За його допомогою легко вивчати основні функції менеджерів вікон: переміщення вікон програм, зміна розмірів вікон, згортання вікна в піктограму, виконання команд миші і клавіатури, запуск на виконання Х-клієнтів. Головне меню менеджера twm має такий вигляд:

Twm

Iconify

Resize

Move

Raise

Lower

-----------

Focus

Unfocus

ShowIconmgr

HideIconmgr

---------------

Xterm

------------- -

Kill

Delete

--------------

Restart

Exit

Наприклад, за допомогою пункту меню Xterm можна вивести на екран дисплея вікно текстового терміналу, в якому за допомогою команд операційної системи можна далі викликати будь-якого іншого Х-клієнта, чи виконати ще яку-небудь дію. За допомогою пункту меню Kill можна зняти з виконання Х-клієнта.

Важливою перевагою twm є можливість зміни системних функцій і додавання нових функцій у відповідності з потребами користувачів.

До найбільш відомих менеджерів вікон в Linux можна також віднести: fvwm, fvwm2, fvwm95, kwin, Enlightenment, sawfish, mvm.

Для робочого стола KDE основним менеджером вікон є kwin. Для робочого стола GNOME раніше базовим адміністратором вікон був Enlightenment (або просто Е), а тепер його замінив sawfish.

Робочі столи користувача

1.Загальні відомості про робочі столи користувача в Linux

Робочий стіл – це графічний інтерфейс користувача з операційною системою. Робочий стіл дозволяє:

переглядати в графічному режимі файлову систему і виконувати всі операції над файлами (копіювання, перейменування, вилучення тощо);

розміщувати ярлики файлів і каталогів (папок) для швидкого доступу до них;

розміщувати ярлики змінних дисків для їх монтування та доступу до їх вмісту;

розміщувати ярлики принтерів для прискорення початку друку;

зіставляти програми з файлами певного типу для їх автоматичного запуску.

Як правило, робочий стіл містить панель задач, на якій розташовуються кнопки ярликів, меню, програм і аплетів. Аплет – це невеличка вбудована програма для роботи і контролю за станом системи (наприклад: годинник, калькулятор і т.д.). Зазвичай панель задач реалізована у вигляді рядка в нижній частині екрана, хоча в більшості випадків передбачена можливість її переміщення до будь-якої сторони екрана.

Характерною особливістю робочих столів в Linux, яка відсутня у Windows, є можливість працювати з багатьма віртуальними робочими столами. На кожному із них може розташовуватись свій набір ярликів та відкритих вікон працюючих програм. Кожен віртуальний робочий стіл може мати свою гаму кольорів і рисунків, тобто ці столи функціонують незалежно один від одного.

З точки зору ОС робочий стіл - це набір Х-клієнтів та бібліотек для створення графічного інтерфейсу користувача із системою. Серед Х-клієнтів найважливішими є менеджери дисплеїв та менеджери вікон. Кожний робочий стіл має свій конкретний менеджер дисплея та конкретний менеджер вікна, тобто вони орієнтовані тільки на свій робочий стіл.

2.Робочий стіл KDE

Найбільш відомим робочим столом є KDE (K Desktop Environment – робочий стіл К). Авторські права на цей робочий стіл належать фірмі Trolltech.

Головна перевага KDE – забезпечення єдиного стандарту для всіх його складових частин і програм на основі об’єктно-орієнтованого підходу. В KDE всі елементи трактуються як об’єкти, до яких можна отримати доступ і виконати з ними певні дії.

KDE пропонує користувачеві весь спектр можливостей для керування зовнішнім видом і функціональними можливостями системи. Можна коректувати дуже багато речей – загальний фон робочого стола, вигляд кнопок та ярликів, вміст панелі або меню запуску програм та багато іншого. Для операцій настроювання робочого стола є спеціальний Центр Керування (Control Center), який дуже нагадує Панель керування у Microsoft Windows.

Завдяки використанню об’єктної графічної бібліотеки Qt, дотримується єдиний стиль при створенні кнопок, меню, перемикачів та інших атрибутів вікон. Наприклад, у всіх програмах KDE в правій частині меню розташована опція виклику довідки. Вся довідкова система витримана в єдиному форматі та стилі. У всіх програмах, кнопки, що виконують однакові функції, позначаються однаковими піктограмами. На перший погляд, це може здатись дрібницями. Але така однотипність сприяє швидкому засвоєнню нових програм, адже не завжди є можливість детального опису призначення кожного елементу.

Важливою перевагою KDE є повна підтримка всіма його програмами національних стандартів. Засоби багатомовної підтримки вбудовані безпосередньо в KDE, разом із документацією і файлами довідки.

На сьогоднішній день існує велика кількість програмних пакетів, спеціально створених для KDE. Бібліотеки KDE і Qt, які використовують мову С++, стають основою для розробки нових сучасних програм.

Найважливіше є те, що наявність однієї фірми-розробника означає високу ступінь відповідальності за свій програмний продукт, тобто високу надійність роботи KDE.

KDE – це великий проект, до складу якого в стандартному дистрибутиві входить більше сотні програм. Варто запам’ятати лише декілька із них, які є немов би “візитною карткою” KDE: менеджер дисплея kdm, менеджер вікна kwin, файловий менеджер Konqueror. Необхідно відзначити, що в кожній новій версії Linux розширюються функції Konqueror, поступово перетворюючи його із простого файлового менеджера в потужну графічну оболонку.

3. Робочий стіл GNOME

Робочий стіл GNOME був розроблений дещо пізніше, як альтернатива KDE. Основною причиною появи GNOME було побоювання, що фірма Trolltech має право заборонити вільне розповсюдження свого KDE. І хоча цього поки що не сталось, все ж був створений міжнародний проект для розробки графічного інтерфейсу, який повністю підпадає під дію загальної ліцензії GPL (тобто для вільного розповсюдження). Про це свідчить і сама назва нового робочого столу: GNOME - GNU Network Obect Model Environment (GNU – GNU’s Not Unix). Цей комплекс програм став по суті результатом співпраці багатьох програмістів-ентузіастів та фірм зі всього світу. З 2000 року координує всі роботи організація GNOME Foundation.

В GNOME основний наголос було зроблено на гнучкість, швидке оновлення компонентів, неповторність. Хоча цей робочий стіл більш динамічний, його компоненти, створені різними авторами, не завжди детально протестовані на предмет спільного користування. З однієї сторони, це полегшує налагодження GNOME, а з іншої – ускладнює сумісність різноманітних компонентів системи.

GNOME менш інтегрований порівняно з KDE, більше орієнтований на стандарт Open Source.

Якщо стиль KDE витримано в традиціях Microsoft Windows, то GNOME пропонує інтерфейс користувача, який основано на використанні менеджера вікон Enlightenment, (тепер його замінив sawfish). Для GNOME базовим менеджером дисплея є gdm, а графічною оболонкою, яка включає файловий менеджер - Nautilus.

З розвитком KDE і GNOME стало ясно, що вони будуть між собою конкурувати. Проте, і розробники KDE, і розробники GNOME прямують до того, щоб всі вказані розбіжності були непомітними для користувача і перехід від одного робочого столу до іншого не викликав великих проблем.

Як і KDE, робочий стіл GNOME пропонує такі основні функції:

- наявність головного меню для доступу до всіх програм та настроювання робочого столу;

- наявність панелі задач із кнопками для швидкого виклику необхідних програм або виконання налагоджувальних операцій;

- наявність піктограм і ярликів файлів та пристроїв;

- підтримка технології drag-and-drop для копіювання, створення посилань, переміщення або вилучення файлів і пристроїв;

- наявність пейджера для перемикання між різними віртуальними робочими столами.

Якщо на комп’ютері було інстальовано обидва розглянутих робочих столи, тоді для переходу від одного робочого стола до іншого необхідно спочатку ввести команду

switchdesk,

потім вказати ім’я нового робочого столу і виконати перезавантаження X Window. Під час нового завантаження операційної системи завжди завантажується той робочий стіл, назва якого вказана в файлі “/etc/sysconfig/desktop”. Змінити вміст цього файла може тільки адміністратор.

Завдання 1.

Написать shell сценарий, который, используя графические возможности shell, выполнял вывод информации о пользователе (ФИО, группа) , ввод строки символов и обработку строки:

Дан текст, каждый символ которого может быть буквой, цифрой или знаком “+”, “-”, “*”. Найти самую длинную группу цифр. Если таких групп несколько, то взять первую по порядку. Вывести результат на экран.

Алгоритм вирішення завдання:

1. Зчитуємо рядок символів.

1.1. В gdialog вводимо рядок символів.

1.2. Записуємо їх в файл ptext.txt.

1.3. Перевіряємо чи не введений пустий рядок.

1.4. Зчитуємо рядок з файлу ptext.txt в змінну ptext.

1.5. Виводимо введений рядок на екран.

2. Отримуємо число – кількість цифр.

2.1. Зчитуємо рядок по слову.

2.2. Знаходимо довжину слова.

2.3. Порівнюємо кожен символ слова з цифрою.

2.4. Якщо співпадають, то до $m додаємо 1.

3. Отримуємо слово з максимальною кількістю цифр.

3.1. Порівнюємо слово з максимальною к-стю цифр з даним. Якщо в даному більше цифр, то зберігаємо дане слово в змінній l.

4. Виводимо слово з максимальною к-стю цифр.

4.1. Виводимо на екран l.

4.2. Записуємо слово l в файл text1.txt.

4.3. Виводимо слово l на екран, через gdialog

Код програми:

 

#!/bin/bash

gdialog --inputbox "Введите текст" 10 60 2> ptext.txt # введення тексту та пересилання його в файл

z=0 #найбільша кількість голосних букв в слові

if [ $? -ne 1 ]; # перевірка умови

then #якщо умова виконується

ptext=$(cat ptext.txt) #в змінну зчитуємо текст з файлу

echo $ptext; # виводимо значення змінної на екран (введений текст)

for i in $ptext; # зчитуємо по слову з тексту

do

m=0

n=${#i}; # визначаємо довжину слова

k=0

while [ $k -lt $n ] #перевірка умови виконання циклу, цикл виконується поки значення змінної k буде менше від довжини слова

do

byk=${i:$k:1} #змінній byk передається значення

k-ого символу

case $byk in #оператор вибору

0|1|2|3|4|5|6|7|8|9) m=$(( $m+1 ));; # якщо змінна byk цифра

*) ;; # якщо змінна byk не цифра

esac # закінчення оператору

k=$(($k+1)) # лічильник

done

if [ $m -gt $z ] # порівняння кількості цифр у поточному слові з найбільшою їх кількістю

then z=$m # нове присвоєння найбільшої кількості цифр

l=$i # присвоєння змінній значення слова з найбільшою кількістю цифр

fi

done

fi

echo 'Slovo s naibolshem kolichestvom cufer: ' $l # вивід на екран результату

echo $l>text1.txt #запис результату в файл

gdialog --title 'Слово с наибольшим количеством цифр:'\ # заголовок діалогового вікна

--textbox ./text1.txt 10 60 2 # вивід результату у діалогове вікно

exit 0

 

Операційна система Windows. Системне програмування в MASM.

ФЛАГОВИЙ РЕГІСТР

Цей pегістр містить 16 біт прапорів, що керуються різними командами для індикації стану операції. В усіх випадках прапори зберігають своє значення доти, поки інша команда не змінить його. Флаговий регістр містить наступні дев'ять використовуваних біт (зірочками відзначені невикористовувані біти):

Номер біта: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Прапор: * * * * O D I T S Z * A * P * C

Розглянемо ці прапори в послідовності праворуч ліворуч.

CF (Carry Flag) - прапор переносу. Містить значення "переносів" (0 чи 1) зі старшого розряду при арифметичес ких операціях і деяких операціях зрушення і циклічного зрушення.

PF (Parity Flag) - прапор парності. Перевіряє молодші вісім біт результат- тов операцій над даними. Непарне число біт приводить до установки цього прапора в 0, а парне - у 1. Не варто плутати прапор парності з бітом контро- лю на парність.

AF (Auxiliary Carry Flag) - додатковий прапор переносу. Встановлюється в 1, якщо арифметична операція приводить до переносу четвертого праворуч біта (біт номер 3) у регистро виття однобайтовой команді. Даний прапор має відношення до арифметичних операцій над символами коду ASCII і до десяткових упакованим полям.

ZF (Zero Flag) - прапор нуля. Встановлюється в якості результату aрифметичних команд і команд порівняння. Як це не дивно, ненульовий результат приводить до установки нульового значення цього прапора, а нульовий - до установки одиничного значення. Існуюча невідповідність є, однак, логічно правильною, тому що 0 позначає "ні" (т.е. результат не дорівнює нулю), а одиниця позначає "так" (т.е. результат дорівнює нулю). Команди умовного переходу JE і JZ перевіряють цей прапор. SF (SIgn Flag) - знаковий прапор. Встановлюється у відповідності зі знаком результату (старшого біта) після арифметичних опеpацій: позитивний результат установлює 0, а негативний - 1. Команди умовного переходу JG і JL перевіряють цей прапор.

TF (Trap Flag) - прапор покрокового виконання. Цей прапор вам уже прихо- дилося встановлювати, коли використовувалася доманда Т в отладчике DEBUG. Якщо цей прапор встановлений в единичное cостояние, те процесор переходить у режим покрокового виконання команд, тобто в кожен момент виконується одна команда під користувальницьким керуванням.

IF (Interrupt Flag) - прапор переривання. При нульовому складаючись нии цього прапора переривання заборонені, при одиничному - дозволені.

DF (DIrection Flag) - прапор напрямку. Використовується в строкових опера- ціях для визначення напрямку передачі даних. При нульовому стані команда збільшує вмістрегістрів SI і DI, викликаючи передачу даних ліворуч праворуч, при нульовому - зменшує вміст цих регістрів, викликаючи передачу даних праворуч ліворуч (див. гл.11).

OF (Overflow Flag) - прапор переповнення. Фіксує арифметическое переповнення, тобто перенос в/из старшого (знакового) біта при знакових арифметичних операціях. Як приклад: команда CMP порівнює два операнда

і воздействуте на прапори AF, CF, OF, PF, SF, ZF. Однак, немає необхідності перевіряти всі ці прапори по окремості. У сле- прикладі, що дує, перевіряється чи містить регістр BX нульове значення:

CMP BX,00 ;Порівняння BX з нулем

JZ B50; Перехід на B50 якщо нуль. (дії при ненулі)

B50: ... ;Крапка переходу при BX=0

Якщо BX містить нульове значення, команда CMP установлює прапор нуля ZF в одиничний стан, і можливо змінює (чи немає) інші прапори. Команда JZ (перехлд якщо нуль) перевіряє тільки прапор ZF. При одиничному значенні ZF, що позначаєнульова ознака, команда передає керування на адресу, зазначений у її операнде, тобто на мітку B50.

Команда порівняння

Команда порівняння CMP порівнює два числа, віднімаючи одне з іншого. Вона не записує результат, але прапори стану установлює відповідно до результату. Ця команда змінює тільки прапори. У програмі команда порівняння використовується так само, як і команда вирахування; однак команди порівняння з заемом не існує.Порівняння з підвищеною точністю вимагає ледве більше зусиль, чим порівняння чи байтів слів. Фактично в цих випадках багато простіше використовувати команду вирахування замість команди порівняння. На рис.П4.11 показане порівняння пари 32=бітових чисел у пам'яті з використанням регістра AX у якості області тимчасового збереження. Це порівняння визначає, яке з чисел більше. Програма в результаті свого виконання встановлює коди умови. Прапор переносу визначає, яке з чисел більше: якщо прапор дорівнює 1, число VALUE більше.

Програма перевіряє два 32=бітових числа на рівність. Програма зберігає молодший результат, а потім комбінує його зі старшим, і в такий спосіб з'ясовує еквівалентність результату нулю. Команда OR описана в наступному розділі, а тут істотно те, що вона комбінує два значення так, що остаточне значення дорівнює 0 тоді і тільки тоді, коли обоє вихідних значення рівні 0. Результат цієї підпрограми порівняння - значення прапора нуля; якщо він дорівнює 1, числа рівні.

Завдання 2.

В MASMнаписать программу решения задачи. Создать EXE и COM модули.

Даны натуральное число n, целые числа a1, …, an. Найти наименьшее из четных чисел, входящих в последовательность a1 –1, a1, a2, …, an.

Алгоритм вирішення завдання:

1. Ділимо елемент масиву на 2.

2. Перевіряємо залишок .

2.1. Якщо елемент парний то порівнюємо його з мінімальним інакше переходимо до наступного елементу.

2.2. Якщо мін. ел. менший за поточний, то переходимо до наступного елементу, інакше записуємо в мін ел поточний.

3. Якщо пройшли всі елементи, то виводимо на екран мін ел.

EXE модуль програми:

assume CS:code, DS:Data

code segment

begin: mov ax,data

mov ds,ax

 

mov bl,2 ;будем делить на 2

 

mov ax,0 ;обнуляем регистры

mov si,-1

 

ii: inc si ;

cmp si,len ;сравниваем текущий индекс с длиной массива

je fin ;если они равны то мы прошли весь массив и идем на вывод

;иначе идем дальше

 

mov al,mas1[SI] ;записываем в al текущий элемент массива

div bl ;делим его 2

 

cmp ah,1 ;если остача = 1(елемент не парный),

je ii ;то переходим к следующему елементу

 

mov al,mas1[SI]

cmp min,al ;иначе сравниваем текущий елемент с минимальным

jb ii ;если он больше, то переходим к след елементу

 

mov min,al ;иначе записываем в min текущий елемент

jmp ii

 

 

fin: mov bl,10 ;вывод на екран минимального елемента

xor ax,ax

mov al,min

 

div bl

 

add al,48

add ah,48

mov bl,ah

 

mov y,al

mov ah,09h

mov dx,offset y

int 21h

 

mov y,bl

mov ah,09h

mov dx,offset y

int 21h

 

exit:

mov ah,4ch

int 21h

code ends

data segment

min db 254 ;мин ел изначально равен большому числу

len dw 10 ;к-во ел в массиве

mas1 db 14,44,11,5,64,3,123,1,44,30 ;

y db " $"

data ends

stk segment stack

db 256 dup()

stk ends

end begin

COM модуль програми:

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

begin: jmp l1

min db 254 ;мин ел изначально равен большому числу

len dw 10 ;к-во ел в массиве

mas1 db 14,44,11,5,64,3,123,1,44,30 ;

y db " $"

 

l1: mov bl,2 ;будем делить на 2

 

mov ax,0 ;обнуляем регистры

mov si,-1

 

ii: inc si ;

cmp si,len ;сравниваем текущий индекс с длиной массива

je fin ;если они равны то мы прошли весь массив и идем на вывод

;иначе идем дальше

 

mov al,mas1[SI] ;записываем в al текущий элемент массива

div bl ;делим его 2

 

cmp ah,1 ;если остача = 1(елемент не парный),

je ii ;то переходим к следующему елементу

 

mov al,mas1[SI]

cmp min,al ;иначе сравниваем текущий елемент с минимальным

jb ii ;если он больше, то переходим к след елементу

 

mov min,al ;иначе записываем в min текущий елемент

jmp ii

 

 

fin: mov bl,10 ;вывод на екран минимального елемента

xor ax,ax

mov al,min

 

div bl

 

add al,48

add ah,48

mov bl,ah

 

mov y,al

mov ah,09h

mov dx,offset y

int 21h

 

mov y,bl

mov ah,09h

mov dx,offset y

int 21h

 

exit:

mov ah,4ch

int 21h

codesg ends

end begin

 

Завдання 3.

1. В MASM32 написать программу решения задачи.

2. Ввод-вывод реализовать с использованием функций API.

 

В матрице А(m,n) первую строку поменять местами с последней, вторую с предпоследней и т.д.

 

Алгоритм вирішення завдання:

1. Записуємо і-й рядок з вхідної матриці в n-i рядок вихідної матриці де n – кількість рядків вхідної матриці .

2. Виводимо вихідну матрицю на екран.

 

 

assume CS:code, DS:Data

code segment

begin: mov ax,data

mov ds,ax

 

mov bx,row

mov ax,col

mul bx

mov dob,ax ;записываем в dob к-во елементов в матрице

mov ax,0 ;обнуляем регистры

xor cx,cx ;

 

mov cx,row

incRow: push cx ;цыкл по рядкам

mov di,cx

dec di

mov cx,col

 

 

incCol: mov si,cx ;цыкл по столбикам

dec si

 

mov bx,col ;

mov ax,di ;

mul bx ;

mov bx,ax ;

mov ax,0 ;переводим индекс из двухмерного массива в одномерный

mov al,mas1[bx][si]

 

push ax ;

mov r,di ;

mov di,row ;

dec di ;

sub di,r ;вычисляем в какой рядок матр mas2 будем присваивать рядок из матр mas1

 

mov bx,col ;

mov ax,di ;

mul bx ;

mov bx,ax ;

pop ax ;

mov mas2[bx][si],al ;присваиваем в і-й рядок матрицы mas2 n-1 рядок входной матрицы

 

loop incCol

 

pop cx

loop incRow

 

;;;;;;;;Вывод

mov si,0

mov DI,0

dec col

fin: mov bl,10

xor ax,ax

mov al,mas2[DI]

div bl ;делим число на 10

 

add al,48 ;добавляем к младшей части 48, чтобы на вывод шел символ числа

add ah,48 ;добавляем к старшей части 48

mov bl,ah

 

mov y,al ;выводим младшую часть

mov ah,09h

mov dx,offset y

int 21h

 

mov y,bl ;выводим старшую часть

mov ah,09h

mov dx,offset y

int 21h

mov bl,0 ;после каждого елемента выводим пробел

mov y,bl

mov ah,09h

mov dx,offset y

int 21h

cmp si,col

jne s

 

mov bl,10 ;после каждых col елементов выводим перевод строки

mov y,bl

mov ah,09h

mov dx,offset y

int 21h

mov si,-1

s: inc si

inc DI

cmp DI,dob

jne fin

 

mov ax,4c00h

int 21h

 

code ends

data segment

col dw 5

row dw 7

r dw 0

dob dw 0

mas1 db 2,3,2,54,66

db 4,9,51,53,10

db 8,2,5,52,70

db 2,33,2,51,1

db 2,5,9,50,10

db 7,6,5,49,0

db 8,9,2,3,4

 

mas2 db 50 dup(0)

 

y db " $"

err db "err$"

msg db ?

data ends

stk segment stack

db 256 dup()

stk ends

end begin


Використана література

 

1. Топхем Д., Чионг Х.В. Юнікс и Ксенікс. - М.: Мир, 1988. - 392 с.

2. Скловська С. Red Hat Linux 6.0 – Підручник. К.: “ДиаСофтЮП”, 1999. - 416 с.

3. Скловська С. Команди Linux: Довідник. - К.: “ДиаСофт”, 2001. - 688 с.

4. Глушаков С.В., Сурядний О.С. Linux для дома и офиса: Учебный курс. - Харьков: Фолио, 2002. – 389 с.

5. Юров В. Assembler. – Санкт-Петербург: Питер, 2001. – 622 с.

6. Пильщиков В. Н. Программирование на языке ассемблера IBM PC. – М.: Диалог-Мифи, 1999. – 286 с.

7. Ученик по основам язика Ассемблера (материалы сайта www.PowerBuilder.sbn.bz).