Автор: Пользователь скрыл имя, 19 Мая 2013 в 22:53, контрольная работа
Написать 16–ти разрядную ассемблерную программу, которая выводит на экран консоли номера строки и столбца, соответствующие положению курсора непосредственно перед выводом.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ, МОЛОДЕЖИ И СПОРТА УКРАИНЫ
ДОНБАСКИЙ ГОСУДАРСТВУННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра специализированных компьютерных систем
по дисциплине:
«Системное программирование»
Вариант №9
Задание 1
Написать 16–ти разрядную ассемблерную программу, которая выводит на экран консоли номера строки и столбца, соответствующие положению курсора непосредственно перед выводом.
Ответ:
MASM
model small
.stack 100h ;сегмент стека
.data ;сегмент данных
msgrow db "Row: ","$"
msgcol db " Col: ","$"
msgexit db 0dh,0ah,"Press Enter to exit","$"
.code ;сегмент кода
;процедура вывода
положительного однобайтового
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