Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всі відповіді СП.docx
Скачиваний:
10
Добавлен:
28.01.2023
Размер:
217.28 Кб
Скачать
    1. Організувати на асемблері ехе-програму, щоб перекодувати символи строки шляхом додавання до літери строки кодів символів таблиці(Код мовою Asembler).

data segment

mes db 0ah,0dh,'code- ','$' ; перенос каретки + слово

mas db 10 dup (?) ; не ініціалізований масив з 10 елементів байт

ends

stack segment ; виділяємо стек та заповнюємо його 0

dw 128 dup(0)

ends

code segment

start:

mov ax, data

mov ds, ax

mov es, ax

xor ax,ax ; очищуємо регістр

mov cx,10 ; в сх записуємо 10 (розмір масиву) регістр для роботи з масивами

mov si,0 ; в si 0

go: ; запис в масив данні які вводяться з клавіатури

mov ah,01 отримуємо символ

int 21h

mov mas[si],al записуємо його в масив

inc si ; інкремент лічільника

loop go

; відновлюємо значення сх і si

mov cx,10

mov si,0

;вивід переносу та слова

mov ah,09h

lea dx,mes

int 21h

show: ; вивід зміненого масиву

mov ah,02h

mov dl,mas[si]

add dl,30h ; число яке додаємо до ASCII коду

int 21h

inc si

loop show

mov ax, 4c00h ; вихід з програми

int 21h

ends

end start ; кінцева точка

    1. Організувати ехе-програму , щоб перекодувати символи з однієї таблиці в іншу(код мовою асемблера).

.model small

.stack 100h

SEGM segment

assume CS:SEGM, DS:SEGM, ES:SEGM, SS:SEGM

org 100h

Begin:

;open file

mov ah,3dh ; Ф-ція для відкриття фалу

mov al, 00 ;режим відкриття (0-для зчитування, 1- для запису, 2- для зчитування і запису )

lea dx, file ;адреса рядка з іменем файла

int 21h

jc f_n_f ;cf=1 ; якщо файл не знайдений, який ми хочемо відкрити, то CF встановиться в 1 (помилка, вихід)

mov bx,ax

mov handle,bx ; вказівник на файл

;create file

mov ah,3ch ; Ф-ція для створення файлу

lea dx, sec_file ;адреса рядка з іменем файла

xor cx,cx ;обнулення регістру cx

int 21h

jc cnt_create ; CF встановиться в 1, якщо файл не можливо створити

mov bx,ax

mov handle_two,bx ; вказівник на файл

;;;;

;reading in bufer

next_char: ; будемо вибирати по одній букві із файлу. і обробляти їх відповідно

mov ah,3fh ;Ф-ція, за допомогою якою модна читати із файлу через "описатель"

mov cx,1 ; кількість байт, які ми хочемо прочитати

lea dx,bufer ; адрес буфера для зчитування

mov bx,handle ; вказівник на файл

int 21h

jc close_file ; якщо неможливо зчитати із файла, то CF встановиться в 1

cmp cx,ax ; ах - кількість прочитаних байт, якщо рівно 1, значить є чимвол ідемо на обробку..., якщо немає кінець файлу

je is_char ; ==

;not char

mov end_file,1 ;тимчасова змінна, в якій ми зберігаємо наявність кінця файлу..

mov cx,ax ;записуємо кількість обробених байтів

is_char:

mov ah,bufer ; поміщаємо символ із буфера, який ми хочемо обробити

lea bx, my_table ; встановлюємо ефективний адрес з нашою таблицею символів

mov al,ah

xlat ; отримужмо значення із таблиці в ds:bx адреса таблиці, a al номер осередку

mov bufer,al ; заносимо в буфер оброблений символ

mov ah, 40h ;Ф-ція, для запису у файл через "описатель"

mov bx,handle_two ; вказівник на файл

lea dx,bufer ; заносимо інформацію із буфера у файл

int 21h

cmp end_file,1 ; порівнюємо чи ще немає кінця файлу

je close_file ; якщо кінець, то перейти на закриття файлу

jmp next_char

;close my file

close_file:

; Ф-ції, для закриття файлів

mov ah,3eh

mov bx,handle_two

int 21h

mov ah,3eh

mov bx,handle

int 21h

jmp exit

f_n_f:

mov ah,09h

lea dx, file_not_found

int 21h

cnt_create:

mov ah,09h

lea dx, not_create_file

int 21h

exit:

mov ax,4c00h

int 21h

;data

file db 'first.txt',00

sec_file db 'second.txt',00

file_not_found db 'Error: File ', 34 ,'first.txt', 34 ,' not found$'

not_create_file db 'Error: Can not create file$'

handle dw ?

handle_two dw ?

bufer db 200 dup(?)

end_file db 0

my_table db 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuNopasdasduioqwen1234567890qwejkl-xcvbnmsdfbaAsdlfkMXvXsjkdlfnqk2-l45738euhfasAhdfa87w9heMjaskdnfau0wuftwefsdfSWFHAS'

SEGM ends

end Begin

    1. Обгрунтувати алгоритм та представити програмний код для реалізації на асемблері ехе-програму, щоб перекодувати символи строки шляход додавання до літер випадкового симвому(код мовою асемблер)

Осікльки для генерації випадковивих, або псевдовипадкових чисел в мові програмування асеблер немає вбудованих функцій, тому найбільш логічним рішенням буде використання системного часу, отримати яке ми можемо завдяки 3 перериванням

Для застосування у коді будемо обирати переривання 02h. для отрмання значення секунд, котре буде міститись у регістрі DH в коді BCD

Функція 2Ah повертає дані в шістнадцятковій формі. Наприклад, для того щоб вивести день тижня необхідно наперед підготувати строку в пам’яті із переліченими днями, вони мають мати однакову довжину, і після кожного дня потрібно записати в пам’ять знак кінця строки.

Отримавши у відповідному регістрі число дня ми множимо на довжину імені дня, таким способом ми отримаємо адрес зміщеня відповідного дня в цій строці, додавши його до адреса строки, отримаємо адрес зміщення в пам’яті, після чого можемо вивести його на екран (виведення буде до першого символа кінця строки, який ми мали заздалегідь записали в пам’ять)

Переклад чисел із двійкової системи числення в 16-річну здійснюється в такий спосіб: розряди двійкового числа групуються по 4, починаючи з молодшого, після чого кожна четвірка розрядів (тетрада) перетвориться у відповідну 16-річну цифру (у нашому випадку — у ASCII-код цієї цифри).

У процесорі 8086 немає засобів звертання до четвірок бітів, мінімальним осередком оперативної пам'яті, до якого він має доступ, є байт. Тому необхідно кожну тетраду розширити до байта і лише потім перетворювати результат у ASCII-код.

Для виділення значень окремих бітів двійкового числа застосовується операція логічного множення (AND) по масці. Наприклад, для видділенні другої по старшинству тетради двійкового слова (припустимо, регістра АХ) використовується маска 0F0h, наприклад:

відповідна асемблерна команда:

and ax, 0F0h

Для зрушення сукупності бітів щодо розрядної сітки використовуються команди логічного зрушення (зокрема, SHR — зрушення вправо). Щоб зрушити цифру З, отриману вище, можна використовувати команду

shr ax, 4 ; зрушення вправо на 4 розряди

Після того, як тетрада підготовлена, необхідно перетворити її в ASCII‑ код. Одним з методів є використання таблиці перетворення, що містить ASCII-коди преутворених цифр. При цьому номер осередку таблиці, що відповідає одній цифрі, заміняється значенням даного осередку — кодом цифри. Таблиця перетворення (трансляції) оформляється у виді набору символів цифр, записаних у порядку зростання:

tabl db '0123456789ABCDEF'

Для вибірки значення з таблиці зручно використовувати команду табличної трансляції XLAT (без операндів). Перед виконанням XLAT необхідно занести в регістри DS:BX повну адреса таблиці, а в AL — номер (n) осередку таблиці. XLAT поміщає в той же регістр AL значення n-й осередку таблиці, наприклад:

lea bx, tabl

mov al, 9

xlat ; AL = '9' = 39h

Перетворені цифри можна заносити в пам'ять або відразу виводити на екран.

Для виведення символів ми можемо користуватися будь-якою з освоєних нами функцій виводу на екран.

Код:

data segment

tabl db '0123456789ABCDEF'

mes db 0ah,0dh,'code- ','$' ; перенос каретки + слово

mas db 10 dup (?) ; не ініціалізований масив з 10 елементів байт

ends

stk segment stack ; виділяємо стек та заповнюємо його 0

dw 256 dup(?)

stk ends

code segment

start:

mov ax, data

mov ds, ax

mov es, ax

xor ax,ax ; очищуємо регістр

mov cx,10 ; в сх записуємо 10 (розмір масиву) регістр для роботи з масивами

mov si,0 ; в si 0

go: ; запис в масив данні які вводяться з клавіатури

mov ah, 01 ; отримуємо символ

int 21h

mov mas[si],al; записуємо його в масив

inc si ; інкремент лічільника

loop go

; відновлюємо значення сх і si

mov cx,10

mov si,0

;вивід переносу та слова

mov ah,09h

lea dx,mes

int 21h

show: ; вивід зміненого масиву

mov ah, 02h ; interrupts to get system time

int 1Ah ; DX now hold number of clock ticks since midnight

mov ax, dx

xor dx, dx

and al,0f0h ;множимо регістр al на маску 0f0h

shr al,4 ;здвигаємо на 4 біти вправо

lea bx,tabl ;загружаємо в BX адрес зміщення таблиці

xlat

mov ah,02h

mov dl,mas[si]

add dl,bx ; число яке додаємо до ASCII коду

int 21h

inc si

loop show

mov ax, 4c00h ; вихід з програми

int 21h

ends

end start ; кінцева точка