- •«Системне програмування и операційні системи»
- •Робота в операційній системі Linux. Програмування в середовищі shell.
- •6. Програмні структури
- •1) Теоретична частина.
- •5. Екранування.
- •6. Програмні структури
- •Умовний оператор ("if").
- •Оператор вибору ("case").
- •Оператор циклу із перерахуванням ("for").
- •Оператор циклу з істиною умовою ("while").
- •Оператор циклу з хибною умовою ("until").
- •Пустий оператор.
- •Практична частина
- •1. Завдання:
- •7. Код програми
- •Операційна система Windows. Системне програмування в masm.
- •2) Практична частина
- •2. Опис алгоритму:
- •3. Код програми
- •Операційна система Windows. Системне програмування в masm32 з використанням функцій api.
- •2) Практична частина
- •1.Завдання
- •2.Опис алгоритму:
- •3. Код програми
2) Практична частина
1.Завдання
13. Побудувати вектор D, елементи якого дорівнюють сумі елементів рядків матриці B(m,m), що розміщені вище головної діагоналі
SI
= BX + 1
mas[BX]
= mas[BX] + matr[BX][SI]
SI
= SI + 1
так
ні
ні
так
BX
= BX + 1
ні
2.Опис алгоритму:
Індекс рядка перевіряємо, щоб він був не більше ніж індекс передостаннього рядка. Якщо це не так то на 4.
Для кожного індексу стовпчика перевіряємо, щоб він був не більше ніж індекс останнього стовпчика. Якщо це не так, то збільшуємо індекс рядка на 1, на переходимо до кроку 1.
Рахуємо суму елементів рядка з поточними індексами, та зберігаємо її у шуканий масив з індексом поточного рядка матриці. Збільшуємо індекс рядка на 1, на переходимо до кроку 1.
Вивід елементів масиву. Вихід з програми.
3. Код програми
.386 ; використання інструкцій 386 процесора
.model flat, stdcall ;використання моделі пам'яті flat і способи передачі аргументів у функції
stdcall
option casemap :none
include \masm32\include\windows.inc ; опис констант
include \masm32\include\kernel32.inc ; опис прототипів функцій
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib ;підключені бібліотеки
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
.data
bufferforstring db 10 dup(0)
titlestring db "Результат",0
szformat db "Number = %u",0
matrLeng dw 0 ;загальна кількість елементів матриці
bsize equ 4
buf dw 2 dup(0) ;буфер читання
k1 dd 2 dup(0) ;буфери для виводу
k2 dd 2 dup(0)
stdout dword ? ; дескриптор пристрою виводу
stdin dword ? ; дескриптор пристрою вводу
cRead byte ? ;кількість прочитаних символів
Press db "Vvedite razmer ",0Dh,0Ah, 0 ; повідомлення
PressPPV db "PPV ",0Dh,0Ah, 0
PressRsm db "razmer ",0Dh,0Ah, 0
Presselm db "element ",0Dh,0Ah, 0
Presskol db "koluchestvo elementov ",0Dh,0Ah, 0
PressEx db "element vektora ",0Dh,0Ah, 0
Pr db " ",0Dh,0Ah, 0
msg db ' $'
matrSize dw 0
masSize dw 0
i dw 0
j dw 0
mas db 10 dup (0)
matr db 30 dup (0)
.code
start:
invoke GetStdHandle, STD_OUTPUT_HANDLE ;отримання дескриптора виводу
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE ;отримання дескриптора вводу
mov stdin, eax
mov SI,0
xor dI,dI
invoke StdOut, addr Press ; вивід запрошення до вводу розміру масиву
JMP newline
newlineel:
invoke StdOut, addr Presselm ; вивід запрошення до вводу елементу масиву
newline:
invoke ReadConsole,stdin, addr buf,\ ;ввід даних
bsize, addr cRead, NULL
cmp cRead,2 ;перевірка на введений пустий рядок
jnz rasm ;якщо ні переходимо по мітці
jmp exit ;інакше виходимо
rasm:
cmp si,0 ;перевірка чи був введений розмір масиву
je rasm1 ;якщо ні переходимо по мітці, інакше йдемо далі
Invoke atol,ADDR buf ; Функція перетворення рядка в число (результат в
AX )
mov matr[di],al ;зберігаємо в масив
inc di ;лічильник індексу елементів масиву
inc si ;лічильник введених елементів
cmp si,matrLeng ;перевірка закінчення масиву
jbe newlineel ;якщо ні, переходимо до введення наступного
елемента
jmp osn ;інакше переходимо до основної частини
rasm1:
Invoke atol,ADDR buf ; Функція перетворення рядка в число (результат в
AX )
mov matrSize,ax ;зберігаємо в matrSize
mov masSize,ax
sub masSize,1 ;визначаємо masSize як число, менше на 1 від
matrSize
mov bx,ax ; розрахунок загальної кількості елементів
(результат в ах->matrLeng)
mul bx
mov matrLeng,ax
inc si ;показник введеного розміру масиву
add k1,eax
Invoke dwtoa,k1,ADDR k2 ;Процедура перетворення числа в рядок
invoke StdOut, addr Presskol ;вивід повідомлення
invoke StdOut, addr k2 ;вивід загальної кількості елементів масиву
invoke StdOut, addr Pr
JMP newlineel ;перехід до введення елементів масиву
osn: xor cx,cx
xor ebx,ebx
xor esi,esi
xor di,di
b1: mov cx,i
add cx,1
cmp cx,matrSize
jae vuhod
b2: mov cx,i
mov j,cx
add j,1
b3: mov cx,matrSize
cmp j,cx
jae addI
b4: mov al,BYTE PTR [matrSize]
mul BYTE PTR [i]
mov bx,ax
mov si,j
mov cl,matr[ebx][esi]
push bx
mov bx,i
add mas[bx],cl
pop bx
add j,1
jmp b3
addI: add i,1
jmp b1
vuhod: xor eax,eax ;очистка регістрів
xor esi,esi
mov di,masSize ;збереження розміру вектору
vuvod: mov k1,0 ;очищення
mov al,mas[si] ;організація перетворення числа в рядок і виводу результату
add k1,eax
Invoke dwtoa,k1,ADDR k2 ;Процедура перетворення числа в рядок
invoke StdOut, addr PressEx
invoke StdOut, addr k2 ;вивід результату
invoke StdOut, addr Pr
inc si ;збільшення на індекс нового елементу вектору
dec di
cmp di,1 ;перевірка на закінчення вектора,
jnl vuvod ;організація циклу по кількості елементів вектору
exit: ;invoke wsprintf,addr bufferforstring,addr szformat,mas[0]
;invoke MessageBox,0,ADDR bufferforstring,ADDR titlestring,MB_OK ;выводим резульат
invoke ExitProcess, 0 ;вихід з програми з кодом повернення 0
end start
Список літератури
Кіп Ірвіна. Мова асемблера для процесорів Intel = Assembly Language for Intel-Based
Юров Ст І. Assembler. Практикум. : підручник для вузів / 2-е видавництво СПб.: «Пітер», 2004.
Річард Саймон. Microsoft Windows API Довідник системного програміста.
Ассемблер. Самоучитель Assembler - Питер