Лабораторная работа №1. «Организация вычислительных систем»

 

Дисциплина:

«Организация вычислительных систем»

 

Выполнил студент группы ИСТ-11

Гадионов А.В.

 

Проверил преподаватель кафедры ИСТ

Куделин А.Г.

 

 

УХТА, 2011

Задание №1

 

Постановка задачи: Разработать программу, которая заменяет строчные символы на заглавные в введенной строке.

 

Исходные данные: Строка размером не более 9 символов.

Результат: Исходная строка записанная только заглавными буквами.

 

Для замены сточного символа на заглавный, необходимо изменить пятый бит ASCII кода символа с 1 на 0.

 


Листинг программы:

masm

model small

.data

max db 10

len db 0

str1 db 10 dup (' ')

eos1 db 10, 13, '$'

.stack

db 256 dup ('?')

.code

main proc

mov ax,@data

mov ds,ax

mov es, ax

mov ah, 0ah

mov dx, offset max

int 21h

mov cx, 9

m2:

mov bx, offset str1

add bx, cx

 

mov al, [bx]

cmp al,10

je m1

cmp al,13

je m1

and al,11011111b

mov [bx], al

dec cx

cmp cx, 0

jns m2

mov ah,09h

mov dx,offset str1

int 21h

mov ax,4c00h

int 21h

m1: dec cx

mov [bx],20h

jmp m2

 

main endp

end main


 

Протокол выполнения программы:

1. Запуск программы и ввод исходной строки

 

2. Конец работы программы, вывод результата.

Задание №2

 

Постановка задачи: Разработать программу, которая производит реверс введенной строки.

 

Исходные данные: Строка размером не более 9 символов.

Результат: Исходная строка записанная в обратном порядке.

 

Чтобы произвести реверс строки, нужно выводить по одному символу, начиная с конца строки. Посимвольный вывод осуществляется с помощью прерывания BIOS 02h int 21h.

 


Листинг программы:

masm

model small

.data

max db 10

len db 0

str1 db 12 dup (' ')

str2 db 12 dup (' ')

eos1 db 10, 13, '$'

.stack

db 256 dup ('?')

.code

main proc

mov ax,@data

mov ds,ax

mov es, ax

mov ah, 0ah

mov dx, offset max

int 21h

 

mov cx, 9

m1:

mov bx, offset str1

add bx,cx

mov al, [bx]

 

mov dl,al

mov ah,02h

int 21h

dec cx

cmp cx, 0

jns m1

 

mov ax,4c00h

int 21h

 

main endp

end main


 

Протокол выполнения программы:

1. Запуск программы и ввод исходной строки

2. Конец работы программы, вывод результата.

 

 


Задание №3

 

Постановка задачи: Разработать программу, которая выводит количество cpunt портов

 

Результат: Вывод фразы о количестве портов.

 

С помощью прерывания int 11h нужно считать 14-15 биты, возвращенные в регистр АХ.

 


Листинг программы:

masm

model small

.data

s1 db 'port cpunt is:$'

s2 db '0'

s3 db '1'

s4 db '2'

s5 db '3'

eos db 10, 13, '$'

.stack

db 256 dup ('?')

.code

main proc

mov ax,@data

mov ds,ax

mov es, ax

int 11h

and ax,0c000h

mov bx,offset s2

cmp ax,00000h

je m1

 

inc bx

cmp ax,04000h

je m1

inc bx

cmp ax,08000h

je m1

inc bx

cmp ax,0c000h

je m1

m1:

mov ah,09h

mov dx,offset s1

int 21h

mov ah,02h

mov dl,[bx]

int 21h

mov ax,04c00h

int 21h

 

main endp

end main


 

Протокол выполнения программы:

1. Запуск программы и ввод исходной строки

 

Задание №4

 

Постановка задачи: Разработать программу, которая выводит количество RS-232 портов

 

Результат: Вывод фразы о количестве портов.

 

С помощью прерывания int 11h нужно считать 9-11 биты, возвращенные в регистр АХ.

 


Листинг программы:


masm

model small

.data

s1 db 'port COM (RS-232) is:$'

s2 db '0'

s3 db '1'

s4 db '2'

s5 db '3'

s6 db '4'

s7 db '5'

s8 db '6'

s9 db '7'

eos db 10, 13, '$'

.stack

db 256 dup ('?')

.code

main proc

mov ax,@data

mov ds,ax

mov es, ax

int 11h

and ax,0e00h

mov bx,offset s2

cmp ax,0000h

je m1

inc bx

cmp ax,0200h

je m1

inc bx

cmp ax,0400h

je m1

inc bx

cmp ax,0600h

je m1

inc bx

cmp ax,0800h

je m1

inc bx

cmp ax,0a00h

je m1

inc bx

cmp ax,0c00h

je m1

inc bx

cmp ax,0e00h

je m1

m1:

mov ah,09h

mov dx,offset s1

int 21h

mov ah,02h

mov dl,[bx]

int 21h

mov ax,04c00h

int 21h

 

main endp

end main


Протокол выполнения программы:

1.

 

Задание №5

 

Постановка задачи: Разработать программу, которая выводит состояние Shift-клавиш

 

Исходные данные: Строка размером не более 9 символов.

Результат: Исходная строка записанная в обратном порядке.

 

Чтобы узнать состояние Shift-клавиш, необходимо использовать прерывание BIOS 02h int 16h.

 


Листинг программы:


 

masm

model small

.data

 

rCtrl db 'Control pressed$'

lShift db 'Left Shift pressed$'

rShift db 'Right Shift pressed$'

lAlt db 'Left Alt pressed$'

rAlt db 'Right Alt pressed$'

 

eos db 10,13,'$'

 

c1 db 0

kf dw 0

 

.stack

db 256 dup ('?')

 

.code

main proc

mov ax,@data

mov ds,ax

mov es,ax

 

m1:

xor ax,ax

mov ah,02h

int 16h

 

cmp c1,al

 

je m1

 

mov c1,al

 

mov kf,ax

 

call getEXIT

 

mov ax, kf

call GetLShift

 

mov ax, kf

call GetRShift

 

mov ax, kf

call getCTRL

 

mov ax, kf

call GetLAlt

 

mov ax, kf

call GetRALT

 

jmp m1

 

exit:

mov ax,4c00h

int 21h

main endp

 

getLShift proc

and al,02h

cmp al,0

je m2

mov dx,offset lshift

mov ah,09h

int 21h

mov dx,offset eos

int 21h

m2:

ret

getLshift endp

 

 

getRShift proc

 

and al,01h

cmp al,0

je m3

mov dx,offset rshift

mov ah,09h

int 21h

mov dx,offset eos

int 21h

m3:

ret

 

getRshift endp

 

getCTRL proc

and al,04h

cmp al,0

je m5

mov dx,offset rCTRL

mov ah,09h

int 21h

mov dx,offset eos

int 21h

m5:

ret

getCTRL endp

 

 

getLALT proc

and ah,02h

cmp ah,0

je m6

mov dx,offset lalt

mov ah,09h

int 21h

mov dx,offset eos

int 21h

m6:

ret

getLALT endp

 

 

getRALT proc

and al,08h

cmp al,0

je m7

and ah,02h

jne m7

mov dx,offset rALT

mov ah,09h

int 21h

mov dx,offset eos

int 21h

m7:

ret

getRALT endp

 

getEXIT proc

and al,02h

cmp al,0

je m8

mov al,c1

and al,04h

cmp al,0

je m8

mov al,c1

and al,08h

cmp al,0

je m8

jmp exit

m8:

ret

getEXIT endp

 

end main


Протокол выполнения программы:

1. Запуск программы и ввод исходной строки

2. Вывод после последовательных нажатий LeftShift, Control, LeftAlt.

3. Вывод после последовательных нажатий RightShift, Control, RightAlt.

4. Выход из программы – комбинация LeftShift+Control+LeftAlt.

 

Задание №6

 

Постановка задачи: Разработать программу, которая выводит в центре экрана световую точку и изменяет ее положение с помощью клавиш-стелок.

 

Исходные данные: Световая точка в центре.

Результат: Возможность менять ее положение с помощью стрелок.

 

Для работы с видео режимом исмользуется прерывание BIOS int 10h.

 


Листинг программы:

 


masm

model small

.data

tr db 0

c1 db 0

k1 dw 160

k2 dw 100

eos db 10,13,'$'

.stack

db 256 dup ('?')

.code

main proc

mov ax,@data

mov ds,ax

mov es,ax

 

mov ah,0fh

int 10h

 

mov tr,al

 

mov ah,00h

mov al,4

int 10h

 

mov ah,0ch

mov bh,0

mov dx,100

mov cx,160

mov al,1

int 10h

 

m1:

xor ax,ax

mov ah,00h

int 16h

mov c1,al

cmp al,27

je m2

 

call getRight

 

call getLeft

 

call getDown

 

call getUp

 

mov ah,0ch

mov bh,0

mov dx,k2

mov cx,k1

mov al,1

int 10h

 

jmp m1

 

m2:

mov ah,00h

mov al,tr

int 10h

mov ax,4c00h

int 21h

 

main endp

 

getRight proc

 

cmp ah,77

jne m3

 

mov ah,0ch

mov bh,0

mov dx,k2

mov cx,k1

mov al,4

int 10h

 

inc k1

 

m3:

ret

 

getRight endp

 

getLeft proc

 

cmp ah,75

jne m4

 

mov ah,0ch

mov bh,0

mov dx,k2

mov cx,k1

mov al,4

int 10h

 

dec k1

m4:

ret

 

getLeft endp

 

getDown proc

 

cmp ah,80

jne m5

 

mov ah,0ch

mov bh,0

mov dx,k2

mov cx,k1

mov al,4

int 10h

 

inc k2

m5:

ret

 

getDown endp

 

getUp proc

 

cmp ah,72

jne m6

 

mov ah,0ch

mov bh,0

mov dx,k2

mov cx,k1

mov al,4

int 10h

 

dec k2

m6:

ret

 

getUp endp

 

end main