Извлечение информации из двойного слова

Тема в разделе "WASM.BEGINNERS", создана пользователем _AVS_, 12 дек 2007.

  1. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Здравствуйте!

    У меня есть слово. Например, его имя KOL. 14 и 15 биты хранят некое число. Как мне извлечь их из этого слова и вывести на экран это самое число? Пожалуйста, напишите код. Очень надо! Help!!! )))
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1. ; eax - src
    2. shr  eax,14
    3. and  eax,11b
    Что есть 00, 01? Биты? Какая ОС?
     
  3. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    для двойного слова
    Код (Text):
    1. KOL dd ?
    2. and dword ptr [KOL],0000c000h
    3. shr dword ptr [KOL],14
    4. add byte ptr [KOL],'0'
    5. push word ptr [KOL]
    6. call SomePrintToScreenProcedure
    7. call StandardExitProcedureForOurOS
    для слова
    Код (Text):
    1. KOL dw ?
    2. and word ptr [KOL],c000h
    3. shr word ptr [KOL],14
    4. add byte ptr [KOL],'0'
    5. push word ptr [KOL]
    6. call SomePrintToScreenProcedure
    7. call StandardExitProcedureForOurOS
    опоздал =)
     
  4. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    IceStudent Да, биты. Windows XP.
     
  5. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Код (Text):
    1. MASM
    2. MODEL  SMALL
    3. .DATA
    4.     KOL DW 0
    5. .CODE
    6.  
    7. MAIN PROC
    8.  
    9. MOV AX,@DATA
    10. MOV DS,AX
    11. MOV AH,2AH
    12. INT 21H
    13.  
    14. INT 11H
    15.  
    16. MOV KOL,AX
    17.  
    18. ;завершение программы
    19. END MAIN
    Здесь я хочу вывести на экран кол-во LPT портов на данной машине. INT 11H помещает в AX инфу о подключенных устройствах. AX (16 бит) копирую в KOL. И теперь мне надо вывести число, которое содержат 14 и 15 биты переменной KOL. ОС Windows.

    Здесь явно не верно написал. Мне надо написать программу, выводящую на экрна количество LPT портов на данной машине. Помогите с задачей.
     
  6. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    ОСь-то, по-видимому, DOS :)
    Код (Text):
    1. mov  dx, kol
    2. shr  dx, 14
    3. add  dl, 30h
    4. mov  ah, 02h
    5. int 21h
     
  7. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    вывод строки на экран : http://www.google.ru/search?hl=ru&q=%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8+%D0%BD%D0%B0+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD+int+21h&lr=
    http://www.google.ru/search?hl=ru&newwindow=1&suggon=0&q=%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8+%D0%BD%D0%B0+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD+int+10&lr=
    остальное уже всё есть
     
  8. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Блин, я в Ассемблере 0! Помогите с написанием программы. Очень надо! Можете написать программу, выводящую на экран количество LPT портов на данной машине за Яндекс.Деньги?
     
  9. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Код (Text):
    1. ideal
    2. model tiny
    3. codeseg
    4. org 100h
    5. start:
    6.                 int     11h
    7.                 mov     al,ah
    8.                 shr     al,6
    9.                 or      al,'0'
    10.                 mov     [num],al
    11.                 mov     ah,9
    12.                 mov     dx,offset mess
    13.                 int     21h
    14.                 ret
    15.  
    16. mess db 13,10,'Количество параллельных портов: '
    17. num db ' .',13,10,'$'
    18.  
    19. end start
     
  10. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Vov4ick

    Спасибо за помощь. Я скомпилировал, но мне трижды выводится результат и кроме него "абракадабра". Кириллицу заметил на латинские быквы, но это не помогло. Кроме того, программа после этого зависает.
     
  11. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Используй нормальный редактор, а не блокнот. Чтобы знал альтернативную кодировку.
     
  12. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    вместо ret поставь int 20 или retn
     
  13. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Код (Text):
    1. ideal
    2. model tiny
    3. codeseg
    4. org 100h
    5. start:
    6.                 int     11h
    7.                 mov     al,ah
    8.                 shr     al,6
    9.                 or      al,'0'
    10.                 mov     [num],al
    11.                 mov     ah,9
    12.                 mov     dx,offset mess
    13.                 int     21h
    14.                 int 20
    15.  
    16. mess db 13,10,'Chislo LPT: '
    17. num db ' .',13,10,'$'
    18.  
    19. end start
    Изменил как сказал. Но теперь выводит просто число. Может еще что-то поменять? Компилирую в Turbo Assembler как exe-файл. Нужен именно exe.
     
  14. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    dag int 20h :derisive:
    Код (Text):
    1. ideal
    2. model small
    3. codeseg
    4. org 100h
    5. start:
    6.                 mov     ax,@data
    7.                 mov     ds,ax
    8.  
    9.                 int     11h
    10.                 mov     al,ah
    11.                 shr     al,6
    12.                 or      al,'0'
    13.                 mov     [num],al
    14.                 mov     ah,9
    15.                 mov     dx,offset mess
    16.                 int     21h
    17.  
    18.                 mov     ah,4ch
    19.                 int     21h
    20.  
    21. dataseg
    22. mess db 13,10,'Количество параллельных портов: '
    23. num db ' .',13,10,'$'
    24.  
    25. stack
    26.  
    27. end start
     
  15. _AVS_

    _AVS_ New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    10
    Огромное спасибо! Работает! Выручили! У меня последний вопрос. думаю я уже надоел вам)))).

    Прокомментируйте пожалуйста подробно что выполняется здесь (чтобы защиту лабы не запороть):

    Код (Text):
    1.                 mov     al,ah
    2.                 shr     al,6
    3.                 or      al,'0'
    4.                 mov     [num],al
    5.                 mov     ah,9
    6.                 mov     dx,offset mess
    7.                 int     21h
    И что такое
    в сегменте данных? Как это объединяет строки?

    У МЕНЯ НА КОМПЕ СТОИТ 1 LPT ПОРТ (ЭТО ВИДНО В ДИСПЕТЧЕРЕ УСТРОЙСТВ), А ДАННАЯ ПРОГРАММА ГОВОРИТ ЧТО ИХ ТРИ! ПОЧЕМУ?

    Заранее благодарен.
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    _AVS_
    1) mov al,ah/shr al,6 то же самое что и shr ax,14 (14=6+8)
    2) or al,'0' - получение ASCII символа, соответствующего числу находящемуся в al
    3) mov ah,9/mov dx,offset mess/int 21h - вывод на экран строки находящейся по адресу mess до знака '$'
    4) 13,10 символы приводящие к переходу на следующую строку экрана
    5) в диспетчере устройств ты можешь программно переключить параллельный порт на LPT1, LPT2, LPT3
     
  17. Miha_X

    Miha_X New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2007
    Сообщения:
    4
    А как надо поменять код программы, чтобы она выводила количество не LPT портов, а COM портов?
     
  18. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Vov4ick
    Естественно ... =)
     
  19. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    dag
    retn -- для com-файлов прекрасный выход и короче int 20h на 1 байт, правда стек должен быть сбалансирован, иначе можно использовать комбинацию push 0/retn