Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- code segment
- assume cs:code,ds:code
- org 100h
- entry proc
- mov dx,offset header
- call outstr ;Вывод "Подключенное оборудование".
- ;call-вызов подпрограммы, сохраняет
- ;перед этим в стеке смещение к точке
- ;возврата. Комманда ret, кот. обычно
- ;заканчивается подпрограмма, забирает
- ;из стека адрес возврата и возвращает
- ;управление на комманду, следующую за
- ;call (не воздействует на флаги
- ;процессора).
- mov dx,offset fdd
- call outstr ;Вывод строки.
- int 11h ;Запрос информации об устройствах
- mov bx,ax ;Сохраняем инфу об устройствах в BX(AX часто нужен!)
- ;определение FDD
- test bx,1 ;Есть ли FDD?(если ZERO flag !=0, то бит установлен)
- Логическое сравнение,
- ;логическое умножение "и" над двумя
- ;операндами и в зависимости от
- результата
- ;устанавливает SF(устанавливается в
- 1,
- ;если в результате выполнения команды
- ;образовалось число с установленным
- ;знаковым битом), ZF(устанавливается в
- 1,
- ;если в результате выполнения команды
- ;образовалось число, состоящее из
- одних
- ;двоичных нулей), PF(устанавливается в
- 1,
- ;если в результате выполнения команды
- ;образовалось число с чётным
- количеством
- ;двоичных единиц в его битах). OF,CF
- ;сбрасываются, AF-неопределённое
- значение.
- ;test не изменяет ни один из
- операндов.
- ;в качестве первого операнда-р-р,
- ячейка памяти.
- ;в качестве второго-р-р, ячейка
- памяти,
- ;непосредственное значение.
- jnz _more ;Есть. Команда jnz(не нуль,ZF=0)
- ;условного перехода, которые
- ;осуществляют переход по указанному
- ;адресу при выполнению условия,
- ;заданного мнемоникой команды.
- push bx
- mov bx,30h ;Грузим в BX код "0"(fdd отсутствует)
- jmp _next1 ;Переход безусловный, передает управление в
- ;указанную точку того же или другого
- ;программного сегмента. Адрес возарата
- ;не сохраняется. Команда не
- воздействует
- ;на флаги процессора.
- _more: push bx ;Cохраняем BX в стеке(чтобы проводить с ним
- манипуляции)
- and bx,0c0h ;Выделяем 7 и 6 биты. Логическое "и". Команда
- ;осуществляет логическое(побитовое)
- ;умножение первого операнда на второй.
- ;первый операнд-р-р, ячейка памяти.
- ;второй-р-р, ячейка памяти,
- ;непосредственное значение. Нельзя
- ;определять оба операнда как
- ;ячейки памяти.Воздействует на флаги
- ;sf,zf,pf.
- mov cl,6 ;Нужно для следующей команды
- shr bx,cl ;Сдвиг BX на 6 битов вправо, чтобы получить число FDD.
- ;при этом в процессоре
- последовательных
- ;сдвигов старшие биты операнда
- заполняются
- ;нулями, а младшие, пройдя через флаг
- CF,теряются.
- ;операнд-р-р, ячейка памяти. Команда
- воздействует
- ;на флаги CF,OF,FF,SF,ZF. Команда
- логического
- ;сдвига вправо всех битов операнда.
- Младший бит
- ;операнда поступает в флаг CF.
- add bx,31h ;Прибавляем к полученному числу код "1"(00 означает 1
- FDD).
- ;команда целочисленного сложения
- первого и
- ;второго операндов. Значение первого
- операнда(р-ра, ячейки памяти)
- ;заменяется на сумму, значение
- второго(р-ра, ячейки памяти,
- ;непосредственного значения) не
- изменяется.Воздействует на
- ;флаги of,sf,zf,af,pf,cf.
- _next1: call outnum ;Вызов процедуры вывода символа
- ;определение подключенных принтеров
- mov dx,offset printers
- call outstr
- pop bx
- push bx
- and bx,0c000h ;выделяем 15 и 14 биты
- mov cl,14
- shr bx,cl
- add bx,30h
- call outnum
- ;определение последовательного принтера
- mov dx,offset sprinter
- call outstr
- pop bx
- test bx,2000h ;проверяем установку 13 бита(если ZERO flag !=0, то
- бит установлен)
- jnz _next2
- mov dx,offset absent ;заносим в DX строку "отсутствует"
- jmp _out1
- _next2: mov dx,offset present ;заносим в DX строку "есть"
- _out1: call outstr ;вывод строки
- ;определение наличия игрового адаптера
- mov dx,offset game
- call outstr
- test bx,1000h ;проверяем установку 12 бита
- jnz _next3
- mov dx, offset absent ;"отсутствует"
- jmp _out2
- _next3: mov dx,offset present ;"есть"
- _out2: call outstr
- ;определение кол-ва RS232
- mov dx,offset rs232
- call outstr
- push bx
- and bx,0e00h ;выделяем 11-9 биты
- mov cl,9
- shr bx,cl
- add bx,30h
- call outnum
- pop bx
- ;определение нач. видеорежима
- mov dx,offset video
- call outstr
- push bx
- and bx,30h ;выделяем 5 и 4 биты
- mov cl,4
- shr bx,cl ;сдвигаем BX на 4 бита
- jnz _next4
- mov dx,offset unused ;заносим в DX "не используется"
- jmp _out3 ;прыжок на вывод строки из DX
- _next4: cmp bx,01b ;Команда выполняет вычитание второго
- ;операнда из первого. В соответствии
- ;с результатом вычитания
- устанавливаются
- ;состояния флагов CF,PF,AF,ZF,SF,OF.
- ;cами операнды не изменяются.
- ;первый операнд-р-р, ячейка памяти.
- ;второй-р-р, ячека памяти,
- непосредственное
- ;значение. Всед за командой стоит
- команда
- ;условного прехода, анализирующая
- состояние
- ;флагов процессора.
- jne _next5 ;jne(не равно,zf=0)
- mov dx,offset c40x25 ;заносим в DX "40x25 цветной"
- jmp _out3
- _next5: cmp bx,10b
- jne _next6
- mov dx,offset c80x25 ;заносим в DX "80x25 цветной"
- jmp _out3
- _next6: mov dx,offset bw80x25 ;заносим в DX "80x25 черно-белый"
- _out3: call outstr ;вывод DX
- ;определение наличия сопроцессора
- mov dx,offset math
- call outstr
- pop bx
- test bx,2 ;проверяем установку 1 бита
- jnz _next7
- mov dx,offset absent ;"отсутствует"
- jmp _out4
- _next7: mov dx,offset present ;"есть"
- _out4: call outstr
- ;вычисление физической памяти
- mov dx,offset mem
- call outstr
- int 12h
- call outdec ;вызов процедуры вывода AX(dec)
- mov dx,offset kb
- call outstr ;вывод "Kb"
- int 20h ;завершение
- entry endp
- ;далее идут процедуры
- outdec proc ;Вывод числа(dec)
- mov bx,64h ;заносим в BX 100
- mov cx,3 ;число итераций цикла
- _vnesh: div bl ;делим AX на 100(в al - целая
- ;часть, в ah - остаток)
- ;деление целых чисел без знака,
- ;находяшихся в р-рах АХ(/на байт,
- ;al-частное, ah-остаток) или DX:AX(/
- на
- ;слово, dx-старшая часть,остаток,
- ;ax-младшая,частное), на операнд-
- источник
- ;(целое число без знака). Размер
- делимого
- ;в два раза боьше размеров делителя и
- ;остатка.
- call outchar ;вывод al
- push cx
- xchg ax,bx ;Обмен данными между операндами, пересылает
- ;значение первого операнда во второй,
- ;а второго-в первый. Любой операнд-р-р
- ;(кроме сегментного), ячейка памяти,
- ;команда не воздействует на флаги
- процессора.
- mov dl,0ah
- div dl
- xchg ax,bx ;заносим в BX 10
- mov cx,8
- shr ax,cl
- pop cx
- loop _vnesh ;Циклическое выполнение, пока содержимое
- ;CX не равно нулю(макс.= 65536)
- ret ;Возврат из процедуры, извлекает из стека
- ;адрес возврата и передаёт управление
- назад
- ;в программу, первоначально вызвавшую
- процедуру.
- ;если этой командой завершается
- ближняя процедура,
- ;объявленная с атрибутом near, или
- используется
- ;модификация команды retn, со стека
- снимается одно
- ;слово- относительный адрес точки
- возврата. Передача
- ;управления в этом случае
- осуществляется в пределах
- ;одного программного сегмента. Если
- завершается
- ;дальняя-со стека снимаются 2 слова:
- смещение,
- ;сегментный адрес точки возврата.
- outdec endp
- outnum proc ;Вывод одной цифры с переходом на след.строку
- mov endl,bl
- mov dx,offset endl
- outstr proc ;Вывод строки
- mov ah,9
- int 21h
- ret ;возврат
- outstr endp
- outnum endp
- outchar proc ;Вывод символа
- push ax
- mov ah,2
- mov dl,al
- add dl,30h ;преобразуем число в символ
- int 21h
- pop ax
- _ex: ret ;возврат
- outchar endp
- header db 'Подключенное оборудование',13,10,13,10,'$'
- fdd db 'Число FDD дисководов: $'
- printers db 'Число подключенных принтеров: $'
- sprinter db 'Последовательный принтер: $'
- game db 'Игровой адаптер: $'
- rs232 db 'Число последовательных адаптеров стыка RS232: $'
- video db 'Начальный видеорежим: $'
- bw80x25 db '80x25 черно-белый',13,10,'$'
- c80x25 db '80x25 цветной',13,10,'$'
- c40x25 db '40x25 цветной',13,10,'$'
- unused db 'не используется',13,10,'$'
- math db 'Математический сопроцессор: $'
- present db 'есть',13,10,'$'
- absent db 'отсутствует',13,10,'$'
- endl db '*',13,10,'$'
- mem db 'Размер физической памяти: $'
- kb db ' Kb',13,10,13,10,'$'
- code ends
- end entry
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement