Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;lab2.asm
- ;ввод числа в двоично-десятичном коде и вывод его в двоичной системе счисления на экран
- ;сегмент данных
- data segment
- x dw (?) ;место размещения введенного числа
- y dw (?) ;результат: y=x and m
- data ends
- ;сегмент команд
- code segment
- assume cs:code, ds:data
- main: mov dx, data ;в DX база сегмента данных
- mov ds, dx ;инициализация регистра сегмента данных
- ;инициализация указателей видеопамяти и приемника вводимого числа
- mov dx, 0B800h ;база видеопамяти
- mov es, dx ;дополнительный сегмент - видеопамять
- xor di, di ;смещение видеопамяти - левая верхняя позиция
- xor dx, dx ;в DX будет формироваться вводимое число
- ;очистка экрана
- ;07 - серый символ на черном фоне, 20 - ASCII-код пробела
- mov ax, 0720h
- mov cx, 80*25 ;размер видеопамяти текстового экрана в словах
- rep stosw ;цикл заполнения пробелом одного экрана
- ;инициализация регистров для ввода числа
- xor di, di ;снова на начало видеопамяти
- mov cx, 10h ;счетчик битов вводимого числа
- ;цмкл ввода
- inloop: in al, 60h ;ввод скан-кода клавиши
- cmp al, bl ;сравнение с предыдущим скан-кодом
- ;если не равно, то клавиша отжата
- je inloop ;цикл повторяется, пока клавиша не будет отжата
- mov bl, al ;скан-код в BL для последующего сравнения
- cmp al, 01h ;скан-код клавиши Esc
- jne NotEsc
- jmp quit
- NotEsc: cmp al,02h ;скан-код клавиши 1
- je num1
- cmp al, 0Bh ;скан-код клавиши 0
- jne inloop
- shl dx, 1 ;в очередной разряд числа записан введенный 0
- mov es:[di], 0730h ;и выведен на экран в качестве эха
- jmp NxtNum ;переход к вводу следующей цифры
- num1: shl dx, 1 ;если введена 1
- or dx, 1 ;то она записана в очередной разряд
- mov es:[di], 0731h ;и выведена на экран в качестве эха
- NxtNum: inc di
- inc di ;смещение в видеопамяти на следующий символ
- dec cx ;декремент счетчика битов
- jnz inloop ;если еще не все цифры введены,
- ;ввод следующей цифры
- mov x, dx ;если все цифры введены,
- ;число записывается в переменную x
- ;выполняется программа из Лабораторной работы №1
- mov ax,0000h
- mov dx,0000h
- mov ax, x
- mov cx,10h
- mov bx,0h
- for_loop: shr ax,1h
- jnc zero_bit
- xor bx,1h
- zero_bit: loop for_loop
- cmp bx,0h
- je pair
- ;вывод ноты «Ми» через встроенный динамик
- ;загрузка счетчика канала 2 значением0e24h (нота «Ми»)
- mov al, 24h ;сначала выводится младший байт
- out 42h, al
- mov al, 0eh ;затем выводится старший байт
- out 42h, al
- ;включение сигнала и динамика
- in al,61h
- or al,00000011b
- out 61h,al
- ;формирование задержки
- mov cx, 0010h
- l1: mov bx, cx
- mov cx,8000h
- l2: loop l2
- mov cx, bx
- loop l1
- ;выключение сигнала динамика
- in al,61h
- and al,11111100b
- out 61h,al
- jmp quit
- pair: mov ax,x
- and ax,7FFFh
- exit: mov y, ax ;результат записывается в переменную y
- mov ax,0000h
- mov bx,0000h
- mov cx,0000h
- mov dx,0000h
- ;инициализация регистров для вывода результата на экран
- mov bx, 8000h ;индикатор очередного выводимого бита
- mov di, 80*2 ;результат будет выведен под исходным числом
- ;цикл вывода результатов на экран
- outloop: mov ax, y ;передача результата в аккумулятор
- test ax, bx ;проверка очередного бита - 0 или 1
- jnz bit1
- mov es:[di], 0730h ;если 0, вывести 0
- jmp NxtBit
- bit1: mov es:[di], 0731h ;если 1, вывести 1
- NxtBit: inc di
- inc di ;переход на следующую позицию видеопамяти
- shr bx, 1 ;настройка индикатора на следующий бит
- jnc outloop ;переход к тестированию следующего бита
- pause: in al, 60h ;цикл, пауза для просмора результата
- cmp al, 01h ;пауза заканчивается по нажатию Esc
- jne pause
- quit: mov ax, 4C00h ;функция завершения программы
- int 21h ;вызов системного прерывания
- code ends ;конец сегмента команд
- end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement