![]() КАТЕГОРИИ: Архитектура-(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],'-'
.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
ОРГАНИЗАЦИЯ ВВОДА СИМВОЛА И СТРОК В БУФЕР КЛАВИАТУРЫ Одиночный символ можно ввести так, что бы он отображался при вводе (эхо) или был невидимым (не эхо) для этого используют функции 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; Просмотров: 470; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |