Advertisement
Guest User

Untitled

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