Advertisement
Guest User

HomkaBoris

a guest
Dec 27th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;lab2.asm
  2. ;ввод числа в двоично-десятичном коде и вывод его в двоичной системе счисления на экран
  3. ;сегмент данных
  4. data segment
  5.     x dw (?) ;место размещения введенного числа
  6.     y dw (?) ;результат: y=x and m
  7. data ends
  8. ;сегмент команд
  9. code segment
  10.     assume cs:code, ds:data
  11. main:   mov dx, data ;в DX база сегмента данных
  12.     mov ds, dx ;инициализация регистра сегмента данных
  13.     ;инициализация указателей видеопамяти и приемника вводимого числа
  14.     mov dx, 0B800h ;база видеопамяти
  15.     mov es, dx ;дополнительный сегмент - видеопамять
  16.     xor di, di ;смещение видеопамяти - левая верхняя позиция
  17.     xor dx, dx ;в DX будет формироваться вводимое число
  18.     ;очистка экрана
  19.     ;07 - серый символ на черном фоне, 20 - ASCII-код пробела
  20.     mov ax, 0720h
  21.     mov cx, 80*25 ;размер видеопамяти текстового экрана в словах
  22.     rep stosw ;цикл заполнения пробелом одного экрана
  23.     ;инициализация регистров для ввода числа
  24.     xor di, di ;снова на начало видеопамяти
  25.     mov cx, 10h ;счетчик битов вводимого числа
  26.     ;цмкл ввода
  27. inloop: in al, 60h ;ввод скан-кода клавиши
  28.     cmp al, bl ;сравнение с предыдущим скан-кодом
  29.     ;если не равно, то клавиша отжата
  30.     je inloop ;цикл повторяется, пока клавиша не будет отжата
  31.     mov bl, al ;скан-код в BL для последующего сравнения
  32.     cmp al, 01h ;скан-код клавиши Esc
  33.     jne NotEsc
  34.     jmp quit
  35. NotEsc: cmp al,02h ;скан-код клавиши 1
  36.     je num1
  37.     cmp al, 0Bh ;скан-код клавиши 0
  38.     jne inloop
  39.     shl dx, 1 ;в очередной разряд числа записан введенный 0
  40.     mov es:[di], 0730h ;и выведен на экран в качестве эха
  41.     jmp NxtNum ;переход к вводу следующей цифры
  42.  
  43. num1:   shl dx, 1 ;если введена 1
  44.     or dx, 1 ;то она записана в очередной разряд
  45.     mov es:[di], 0731h ;и выведена на экран в качестве эха
  46. NxtNum: inc di
  47.     inc di ;смещение в видеопамяти на следующий символ
  48.     dec cx ;декремент счетчика битов
  49.     jnz inloop ;если еще не все цифры введены,
  50.     ;ввод следующей цифры
  51.     mov x, dx ;если все цифры введены,
  52.     ;число записывается в переменную x
  53.     ;выполняется программа из Лабораторной работы №1
  54.     mov ax,0000h
  55.     mov dx,0000h
  56.     mov ax, x
  57.     mov cx,10h
  58.     mov bx,0h
  59. for_loop: shr ax,1h
  60.     jnc zero_bit
  61.     xor bx,1h
  62. zero_bit: loop for_loop
  63.     cmp bx,0h
  64.     je pair
  65.  
  66.     ;вывод ноты «Ми» через встроенный динамик
  67.    
  68.     ;загрузка счетчика канала 2 значением0e24h (нота «Ми»)
  69.     mov al, 24h ;сначала выводится младший байт
  70.     out 42h, al
  71.     mov al, 0eh ;затем выводится старший байт
  72.     out 42h, al
  73.     ;включение сигнала и динамика
  74.     in al,61h
  75.     or al,00000011b
  76.     out 61h,al
  77.     ;формирование задержки
  78.     mov cx, 0010h
  79. l1: mov bx, cx
  80.     mov cx,8000h
  81. l2:     loop l2
  82.     mov cx, bx
  83.     loop l1
  84.     ;выключение сигнала динамика
  85.     in al,61h
  86.     and al,11111100b
  87.     out 61h,al
  88.  
  89.     jmp quit
  90. pair:   mov ax,x
  91.     and ax,7FFFh
  92. exit:   mov y, ax ;результат записывается в переменную y
  93.     mov ax,0000h
  94.     mov bx,0000h
  95.     mov cx,0000h
  96.     mov dx,0000h
  97.     ;инициализация регистров для вывода результата на экран
  98.     mov bx, 8000h ;индикатор очередного выводимого бита
  99.     mov di, 80*2 ;результат будет выведен под исходным числом
  100.     ;цикл вывода результатов на экран
  101. outloop: mov ax, y ;передача результата в аккумулятор
  102.     test ax, bx ;проверка очередного бита - 0 или 1
  103.     jnz bit1
  104.     mov es:[di], 0730h ;если 0, вывести 0
  105.     jmp NxtBit
  106. bit1:   mov es:[di], 0731h ;если 1, вывести 1
  107. NxtBit: inc di
  108.     inc di ;переход на следующую позицию видеопамяти
  109.     shr bx, 1 ;настройка индикатора на следующий бит
  110.     jnc outloop ;переход к тестированию следующего бита
  111. pause:  in al, 60h ;цикл, пауза для просмора результата
  112.     cmp al, 01h ;пауза заканчивается по нажатию Esc
  113.     jne pause
  114. quit:   mov ax, 4C00h ;функция завершения программы
  115.     int 21h ;вызов системного прерывания
  116. code ends ;конец сегмента команд
  117. end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement