Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

ЛЕКЦИЯ 12. .com файл выводящий сообщение




.com файл выводящий сообщение

· Строка записывается в одинарных кавычках

· Используется функция 9 прерывания 21h

· Строка обрабатывается побайтно

;message

.model tiny

.code

org 100

Start jmp short main

;---DATA---------------------------

message db 'This is my first string in Assembler!!!$'

;---CODE---------------------------

main proc near

lea dx, message

mov ah,9

int 21h

main endp

end Start

Такая же программа в виде.ЕХЕ

;message_exe.asm

.model large

.stack 100h

.data

message db 'olololo Fuga the Best!$'

.code

Start proc far

;---Return---------------------

push ds

xor di,di

push di

;---Initialasing_SD------------

mov ax,@DATA

mov ds,ax

;---Print---------------------

lea dx,message

mov ah,9

int 21h

ret

Start endp

end Start

ВЫВОД ЦЕЛЫХ ЧИСЕЛ

Состоит из 2х этапов:

1. Преобразование внутреннего представления числа в строку символов

2. Вывод строки

Символы 0...9 кодируются в ASCII 30h...39h

Алгоритм преобразования целых 16-ти разрядных чисел со знаком. Он сводится к последовательному делению числа его внутреннего представления на константу 10, остатки преобразуются в символы и выводятся.

1. Исходное число поместить в ax

2. Очистить буфер вывода. Минимальная длина буфера вывода 6 символов

3. Проверка знака числа

4. Взятие модуля

5. Целочисленное без знаковое деление числа на 10

6. Остаток переводим в символьное представление. Остаток +'0'

7. Занести символьное представление остатка в буфер вывода

8. Проверить частное. Если!=0 перейти в 5

9. Если исходное число отрицательное занести в буфер символ ' - '

10. Завершение

 

Рассмотрим программные коды реализации шагов 3-9 этого алгоритма на примере числа -157

 

;...3

or ax,ax;старший бит в SF

;...4

neg ax

;...5

mov si,10

CLR_Dvd;начало цикла деления

xor dx,dx

div 157,si;частное <ax> <-15, остаток <dx><-7

;...6

add dx,'0';<dx> <-37h

;...7

dec bx

mov byte PTR[bx], dl

;...8

OR ax,ax

JNZ CLR_Dvd

;...9

dec bx

mov byte PTR[bx],'-'

 

 

Символ ' ' ' ' '-' '1' '5' '7' '$'
hex код     2d        

 

.COM файл для вывода целых чисел

;Bin_ASCII -> преобразование строку в символы

;output -> Вывод строки символов на экран

.model tiny

.code

ORG 100h

Start: JMP Short main

;===DATA============

CR_LF db 0dh,0ah, '$'

L dw 6;длина буфера вывода

number dw 12345

in db 'Result:$'

outbuf db 11 dup(?),'$'

;===CODE============

main proc near

lea dx,in

call output

lea bx,outbuf

mov ax,number

call Bin_ASCII

lea dx,[bx];взятие адреса

;=====================

;<dx> начальный адрес строки которая выводится

output proc near

push ax

mov ah,9

int 21h

pop ax

ret

output endp

; procedure BIN_ASCII

; число выводимое на экран в регистре <AX>

; начальный адресс буфера вывода <bx>

;длина буфера вывода L

; фактическая длина буфера вывода <CX> <- L

Bin_ASCII proc near

push dx,si,ax

mov cx,L

Fill_buf:

;установка <bx> на хвост буфера вывода

mov Byte PTR [bx], '_'; очистка буфера вывода

inc bx

Loop Fill_buf

;================

mov si,10

or ax,ax

jns Clr_Dvd

neg ax

;================

clr_Dvd:

xor dx,dx

div 10

add dx,'0'

dec bx

mov Byte PTR [bx], dl

inc cx

or ax,ax

jnz Clr_Dvd

pop ax

or ax,ax

jns nomore

dec bx

mov Byte PTR [bx], '-'

inc cx

nomore:

pop si,dx

ret

Bin_ASCII endp

end start

ВВОД ИНФОРМАЦИИ С КЛАВИАТУРЫ

Любая информация с клавиатуры при использовании функции прерывании 21h вводится в символьном виде.

Основные функции воода для прерывания 21h

 

Функция Операция Доп. регистры Вых. данные
  Ожид ввода с echo и ctrl+break   al Символ
  ожид без echo и crtl+break   al Символ
  без echo с ctrl+break   al Символ
0ah Чтение строки символов в буфер клавиатуры <DS:DX> - адрес буфера. Первый байт длина буфера Второй файт - фактическая длина.
0bh чтение сост клавиатуры   <al>=0ffh, буфер пуст <al>=0, буфер не пуст
0ch Освобождение буфера клавиатуры и вывод нужной функции <al> = номер функции  

 

ОРГАНИЗАЦИЯ ВВОДА СИМВОЛА И СТРОК В БУФЕР КЛАВИАТУРЫ

Одиночный символ можно ввести так, что бы он отображался при вводе (эхо) или был невидимым (не эхо) для этого используют функции 1,7,8. Рассмотрим пример процедуры с именем readkey которая осуществляет ожидание ввода символа без эхо сопровождения, что бы делать задержку перед закрытием консольного окна.

;READ_KEY

readkey proc

push ax

mov ah,8

int 21h

pop ax

readkey endp

;Шаблон вызова процедуры readkey из главной программы

pause db 'Press any key$'

;=======

main proc

...

lea dx,pause

call output

call readkey

...

ret

main endp

 

Если используется номер функции 0ah то символ или строка вводятся в буфер клавиатуры.

Пусть буфер клавиатуры имеет имя "буфер" и длину 30 байт

· buffer db 30, 31 dup(' '); 2 и остальные байты заполнены пробелами

· buffer LABEL byte

L db 30;максимальная длина буфера

actL db?;реальная длина буфера

field db 30 dup(?); поле буфера

В втором случае можно обращаться к буферу целиком по имени так и к отдельным его полям

Написать программу вода строки символов не более 10 и вывода ее на экран монитора. Для решения задачи необходимы 2 процедуры: вывод строки символов на экран монитора и ввод строки в буфер клавиатуры. Воспользуемся функцией 0ch и 0ah

;READSTRING

;BUFFER - БУФЕР КЛАВИАТУРЫ

;<СХ> - ФАКТИЧЕСКОЕ ФИСЛО ВВЕДЕНЫХ СИМВОЛОВ




Поделиться с друзьями:


Дата добавления: 2014-12-16; Просмотров: 443; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.024 сек.