Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
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.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту 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) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||