Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 296
от 21.06.2002, 07:40

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 496
Отправлено ответов: 1343
Активность: 270.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе]


 Список экспертов, ответы которых опубликованы в данном выпуске

masquer
Статус: Профессиональный
Общий рейтинг: 159.17
[Подробней >>]
Portnov
Статус: Доверительный
Общий рейтинг: 161.81
[Подробней >>]
vitya
Статус: Опытный
Общий рейтинг: 116.98
[Подробней >>]
 
Blackeye
Статус: Профессиональный
Общий рейтинг: 119.58
URL: Delphi, my programms...
[Подробней >>]
Broken Sword
Статус: Профессиональный
Общий рейтинг: 148.27
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 134.05
[Подробней >>]
 
DrGenius
Статус: Начальный
Общий рейтинг: 108.16
[Подробней >>]
Guess Who
Статус: Доверительный
Общий рейтинг: 104.79
[Подробней >>]
Zloy
Статус: Доверительный
Общий рейтинг: 105.66
[Подробней >>]
 
Dark_Lord
Статус: Опытный
Общий рейтинг: 119.83
Телефон: 36 30 3862503
[Подробней >>]
Топор
Статус: Опытный
Общий рейтинг: 124.38
URL: Хорошая Русская Металлическая команда
Телефон: (8462)160302, 162918
[Подробней >>]
Sensey
Статус: Профессиональный
Общий рейтинг: 146.04
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
 
kostik
Статус: Профессиональный
Общий рейтинг: 117.59
URL: Все о программистах и для программистов
Телефон: (4212)393-276
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 453. Здравствуйте эксперты! Не подскажите, можно ли записать файл (Win9x/NT) на диск так, чтобы он не поп... (ответов: 3)
Вопрос № 454. Добрый день Эксперты. Я написал программу, скидывающую все настройки BIOS, в том числе и пароль на ... (ответов: 2)
Вопрос № 455. Добрый день Эксперты. У меня возник вопрос: Как вывести на экран данные к примеру функции 32h (инфо... (ответов: 2)
Вопрос № 456. Привет всем кто читает мое послание.Я сам пытаюсь научиться писать прог-мы на асме так что извините ... (ответов: 5)
Вопрос № 457. Как сделать : Что бы моя программа при запуске сворачивалась и находилась рядом с часами(вроде это С... (ответов: 5)
Вопрос № 460. Hello ^)... (ответов: 1)
Вопрос № 461. Ребят, вот какой вопрос меня мучает... Если я под ДОСом запрещаю все прерывания, скажем командой _di... (ответов: 6)
Вопрос № 462. Добрый день уважаемые эксперты объясните пожалуйста как перевести число 9854691 в двоично-десятичный... (ответов: 4)

Вопросов: 8, ответов: 28


 Вопрос № 453

Здравствуйте эксперты!
Не подскажите, можно ли записать файл (Win9x/NT) на диск так, чтобы он не попал в кэш? Или как очистить дисковый кэш? Само кеширование отключать нельзя.



Вопрос отправлен: 16.06.2002, 05:42
Отправитель: Khanz (jcdaleks@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Здравствуйте, Khanz!
см. FlushFileBuffers

Ответ отправлен: 16.06.2002, 10:12
Отправитель: masquer


Отвечает Portnov

Доброе время суток, Khanz!
Насчет того, чтобы это программировать - не знаю, наверное, VxD писать нужно. Для очистки кэша видел бесплатную прогу на ListSoft'е, Sync, называется.
С уважением, Portnov.

Ответ отправлен: 16.06.2002, 11:12
Отправитель: Portnov


Отвечает vitya

Добрый день, Khanz!
Если тебя интересует то, чтобы данные сразу были записанны на диск, а не были в буфере, то просто вызови функцию FlushFileBuffers и передай ей хэндл на твой файл.

Ответ отправлен: 17.06.2002, 09:12
Отправитель: vitya


 Вопрос № 454

Добрый день Эксперты.
Я написал программу, скидывающую все настройки BIOS, в том числе и пароль на него (05eh).
Но почему-то ни фига не скидывается. Проверьте исходник. Где у меня может быть ошибка?


Приложение:


Вопрос отправлен: 16.06.2002, 06:33
Отправитель: EvilBit (TipOk@NewMail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Blackeye

Добрый день, EvilBit!
Убери из Bios proc mov al,00, и лучше заксорь ее в начале


Ответ отправлен: 16.06.2002, 07:51
Отправитель: Blackeye


Отвечает Portnov

Приветствую Вас, EvilBit!
Тэк. Вроде в TechHelp'е сказано, что 70h - это "AT register address (write-only) for Real-Time Clock and CMOS RAM", т.е. порт для часов и CMOS RAM. Что-то я не знаю, как вы собираетесь стирать BIOS, чо-то выводя в этот порт. 71h - это вроде что-то в том же духе. Так что IMHO у вас ошибка именно с портами, проверьте, туда ли выводите и то ли. А так нормальный исходник...
С уважением, Portnov.

Ответ отправлен: 16.06.2002, 11:27
Отправитель: Portnov


 Вопрос № 455

Добрый день Эксперты.
У меня возник вопрос:
Как вывести на экран данные к примеру функции 32h (информация ДОС о диске), 21h прерывания.
Объясните только как к примеру в al положить Размер сектора (смещ +2).
Большое спасибо.


Приложение:


Вопрос отправлен: 16.06.2002, 07:40
Отправитель: EvilBit

[Следующий вопрос >>] [Список вопросов]

Отвечает Blackeye

Добрый день, EvilBit!
Во-первых лучше не в AL, а в AX (размер сектора то 2 байта, т.е слово) А код вот:
mov ah,32h
mov dl,1
int 21h

mov ax,[bx+2];тут размер сектора
ret

Ответ отправлен: 16.06.2002, 19:30
Отправитель: Blackeye


Отвечает Broken Sword

Добрый день, EvilBit!
Ну как здесь объяснишь - в al размер сектора ты никак не положишь, т.к. bytes per sector - величина, имеющая размер word (слово), поэтому только в ax. А как это сделать ты хочешь узнать или что ?
mov ax,word ptr [bx+2] (и т.д., т.е. все время скачешь от bx)
в приложении см. кусок

Приложение:

Ответ отправлен: 16.06.2002, 11:58
Отправитель: Broken Sword


 Вопрос № 456

Привет всем кто читает мое послание.Я сам пытаюсь научиться писать прог-мы на асме так что извините если я написал ее совсем неправильно.Так я посылаю вам текст прог-мы мне нужно там каждое число перемножить на 2 и полученную сумму каждого числа прибавить на сумму следующего числа, помогите пожалуйста заранее благодарен


Приложение:


Вопрос отправлен: 16.06.2002, 13:46
Отправитель: mirik

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Приветствую Вас, mirik!
Ну, ошибок много...
1. Установка значений регистров si и di производится внутри цикла, что приводит к использованию одного и того же числа.
2. Умножение на 2 производится командой shl, а не shr.
3. Непонятны действия по сложению. Для больших чисел работать не должно.
4. inc ax - лишняя команда.
5. 9-я функция прерывания 21h использует знак '$' в качестве признака конца строки.
6. Описание переменной summa дано очень странно...
7. При компиляции tasm ругается на имя small, но это только предупреждение. Вообще непонятна любовь к формату EXE - на ассемблере же пишем! COM - и больше ничего!
В общем, компилится, но работать не будет.


Ответ отправлен: 17.06.2002, 13:15
Отправитель: Ayl


Отвечает Portnov

Здравствуйте, mirik!
Да-а... Давненько я не видел такого корявого кода... Ну да ладно, попробуем разобраться...
Совет: начали изучать языки - освойте сначала русский, а потом уже можно переходить на ассемблер. Понять вашу формулировку задачи невозможно.
Так, вы чем компилите? Tasm выдает предупреждение, и правильно делает: слово small зарезервировано, есть такая модель памяти, и Masm, по-моему, сделает то же...
А дальше пошли ошибки, о которых Tasm догадаться не может. Вы хотите, чтобы постепенно обрабатывались все данные? Тогда lea si,chisla//lea di,summa нужно делать перед циклом, а у вас si и di будут в каждом цикле указывать на одно и то же, и ваши INC SI не будут иметь действия. Дальше. MOV ax,[si] загрузит СЛОВО! т.е. два байта, т.к. AX- регистр 16-битовый. Если хотите загружать поочередно все слова, то перед каждым повторением цикла SI надо увеличивать на два, а не на один. Вообще-то, если вы не знали, для загрузки данных из памяти в AL/AX есть команды LODSB/LODSW. Они сразу и загружают, и увеличивают SI как надо. А так, как у вас, получается ерунда. Если не хотите LODSB, то пишите MOV AL,[si]//INC SI. Команда SHR AX,1 не умножает, а делит AX на два, вам, видимо, надо SHL. А AX вы зачем увеличиваете? Все равно ведь в следующем повторении в него загружать будете. А что вы хотели сказать строкой summa db '?' dup(0) ? Не знаю, а получите вы 2Fh (т.е. 47) нулей в сегменте данных, т.к. символ '?' имеет ASCII-код 47. А как вы девятой ф-цией int 21h собрались выводить данные, если не позаботились о том, чтобы они были закончены символом '$'?
В общем, назадавал я вам вопросов, когда себе на них ответите, попробуйте еще раз. И последнее: пользуйтесь отладчиком - много чего поймете.
С уважением, Portnov.

Ответ отправлен: 17.06.2002, 13:33
Отправитель: Portnov


Отвечает DrGenius

Приветствую Вас, mirik!
Одной из главных ошибок твоей программы является то что ты не различаешь ASC2 коды цифр и сами цифры, ASC2 код цифры получаеться прибавлением к этой цифре 30h (заметь это только для от 1 до 9). НА экран выводится цифры в ASC2 формате, а складываются в шестнадцетиричном!! А когда ты опрделяешь числа как
chisla db '12345678955', a затем помещаешь в ах
lea si,chisla
mov ax,[si] (кстати у здесь должно быть не ах, а регистр размером в байт...например al)
так вот ты помещаешь в ах(если все же рассмтривать его как однобайтовый) ASC2 код числа (в данном случае 31h).
! При выводе на экран числа нужно снова преобразовывать в ASC2 формат.
Этот вопрос очень хорошо освещен в книге Питера Абеля, если что давай мыло, я вышлю...
DrGenius

Ответ отправлен: 16.06.2002, 16:44
Отправитель: DrGenius


Отвечает masquer

Доброе время суток, mirik!
У тебя проблема в том что ты работаешь со строковым представлением числа как с числом, никто этого не запрещает в ассемблере, но это же не то, что тебе надо. После прочтения числа отнимай от него 30h ('5'=35h), после того как получишь сумму, тебе нужно будет перевести ее к строкову виду из 16-ричного.

Ответ отправлен: 16.06.2002, 15:10
Отправитель: masquer


Отвечает Guess Who

Приветствую Вас, mirik!
1)Думаю SMALL лучше заменить на CODE, у меня TASM ругается на использование зарезервированного слова.
2)Вы каждый раз в начале цикла заносите в si и di одни и те же значения, сделайте:
lea si,chisla
lea di,summa
cycle:
3)У вас цифры храняться в виде ascii кодов, делайте так:
chisla db 1,2,3,4,5,6,7,8,9,5,5
или когда заносите число в al вычитайте из него 30h:
mov al,byte ptr [si]
sub al,30h
или в вашем случае:
mov ax,[si]
and ax,0f0fh
4)Вы заносите в ax сразу две цифры(вернее их ascii-коды), здесь я думаю надо так:
mov al,byte ptr [si]
adc byte ptr [di],al
5)Зачем увеличивать ax?
6)И вообще я вопроса не понял! Если число умножить на другое, то результат называется ПРОИЗВЕДЕНИЕМ, а не суммой!!!
"прибавить на сумму следующего числа" - сумму с чем?
7) Напишите в виде формулы то, что вам надо, будет понятней!

Приложение:

Ответ отправлен: 16.06.2002, 15:52
Отправитель: Guess Who


 Вопрос № 457

Как сделать :
Что бы моя программа при запуске сворачивалась и находилась рядом с
часами(вроде это СистемТрей называеться),и второе как добавить кнопке
в проге действие спрятать в СистемТрей ?



Вопрос отправлен: 16.06.2002, 15:07
Отправитель: Chapaev

[Следующий вопрос >>] [Список вопросов]

Отвечает DrGenius

Здравствуйте, Chapaev!
Это неплохо описано в туториалах Iszelion'a, если надо могу выслать. drgenius@nm.ru


Ответ отправлен: 18.06.2002, 18:22
Отправитель: DrGenius


Отвечает masquer

Приветствую Вас, Chapaev!
Смотри функцию Shell_NotifyIcon

Ответ отправлен: 16.06.2002, 20:45
Отправитель: masquer


Отвечает vitya

Приветствую Вас, Chapaev!

Так это сразу и не напишешь, но вызвать тебе придется только одну функцию, а именно Shell_NotifyIcon.
А на второй вопрос, просто в обработчике этой кнопке
вызови эту функцию.
Да еще тебе придется поменять стили окна.


Ответ отправлен: 17.06.2002, 09:16
Отправитель: vitya


Отвечает Portnov

Доброе время суток, Chapaev!
Пишете на Асме? Тогда "перехватывать" события вашего окна (в частности, кнопки) нужно в цикле обработки сообщений. Это должен знать любой, кто пишет на асме под Win32.
А для работы с SysTray есть спец. ф-ция - Shell_NotifyIcon() называется. Про параметры см. Win32.hlp, например. Просто спрятать окно вы можете? А тут надо сначала показать иконку, а потом спрятать окно. Когда юзер кликает по иконке в SysTray, вашей проге посылается соотв. сообщение, и вам его надо обработать, если хотите, чтобы, например, окошко опять вернулось. Что за сообщения - см. справочники.
С уважением, Portnov.

Ответ отправлен: 17.06.2002, 13:34
Отправитель: Portnov


Отвечает Zloy

Здравствуйте, Chapaev!
Посмотри здесь: http://www.wasm.zite.ru/tuts/itutor23.shtml
Да и вообще в инете полно инфы по этому поводу!!!!


Ответ отправлен: 17.06.2002, 20:03
Отправитель: Zloy


 Вопрос № 460

Hello ^)



Вопрос отправлен: 16.06.2002, 22:20
Отправитель: йффы

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Доброе время суток, йффы!
А в глаз!?

Ответ отправлен: 17.06.2002, 00:21
Отправитель: Dark_Lord


 Вопрос № 461

Ребят, вот какой вопрос меня мучает... Если я под ДОСом запрещаю все прерывания, скажем командой _disable(), значит ли это, что я запрещаю и прерывание от таймера, вызываемого 18,2 раз в секунду ?



Вопрос отправлен: 17.06.2002, 01:02
Отправитель: Lilya

[Следующий вопрос >>] [Список вопросов]

Отвечает Топор

Добрый день, Lilya!
Таймер не запрещается. Его можно запереть только посылкой команды в порт.


Ответ отправлен: 17.06.2002, 17:11
Отправитель: Топор


Отвечает Ayl

Доброе время суток, Lilya!
Да, конечно.
Команда cli (_disable () - это ее реализация на Си) производит запрещение всех маскируемых аппаратных прерываний. Работать будет только прерывание NMI.


Ответ отправлен: 17.06.2002, 13:21
Отправитель: Ayl


Отвечает masquer

Здравствуйте, Lilya!
Если в этой команде будет инструкция cli, то да.

Ответ отправлен: 17.06.2002, 07:27
Отправитель: masquer


Отвечает Blackeye

Приветствую Вас, Lilya!
Мне кажеться тут ненадо путать IRQ и INTerruptions, а так чтобы запретить IRQ0 (timer) следай следующие:
in al,21h
or al,00000001b
out 21h,al


Ответ отправлен: 19.06.2002, 12:12
Отправитель: Blackeye


Отвечает Sensey

Добрый день, Lilya!
А что это за команда?
Если ее реализация
{ asm cli
}
Тогда да.

Ответ отправлен: 17.06.2002, 10:50
Отправитель: Sensey


Отвечает Portnov

Доброе время суток, Lilya!
Не совсем понял, что это за команда такая? Если имеется ввиду CLI, то да, прерывание таймера тоже запрещается. В связи с этим не рекомендуется надолго оставлять флаг IF сброшенным, а то часы начнут отставать, да и много чего нехорошего произойти может.
С уважением, Portnov.

Ответ отправлен: 17.06.2002, 13:34
Отправитель: Portnov


 Вопрос № 462

Добрый день уважаемые эксперты объясните пожалуйста как перевести число 9854691 в двоично-десятичный код.
И еще какие типы данных и их форматы аппаратно поддерживаются компьютерами i486 или Pentium



Вопрос отправлен: 17.06.2002, 07:32
Отправитель: Виталий

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Приветствую Вас, Виталий!
1. Здесь все зависит от того, в каком виде будет находиться в памяти это число, возможно, его дополнительно нужно преобразовывать.
2. В бинарном

Ответ отправлен: 17.06.2002, 09:04
Отправитель: masquer


Отвечает Portnov

Приветствую Вас, Виталий!
Тэк-с. Двоично-десятичный код бывает разный. Есть упакованный, а есть неупакованный. Однако у них много общего. Число в двоичный код переводить умеете? Так вот, берете каждую цифру вашего числа и переводите. Если нужен неупакованный дв.-дес. код, то каждую цифру кладете в отдельный байт, байты, есессно, должны идти подряд в порядке цифр. А если нужен упакованный, то каждую цифру кладете в полубайт.
Про второй вопрос - байт, слово, двойное слово, частично квадрослово (чаще всего пара edx:eax). Ну и двоично-десятчные коды, вы сами про них упомянули. Т.к. в Pentium сопроцессор встроенный, то он соотв. поддерживает форматы данных сопроцессора - всякие там длинные, короткие, двойные с плавающей точкой, там число хранится в виде мантиссы и порядка.
С уважением, Portnov.

Ответ отправлен: 17.06.2002, 13:35
Отправитель: Portnov


Отвечает kostik

Доброе время суток, Виталий!
Компьютер аппаратно поддерживает только один тип данных - двоичные. Помните 3 принцип фон Неймана? Он гласит, что все данные в компьютере кодируются в двоичном виде. Поддержка только двоичного представлеия связана с конструктивным строением транзисторов- они могут имть положения еть ток/нет тока.
То число, что вы привели после перевода имет вид. 100101100101111011100011. самый простой сособо перевода - при помощи "Калькулятора". А так - пишете степени двойки в ряд. И находите, как степени двойки надо сложить, чтобы получить число. Под теми степенями, что складывали записываем 1, а под остальными - 0.

Ответ отправлен: 17.06.2002, 13:55
Отправитель: kostik


Отвечает Guess Who

Добрый день, Виталий!
Двоично-десятичные числа хранятся в двух форматах:
1) Упакованный - в каждом байте хранятся две десятичные цифры.
Пример: |09|85|46|91|
2) Неупакованный - каждый байт содержит только одну десятичную цифру.
Пример: |09|08|05|04|06|09|01|
Вопрос в том, в какой вид и из какого вам надо перевести ваше число(в каком виде оно будет в программе).
Насколько я понял вопрос, то именно аппаратно поддерживаются, только двоичное представление любых данных, другого быть не может, т.к. логика, на которой построены компьютеры поддерживает только два состояния: лог. "0" и лог. "1" или нет сигнала, есть сигнал, все остальное производное.

Приложение:

Ответ отправлен: 17.06.2002, 18:00
Отправитель: Guess Who



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (51)
C / C++ (29)
Perl (9)
Delphi (15)
Pascal (27)
Basic / VBA (16)
Java / JavaScript (7)
PHP (7)
MySQL / MSSQL (8)
Пользователю
Windows 95/98/Me (48)
Windows NT/2000/XP (34)
"Железо" (40)
Поиск информации (21)
Администратору
Windows NT/2000/XP (16)
Linux / Unix (9)
Юристу
Гражданское право (11)
Семейное право (5)
Трудовое право (6)
КоАП (3)

Отправить вопрос всем экспертам выбранной рассылки.




be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное