Системное программирование

Автор: Пользователь скрыл имя, 19 Мая 2013 в 22:53, контрольная работа

Описание работы

Написать 16–ти разрядную ассемблерную программу, которая выводит на экран консоли номера строки и столбца, соответствующие положению курсора непосредственно перед выводом.

Работа содержит 1 файл

Контрольная работа 9.doc

— 43.00 Кб (Скачать)

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ  И НАУКИ, МОЛОДЕЖИ И СПОРТА УКРАИНЫ

ДОНБАСКИЙ ГОСУДАРСТВУННЫЙ  ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра специализированных компьютерных систем

 

 

 

 

Контрольная работа №2

по дисциплине:

 «Системное программирование»

Вариант №9

 

 

 

 

Выполнил: ст. гр. _______

_______________________

Проверил: ______________

 

 

 

 

 

 

Алчевск 2013

Задание 1

Написать 16–ти разрядную  ассемблерную программу, которая выводит  на экран консоли номера строки и  столбца, соответствующие положению  курсора непосредственно перед выводом.

 

Ответ:

MASM

model small

.stack 100h ;сегмент стека

.data  ;сегмент данных

msgrow  db "Row: ","$"

msgcol  db " Col: ","$"

msgexit  db 0dh,0ah,"Press Enter to exit","$"

.code  ;сегмент кода

 

;процедура вывода  положительного однобайтового числа из al

outbyte  proc near

;сохраняем значения  регистров в стеке

push ax

push cx

push dx

;делим число  в al на десять

;остаток - правая  цифра в al, частное в ah

aam

;запомним младшую  цифру в cl, перейдём к частному

mov cl,al

mov al,ah

;частное делим на десять

;в al получим  вторую цифру

;в ah получим  частное от деления исходного  числа на 100

aam

mov ch,al

;в ah старшая  цифра

mov dl,ah

 

;в итоге цифры  числа хранятся в dl, ch, cl

;переводим все  цифры в символы

add dl,30h

add cx,3030h

;выводим первую цифру числа

mov ah,02h

int 21h

;выводим вторую  цифру числа

mov dl,ch

int 21h

;выводим третью цифру  числа

mov dl,cl

int 21h

;восстанавливаем значения  регистров из стека

pop dx

pop cx

pop ax

;выход из процедуры

ret

outbyte endp

 

start:

mov ax,@data ;заносим адрес сегмента данных в регистр ax

mov ds,ax  ;в ds адрес сегмента данных из ax

xor ax,ax  ;очистка регистров

xor dx,dx

xor cx,cx

 

;определяем  текущий видеорежим

;в bh получим  номер текущей видеостраницы

mov ah,0fh

int 10h

 

;определяем текущую позицию курсора

;в dh получим  строку текущей позиции курсора

;в dl получим  колонку текущей позиции курсора

mov ah,03h

int 10h

 

;сохраняем результат  из dx в cx 

mov cx,dx

 

;выводим сообщение о  номере строки

lea dx,msgrow

mov ah,09h

int 21h

 

;выводим номер  строки

mov al,ch

call outbyte

 

;выводим сообщение  о номере столбца

lea dx,msgcol

mov ah,09h

int 21h

 

;выводим номер  столбца

mov al,cl

call outbyte

 

;выводим сообщение  о выходе

lea dx,msgexit

mov ah,09h

int 21h

;ожидаем нажатия клавиши

mov ah,0ch

mov al,01h

int 21h

 

mov ax,4C00h ;стандартный выход

int 21h

end start

Задание 2

Написать 16–ти разрядную  ассемблерную программу, которая выводит  на экран консоли сообщение о  том, установлен или нет порт COM2 и в случае установки выводит также его базовый адрес в 16-тиричном виде.

 

Ответ:

MASM

model small

.stack 100h ;сегмент стека

.data ;сегмент данных

msgfind  db "Port COM2 is set!",0dh,0ah,"$"

msgnofind  db "Port COM2 is no set!",0dh,0ah,"$"

msgaddress  db "Port COM2 base address: ","$"

msgexit  db 0dh,0ah,"Press Enter to exit","$"

.code ;сегмент кода

 

;процедура вывода 16-тиричного числа из регистра ax

outhex proc near

push cx

push dx

mov cx,4

;очередная цифра  получается в младшей тетраде  ax после

;сдвига на 4 двоичных разряда, или на один шестнадцатеричный

oh0:

rol ax,4

mov dl,al

and dl,0Fh

;если цифра,  то число нужно увеличить на 30h,

;чтобы из 0..9 сделать 30h..39h - коды '0'..'9'

;если буква,  то из 10..15 нужно сделать 41h..46h - коды 'A'..'F',

;то есть число  увеличить на 37h

cmp dl,9

jbe oh1

add dl,7

oh1:

add dl,30h  ;получили код символа в dl

push ax   ;сохраняем ax в стеке

mov ah,02h  ;выводим символ на экран из dl

int 21h

pop ax   ;восстанавливаем ax из стека

;повторяем 4 раза, так как в ax четыре шестнадцатеричные цифры

loop oh0

pop dx

pop cx

;выход из  процедуры

ret

outhex endp

 

start:

mov ax,@data  ;заносим адрес сегмента данных в регистр ax

mov ds,ax   ;в ds адрес сегмента данных

xor ax,ax   ;очистка регистров

xor dx,dx

xor cx,cx

 

mov ax,0040h  ;адрес области данных BIOS

mov es,ax   ;заносим в es адрес данных BIOS

mov cx,es:[0002h] ;получаем в cx базовый адрес COM2

 

cmp cx,0   ;сравниваем адрес порта с 0

jne find   ;переход если адрес порта не равен 0

jmp nofind  ;переход в любом другом случае

 

find: ;порт найден

;выводим сообщение  что порт найден

lea dx,msgfind

mov ah,09h

int 21h

 

;выводим сообщение  о базовом адресе

lea dx,msgaddress

mov ah,09h

int 21h

mov ax,cx

call outhex  ;выводим базовый адрес порта

jmp exit   ;переход на метку выхода

 

nofind: ;порт не найден

;выводим сообщение  что порт не найден

lea dx,msgnofind

mov ah,09h

int 21h

 

exit: ;метка выхода

 

;выводим сообщение  о выходе

lea dx,msgexit

mov ah,09h

int 21h

;ожидаем нажатия клавиши

mov ah,0ch

mov al,01h

int 21h

mov ax,4C00h  ;стандартный выход

int 21h

end start


Информация о работе Системное программирование