Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 154 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-12-12
Вопрос №1794
Здравствуйте эксперты.
1)Можно ли заставить печатать принтер
Lexmark Z12 из Windows 3.11 FWG (продавец клялся что можно)
2)Есть ли где нибудь драйвера для видео карты S3 Trio3D /2X
под Windows 3.11
Ответ
Здравствуйте, Kostyan!
Самые большие файловые архивы драйверов в рунете:
www.driver.ru
www.mydriver.ru
Отправил эксперт: DivX
Эксперт отправил ответов (всего): 77
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1795
Здраствуйте!
Вопрос такой:
Автор приводит данный пример и утверждает что приведенная ниже конструкция ошибочна:
STUD STRUKT
FAM DB 30 DUP(?)
STUD ENDS
;--------------
S1 STUD <'Типа поле M не строка...?'>; нельзя (поле FAM- не строка)
Ответ
Здравствуйте, Alex!
Не строка а набор байтов. Так понятно почему в угловых скобках инициализируется вся структура, а ты пытаешься описать первый элемент. Хотя если по этому адресу записать строку ошибки не будет.
Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 134
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1802
Уважаемые эксперты мой вопрос №1743 почему то все проигнорировали. Посему задаю его еще раз и сердечно прошу ответить на него:
Стоит задача здать курсовой, тема которого "Взлом паролей Windows". Нет ли у кого нибудь из вас исходников по взлому pwl файлов, или хотя бы документации как это делать. Помогите пожалуйста если есть чем. Заранее благодарен.
Ответ
Здравствуйте, student!
Сходи на www.c2.org/hacksoft
Там навалом прог для ломки pwl, некоторые с исходниками.
Отправил эксперт: ScientiaCupidus
Эксперт отправил ответов (всего): 12
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
Вопрос №1803
У меня такой вопрос:
Как В borland c++ 3.11 или Visual C++ 6.0 написать прогу для запуска двух программ без всяких параметров и ключей (com и exe файлы). Необходимо для завершения курсовика. Заранее спасибо!
Ответ
Здравствуйте, Kingos!
Да просто
#include
...
...
system("прога1");//если она в текущем каталоге
system("прога2");
...
Отправил эксперт: ScientiaCupidus
Эксперт отправил ответов (всего): 13
Экспертная группа: Оптимизация программ
Вопрос №1803
У меня такой вопрос:
Как В borland c++ 3.11 или Visual C++ 6.0 написать прогу для запуска двух программ без всяких параметров и ключей (com и exe файлы). Необходимо для завершения курсовика. Заранее спасибо!
Ответ
Здравствуйте, Kingos!
Используйте функцию execXX
Отправил эксперт: Ivan
Эксперт отправил ответов (всего): 8
Экспертная группа: Оптимизация программ
Вопрос №1801
Поддерживает ли TASM новые команды процессора? Например,
расширение SSE?
Ответ
Здравствуйте, TanaT!
Да например Tasm 5.3, который идет вместе с CBuilder 5,например.
Отправил эксперт: RelB
Эксперт отправил ответов (всего): 2
Экспертная группа: Работа с MASM/TASM
Вопрос №1804
Здравствуйте.
Надо написать программу, резидент. Суть в следующем: в любом текстовом редакторе, при нажатии на клавишу печатается соответствующий символ, надо сделать чтобы и при отжатии клавиши печатался этот же символ. Я делаю так:
1. Перехватываю int09h.
2. В своем обработчике определяю сканкод нажатой клавиши (через порт 60h, 1 байт)
3. Если старший байт =0, то передаю управление старому обработчику.
Если стариший байт = 1, значит прерывание произошло по отжатию (насколько я знаю, код отжатия равен коду нажатия +80h). Меняю 1 на 0.
4. А вот что дальше делать - не знаю. Надо бы обработанный код запихнуть туда, откуда я его взял (или еще куда-то?), но как это сделать? Пробовал поместить в буфер клавиатуры но вызов int16h вешает комп. В каких-то доках прочел про адреса буфера клавиатуры в памяти, указатель на начало/конец буфера, адерс начала/конца. Не могу понять, в чем разница между указателем и адересом в данном случае.
Вобщем запутался окончательно. Помогите, плз. Лабу сдавать надо, а сессия уже через 2 недели.
С уважением, Антон.
Ответ
Здравствуйте, Anton!
1. замечательно! Я бы тоже перехватывал :)
2. и это правильно
3. и тут вроде не к чему придраться...
4. а здесь вопрос. На кого возложена обработка символов? На оригинальный обработчик или сам делаешь? Если на оригинальный - то никак. Надо самому. И записывать в буфер клавиатуры. Только надо учесть, что его размер 16 байт. Адрес начала буфера записан по адресу 0040:001a (1 слово), адрес конца - 0040:001c. Если head = tail - буфер пуст, если head = tail + 2 - заполнен. Только надо с вариантом tail > head разобраться. Кстати, и head, и tail содержат смещения в сегменте 0040 и принимают значения от 001e до 003c.
После этого смысла вызывать старый обработчик никакого нет. Поэтому завершаем процедуру (см. кусок кода)
Приложение:
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 108
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1805
Возможно ли использовать ОЗУ как видеопамять. И если возможно то как это настроить.
Ответ
Здравствуйте, teo2!
На сколько я помню в биосе есть параметр 'AGP apperture size'.
Вот он и отвечает за использование ОЗУ для нужд видяхи. Правдв как ты сам понимаешь скорость обмена при этом сильно страдает :-)
Отправил эксперт:
Эксперт отправил ответов (всего): 1
Экспертная группа: Пользовательская работа с Windows
Вопрос №1797
Здрасте ВСЕМ экспертам, а особенно Ayl или Broken Sword
ПОМОГИТЕ разобраться вот с чем:
xor dx,dx ; c этого места начинается простая процедурка перевода hex в ASCII для вывода на экран
mov bl,10
div bl
inc ah
or al,30h
int 29h
xchg al,ah
or al,30h
int 29h
Опишите как более гуще о ней
Спасибо ВАМ !!!!
Ответ
Здравствуйте, Jester's!
xor dx,dx - очистка регистра DX - в DX ноль.
mov bl,10 - присвоение в рег. BL знач. 10 (0Ah) - основание десятичной системы отсчета.
div bl - делим AX на BL, результаты: частное в AL, остаток в AH. AX(старое) = AL * 10 + AH.
inc ah - увеличиваем остаток на 1 - младшее число увеличено на 1 - это не верно для корректного перевода в десятичную нотацию!!!
or al,30h - скаладывем логически частное от последнего деления с 30h (это тоже, что сложение с '0'. У символа '0' код 30h).
Главное условие - число в AL не должно быть больше 9, чтобы корректно отображать числа от 0 до 9 - оно (условие) в этом коде выполняется.
int 29h - вывод на экран. Этот сервис (недокументированный Microsoft) появился в DOS 6.0. В рег. AL - символ, в рег. BL - цвет для символа.
xchg al,ah - обмен содержимых регистров. В данном случае, в AL помещается знач. рег. AH, а в рег. AH - знач. AL.
or al,30h - см. выше
int 29h - см. выше.
Следовательно, если этот код выполнен в виде отдельной процедуры или ф-ции этот код, то его вызываем с параметрами - в AL - число, а цвет символа всегда = 0Ah (10).
Отправил эксперт: Kgm
Эксперт отправил ответов (всего): 9
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1805
Возможно ли использовать ОЗУ как видеопамять. И если возможно то как это настроить.
Ответ
Здравствуйте, teo2!
Нет, это невозможно.
Существуют просто такие видеокарты (интегр. на мат. плате), использующие Ram как видео память.
Отправил эксперт: Sheriff
Эксперт отправил ответов (всего): 6
Экспертная группа: Пользовательская работа с Windows
Вопрос №1792
Для Broken Sword !!!!
Нужна помощь в некоторых командах:
опишите как более подробно эти команды(не понымаю их) :-)))
1.org 100h
2.check macro var
3.local @@1
4.mov byte ptr var,al
5.что за текстовый режим 3 в int 10h
6.not ax
7.or al,30h
8.calculate proc near
9.чем отличается fld1 от fild y
10.fyl2x,fdivp,fmulp,fistp-опишите как происходят операции в этих командах(деление акам.на рег. и .....)
11.чем отличается calculate endp от end calculate
Заранее благодарен за огромную помощь во всем (пиво как всегда с меня) :-)))))))
Ответ
Здравствуйте, Jester's!
1.org 100h - установить начало следующего блока (кода, данных и вообще не важно чего, лишь-бы это были байты) с позиции адреса 100h в текущем сегменте.
Данная директива чаще всего используется при создании .COM - файлов и, указанная перед начальным исполняющимся кодом в тексте .ASM-файла, инструктирует компилятор и линкер, что первый байт этого .COM-файла начинается с адреса SEG:0100h.
2.check macro var - это первая строка объявления макроса с именем check и входным параметром var. Общий вид может быть таким:
check macro var - открываем описание макроса
.....
<что-то здесь делаем>
.....
endm - закрываем тело макроса
3.local @@1 - директива указывающая, что в данном блоке процедуры символ @@1 есть локальная переменная или метка и область ее жизни ограничивается телом этой процедуры, т.е. ссылка на нее за пределами процедуры где она описана запрещена.
4.mov byte ptr var,al - поместить значение рег. AL в ячейку памяти размером 1 байт по адресу, который находится в переменной var.
Это механизм пересылки данных посредством косвенной адресации:
переменная var ссылается на ячейку памяти (содержит в себе адрес этой ячейки).
5.что за текстовый режим 3 в int 10h - обычный текстовый режим, что чаще всего устанавливается при вкл. компьютера, в DOS-е.
Разрешение: 80 позиций и 25 строк символов. 16 цветов.
6.not ax - инвертирование битов значения, находящегося в рег. AX.
Пример: ax = 01234h
not ax
результат в ax = 0EDCBh
not ax
результат в ax = 01234h
7.or al,30h - логическое сложение (операция ИЛИ, OR) знач. рег. AL c 30h и результат помещается в регю AL. Это побитовое сложение двух чисел: 0 or 0 = 0; 1 or 0 = 1; 1 or 1 = 1;
Пример: al = 08h
or al, 30h
результат в al = 38h
or al, 30h
результат в al = 38h
or al, 80h
результат в al = 0B8h
8.calculate proc near - обявление процедуры с именем calculate и указанием, что вызовы процедуры будет осуществляться как ближние (near), т.е. находящиеся в том же сегменте кода где расположен код процедуры:
call calculate
Директива NEAR указывает компилятору генерировать выход из процедуры как из ближнего вызова и использовать для этого команду RETN.
9.чем отличается fld1 от fild y
fld1 - загрузить в рег. ST0 (в вершину стека регистров математического сопроцессора)знач. 1.0
fild y - загрузить в ST0 значение на которое ссылается указатель y, которое (само значение, а не указатель) представляет собой целое число размером 2, 4 или 8 байт.
fld1 работает быстрее и занимает меньше памяти чем команды
fild word ptr [odin]
fild dword ptr [odin]
где
odin db 1, 0, 0, 0 (можно dw 1 или qw 1)
10.fyl2x,fdivp,fmulp,fistp-опишите как происходят операции в этих командах(деление акам.на рег. и .....)
fyl2x - ST0 = ST0 * log2( ST1 ).
fdivp ST(i), ST0 - ST(i) = ST0 / ST(i), далее выталкивание верхнего (ST0) регистра из стека регистров. Т.е. ST(i) теперь будет ST(i-1).
fmulp ST(i), ST0 - ST(i) = ST0 * ST(i), далее выталкивание верхнего (ST0) регистра из стека регистров. Т.е. ST(i) теперь будет ST(i-1).
fistp [ADDR] - поместить в ячейку памяти размером 2, 4 или 8 байт значение из рег. ST0 в целочисленном виде (если не ошибаюсь без какого-либо округления) и вытолкнуть ST0, т.е. уменьшить индекс стека регистров, после чего ST1 будет ST0, ST2 -> ST1 и т.д.
11.чем отличается calculate endp от end calculate
calculate endp - директива окончания (закрытия) тела процедуры calculate;
end calculate - директива окончания ASM текста и указанием метки calculate как стартовой точки программы.
Про пиво не забудь :-)))))))
Отправил эксперт: Kgm
Эксперт отправил ответов (всего): 10
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1805
Возможно ли использовать ОЗУ как видеопамять. И если возможно то как это настроить.
Ответ
Здравствуйте, teo2!
Возможно - это реализуют драйвера для современных видеокарт (для шины AGP выставляется кажется в BIOS в разделе Chipset Features в опции AGP Apperature Size , а для PCI-шины в настройках драйверов видео(драйвера nVidia)). Но, увы для этих же современных видюх данная возможность стала уже не актуальна с ростом объема локальной видеопамяти и повышением требований к ее пропускной способности.
Для старых карт - не знаю; принципиально это возможно разрешить программным путем.
Отправил эксперт: DivX
Эксперт отправил ответов (всего): 78
Экспертная группа: Пользовательская работа с Windows
Вопрос №1797
Здрасте ВСЕМ экспертам, а особенно Ayl или Broken Sword
ПОМОГИТЕ разобраться вот с чем:
xor dx,dx ; c этого места начинается простая процедурка перевода hex в ASCII для вывода на экран
mov bl,10
div bl
inc ah
or al,30h
int 29h
xchg al,ah
or al,30h
int 29h
Опишите как более гуще о ней
Спасибо ВАМ !!!!
Ответ
Здравствуйте, Jester's!
c этого места начинается простая процедурка перевода hex в ASCII для вывода на экран
xor dx,dx
; эта команда совсем не нужна, сейчас скажу почему.
mov bl,10
; bl - это делитель
div bl
; ax делится на bl. dx тут никак не используется и поэтому занулять его не нужно!
inc ah
; Это зачем???
or al,30h
; вообще логичнее было бы сделать add al, '0' оно же 30h. но и or тоже пойдет. это перевод числа в аскии код.
int 29h
; выводим десятки.
xchg al,ah
; в al помещаем остаток от деления. то есть еденицы.
or al,30h
; то же самое что и выше.
int 29h
; и выводим еденицы.
но эта фнукция обработает числа только от 0 до 99.
то есть от 0 до 63h. при больших сначениях первая цифра будет принимать вид от ':' до 'I'...
Вот вроде все.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 213
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1804
Здравствуйте.
Надо написать программу, резидент. Суть в следующем: в любом текстовом редакторе, при нажатии на клавишу печатается соответствующий символ, надо сделать чтобы и при отжатии клавиши печатался этот же символ. Я делаю так:
1. Перехватываю int09h.
2. В своем обработчике определяю сканкод нажатой клавиши (через порт 60h, 1 байт)
3. Если старший байт =0, то передаю управление старому обработчику.
Если стариший байт = 1, значит прерывание произошло по отжатию (насколько я знаю, код отжатия равен коду нажатия +80h). Меняю 1 на 0.
4. А вот что дальше делать - не знаю. Надо бы обработанный код запихнуть туда, откуда я его взял (или еще куда-то?), но как это сделать? Пробовал поместить в буфер клавиатуры но вызов int16h вешает комп. В каких-то доках прочел про адреса буфера клавиатуры в памяти, указатель на начало/конец буфера, адерс начала/конца. Не могу понять, в чем разница между указателем и адересом в данном случае.
Вобщем запутался окончательно. Помогите, плз. Лабу сдавать надо, а сессия уже через 2 недели.
С уважением, Антон.
Ответ
Здравствуйте, Anton!
Вообще вариантов достаточно много, есть всякие служебные кнопки, но если на них не обращать внимания, то сбрось старший бит и передай его в буфер клавиатуры, который находится по адресам 40h:1eh указатели находятся там же, но чуть выше. подробнее можешь посмотреть в techhelp.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 214
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1807
Госпада, товарищи эксперты подскажите, как программируется обычный дисковод на 3,5 (можно на 5,25)
Как читать FAT. И если можно то в стиле для тугодумов. В принципе дискету я, прочитать смог, и записать тоже. Но если в первом случаи мне это ничего не дало, то во втором ничего хорошего не вышло.
С нетерпением жду ваших ответов.
Ответ
Здравствуйте, SG!
Коль Вам известно, что такое FAT, то, IMHO, объяснять логическую структуру флоппи-диска не следует.
Во-первых, следует прочитать первый сектор нулевой стороны диска (чтобы определиться - с чем мы имеем дело), для этого заводим в программе массивчик размерчиком 512 байтиков. Вообще-то мы получим 512 байт никому ненужного хлама: из них нас интересуют лишь "количество секторов на дорожке", "количество зарезервированных секторов", "размер FAT", "число копий FAT" - подробненько всё это дело можешь выудить из TeachHelp'а. Так вот: так необходимый тебе FAT начинается с сектора "количество зарезервированных секторов"+1 и занимает "размер FAT" секторов.
Для чтения, как обычно, есть как минимум два способа: сложный и очень сложный.
1. Начнём со сложного.
Умный Билл в своё время облегчил жизнь программистам, написав функцию чтения/записи секторов на дисках MS-DOS. Это прерывания 25h(чтение) и 26h (запись). Они работают с номером сектора, начиная с 0, при этом понятий "сторона" и "дорожка" не существует вообще (красота!)
2. Очень сложный
Вызываем int 13h, предварительно заполнив регистры процессора:
AH=02h (чтение)
AL=01h (только один сектор)
CX=0001h (первый сектор нулевой дорожки)
DL=00h или 01h (номер привода FDD)
DH=00h (нулевая сторона)
ES=seg Buffer
BX=offset Buffer
После вызова int'а начнём разбирать содержимое.
Если этих самых "зарезервированных секторов" больше, чем "количество секторов на дорожке", тебе придётся вычислить номер головки и номер дорожки (хотя это уже клинический случай - обычно FAT начинается со второго сектора).
Дальше - читай свой FAT в буфер, размером 512h*"размер FAT" (не забывая при этом, что за один вызов читается секторов не больше, чем "количество секторов на дорожке").
Отправил эксперт: Артём Шегеда (shegeda.chat.ru - Личная страничка - ничего особенного)
Эксперт отправил ответов (всего): 2
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1793
Здравствуйте, уважаемые эксперты!
Есть программа, которая при ответе на вопрос "Хотите вывести данные на принтер" - да, печатает данные. Так вот, нужно состряпать резидент, который бы заставлял эту прогу выводить данные не на принтер, а в файл какой-нить. Помогите, пожалуйста! Очень надо. Только поподробней и с объяснениями.
Заранее благодарен.
Ответ
Здравствуйте, Эдуард!
Если твоя прога работает с принтером через порты, то про резидент благополучно забудь. Если же через int 17h, то тода все очень просто - перехватываешь 17 прерывание (как угодно) и в обработчик сунешь 40-ую функцию int 21h (или через порты, это уж как фантазия развернется).
Самый примитивный и кривой пример - в приложении. Почему примитивный? Потому что при любом обращении к принтеру по 17h прерыванию (даже простая инициализация) будет создаваться файл содержащий всякую лабуду; полезную инфу он будет содержать только в случае, если ah=f1h, в этом случае, буффер dx:si указывает на что то конкркетное и пример писан именно для этого случая. Способов и функций записи в принтер существует великое множество. А т.к. речь идет о какой то загадочной проге, то она вообще может все что угодно себе позволить, поэтому бери софтайс и сиди смотри, что происходит на самом деле (discovery channel)
Приложение:
Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 240
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1809
Уважаемые эксперты !
2 вопроса :
1) Не хочет работать turbodebuger (td.exe). Пишет "No entry
point".мОЖЕТ КТО ЗНАЕТ , что ему нужно для полного счастья?
2) Numega SoftIse. Пытаюсь поставить breakpoint на Win-функцию (bpx MessageBoxA). Функции типа MessageBox (без A,16bit) он принимает,а на функции типа MessageBoxA (32bit)
ругается : "Symbol not defined" . Windows стоит 98ю 32bit.
И чего это он функции не находит ?
Заранее спасибо.
ARa
Ответ
Здравствуйте, ARa!
по поводу второго вопроса:
1. Кто тебе сказал, что буковка А в конце - это разрядность??? А - это не что иное, как принадлежность к "обычному набору символов ASCII" (если U - то Unicode)
А насчет того, что оно не понимает, попробуй сделай так:
Залезь в конфиг айса, найди там строку типа export (она по умолчанию заремлена) и впиши туды kernel32.dll, user32.dll, естественно предварительно "разремив", может из-за этого
Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 243
Экспертная группа: Дизассемблеры
Вопрос №1813
Здравствуйте,уважаемые эксперты.При выполнении 1программы
из рассылки №1 возникли следуюшие ошибки:
prog.asm(7):error A2008:syntax error:int20h
prog.asm(8):error A2046:missing double quotation mark in string
prog.asm(9):error A2046:messing double quotation mark in string
prog.asm(5):error A2006:undefined symbol:Message
Обясните,пожалуста,что я сделал не так?
Спомощью какого отладчика и как можно увидеть действие
программы. Спасибо за ответ.
Ответ
Здравствуйте, Юрий!
В 7 строчке надо писать
int 20h
ЧЕРЕЗ ПРОБЕЛ!
Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 226
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1814
Здравствуйте эксперты! В Линуксе при инсталляции невозможно достать диск из CDROM (даже кнопкой Open). Как такое сделать в Dos/Win (желательно фрагмент на Асме)?
EraSer
Ответ
Здравствуйте, EraSer!
Есть прога в Тошибовских дровах под дос называется Lock.EXE!
Отправил эксперт: AllAddIn
Эксперт отправил ответов (всего): 18
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1811
Здравствуйте, уважаемые эксперты!
Хочу чтобы выводилось время м/у двумя нажатыми клавишами,
но выводится какая-то фигня, ну т.е. выводится, но мне кажется прошло меньше время, чем выводится, да и можно ли сделать вывод покрасивше, типа: "Время составляет ..."
можно ещЈ что-то типа CLS DOS'кого сделать?
P.S.Сильно не пинайте уже задавлись такого типа вопросы,
но по такой задумке можно сделать это?
Ответ
Здравствуйте, Anton!
Начнём с малого...
Функция 20h прерывания int 21h уже канула в Лету (да и не известно, что это за функция), посему смысл её мне не ясен. Логичнее было бы засечь текущее время (той же функцией 2Ch), а затем найти разность между текущим и сохранённым временем. А вот разность вывести на экран.
Я тут попробовал программку состряпать с использованием этих функций - одна головная боль. Лучше читать значение по адресу 0040:006C - там хоть счётчик линейный (в смысле не побит на секунды/минуты/часы). Действия те же - засекаешь, вычитаешь, умножаешь на 18.2 - и результат готов.
Отправил эксперт: Артём Шегеда (shegeda.chat.ru - Личная страничка - ничего особенного)
Эксперт отправил ответов (всего): 3
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1814
Здравствуйте эксперты! В Линуксе при инсталляции невозможно достать диск из CDROM (даже кнопкой Open). Как такое сделать в Dos/Win (желательно фрагмент на Асме)?
EraSer
Ответ
Здравствуйте, EraSer!
Извини, на знаю, но Rambler выдал ссылочку:
Cat Soft Group
Отправил эксперт: Артём Шегеда (shegeda.chat.ru - Личная страничка - ничего особенного)
Эксперт отправил ответов (всего): 4
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1812
Здравствуйте эксперты!
Объясните, почему программа не хочет транслироваться. Вроде бы все как в книжке, а не работает.
Пользуюсь Tasm5.
Ответ
Здравствуйте, ILYA D.!
Если я не ошибаюсь, присвоение параметрам каких-либо значений при объявлении макроса запрещено. Поэтому из строки:
def_table macro type=b, len=REQ
следует убрать присвоение:
def_table macro type, len
Компиляция после этого проходит нормально.
Отправил эксперт: Kgm
Эксперт отправил ответов (всего): 11
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1817
Уважаемые эксперты!
Моего друга мучает одна проблема. У него два жЈстких диска. На каждом из них имеется один Primary и один Extended- раздел. Друг некоторое время назад установил, а затем удалил Linux с Primary-раздела второго диска. В результате Windows перестала видеть этот раздел. В Partition Magic'е 6.0 он отмечен как hidden. После снятия аттрибута и перезагрузки раздел по-прежнему остаЈтся скрытым. Помогите, пожалуйста.
Пуху пух, миру мир.
Ответ
Здравствуйте, Pooh!
В том же PM поменять тип разделов на Fat 16*n, n=1,2
Отправил эксперт: Sheriff
Эксперт отправил ответов (всего): 7
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1818
Почему при линковании *.css - файла в HTML и одновременном задании в качестве фона рисунка из графического файла почему-то не находится (не видно результатов форматирования) *.css - файл? Зато при явной вставке его содержимого между тегами всЈ идет нормально!?!?
Ответьте, пожалуйста.
Ответ
Здравствуйте, Anton!
Попробовал повторить ситуацию, что Вы описали - с завидным постоянством не хочет отображать фон, занный GIF-файлом. НО нормально отображает JPEG и PNG (8-o).
Что-то тут не так...
Отправил эксперт: Артём Шегеда (shegeda.chat.ru - Личная страничка - ничего особенного)
Эксперт отправил ответов (всего): 5
Экспертная группа: Пользовательская работа с Windows
Вопрос №1819
Почему при линковании *.css - файла в HTML и одновременном задании в качестве фона рисунка из графического файла почему-то не находится (не видно результатов форматирования) *.css - файл? Зато при явной вставке его содержимого между тегами всЈ идет нормально!?!?
Ответьте, пожалуйста.
Ответ
Модератору (если таковой имеется):
Рекомендую фильтровать вопросы от вопрошающих и, в случае повторения текста вопроса, рубить поток хлама на корню - ведь в рассылке чётко оговорены правила подачи вопроса!
Отправил эксперт: Артём Шегеда (shegeda.chat.ru - Личная страничка - ничего особенного)
Эксперт отправил ответов (всего): 6
Экспертная группа: Оптимизация программ
Вопрос №1820
Плиз, cкиньте мне докуметацию (все равно на каком языке) по TASM 5.0 и MASM 6.0 (Лишь бы версия у TASM и MASM была не ниже). Шлите на tanat@yes.ru без предупреждения.
Ответ
Здравствуйте, TanaT!
Таких нет и не будет.Только может любительские.Самая новая только 3.0
Больше и не надо!
Отправил эксперт: RelB
Эксперт отправил ответов (всего): 3
Экспертная группа: Работа с MASM/TASM
Вопрос №1812
Здравствуйте эксперты!
Объясните, почему программа не хочет транслироваться. Вроде бы все как в книжке, а не работает.
Пользуюсь Tasm5.
Ответ
Здравствуйте, ILYA D.!
Если из описания макроса убрать присваивания, то программа прекрасно транслируется. Значит, все дело в неправильном использовании конструкций языка. Я сейчас не помню синтаксиса описания макроса, поэтому рекомендую посмотреть книжку по TASM.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 109
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1813
Здравствуйте,уважаемые эксперты.При выполнении 1программы
из рассылки №1 возникли следуюшие ошибки:
prog.asm(7):error A2008:syntax error:int20h
prog.asm(8):error A2046:missing double quotation mark in string
prog.asm(9):error A2046:messing double quotation mark in string
prog.asm(5):error A2006:undefined symbol:Message
Обясните,пожалуста,что я сделал не так?
Спомощью какого отладчика и как можно увидеть действие
программы. Спасибо за ответ.
Ответ
Здравствуйте, Юрий!
1. int 20h должно писаться раздельно, а у вас написано вместе.
2-3. Строки в ассемблере должны быть заключены в апострофы ('), а не в кавычки (").
4. Процедура или макрос или метка Message неопределены. Либо их вообще нет (такое может случиться в случае ошибочного написания), либо они находятся после строки, в которой происходит обращение. Скорее всего, первое.
А насчет дебаггера - либо TurboDebugger, либо SoftIce.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 110
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1821
Уважаемый Вал.Ик.!
Просто нет слов! Читал и пости прослезился! Сейчас полезу в архив, дабы восстановить в памяти (а кое-где и впервые прочитать) основные вехи рассылки.
Я давно уже поймал себя на мысли, что лично для меня эта рассылка стала просто необходимой. Придя утром на работу и не найдя в ящике свежего выпуска FAQ или нескольких вопросов читателей мне становится грустно. Причем и от того, что я не смогу помочь нуждающимся людям, и от того, что сам не узнаю что-нибудь нового и интересного.
Надеюсь, что подобные чувства одолевают не только меня, но и многих экспертов и простых читателей.
Поэтому выражаю глубокую признательность Олегу за его труд и надеюсь, что никакие новые системы не помешают взаимополезному общению экспертов и читателей.
За сим не прощаюсь и надеюсь еще встретиться на широких просторах рассылки!
P.S. Большое спасибо за теплые слова в мой адрес, постараюсь и впредь их оправдывать.
Ответ
Здравствуйте, Ayl!
Я тоже читал и смеялся. Чего то Вал.Ик меня невзлюбил, незнаю чего. Выходит, что я что-то умею делать, как Painbringer, и вечно с кем то ссорюсь, а потом еще и поплевал зачем-то на руины рассылки... вот этого я не помню, не правда все.
А вообще ты Вал.Ик молодец просто!!! У меня б на такое письмо нехилое ушло б не один ящик пива. Попрошу и остальных читателей присоединяться, очень интересно узнать про себя много нового и интересного.
p.s. Вал., а ты не из газеты случаем??? Уж больно у тебя слог хорошо этак ложится... :) папараца блин...:))).
МОЛОДЕЦ
Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 244
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1822
Здравствуйте.
По поводу вопроса №1804.
Получил несколько ответов, но, к сожалениею, они не помогли. Повторю вопрос.Надо написать программу, резидент. Суть в следующем: в любом текстовом редакторе, при нажатии на клавишу печатается соответствующий символ, надо сделать чтобы и при отжатии клавиши печатался этот же символ (специальные клавиши обрабатывать не обязательно). Делаю так:
1. Перехватываю int09h.
2. В своем обработчике определяю сканкод нажатой клавиши (читаю из буфера в памяти, или через порт 60h).
3. Старший бит(7) сбрасываю.(0-нажатие, 1-отжатие)
4. Записываю сканкод обратно в буфер по адресу 0:401е (или 0040:001е - это ведь одно и тоже?)
5.Завершаю работу обработчика одним из 2-х способов:
5.1. Передаю управление старому обработчику.
5.2. Завершаю работу, как написано в TechHelp.
Ни один вариант не работает, ни под окнами, ни под досом(Win-FAR,VC-DOS).
В связи с этим - вопросы:
1. Правильно ли я обращаюсь к буферу?
2. Если не правильно, то как правильно?(желательно очень подробно, как, что, сколько и откуда читать и записывать)
3. Если правильно, то почему не работает?(тоже, как можно подробнее)
Если это реально, пожалуйста, переделайте прогу, чтобы работала или объясните очень подробно про работу с буфером(если ошбка в работе с ним).
Зарание благодарен.
Антон.
Код прилагаю.
Ответ
Здравствуйте, Anton!
Ну, я тут обнаружил несколько недочетов-ошибок.
Во-первых, обращение к буферу. Разумеется, вы его неправильно выполняете. Буфер клавиатуры занимает пространство от 0040:001e до 0040:003dh. Всего 32 байта или 16 слов, так как в буфере для каждого нажатия сохраняются 2 байта - скан-код + ASCII-код. Для правильной адресации буфера используются 2 указателя:
head - 0040:001ah - смещение ячейки памяти в сегменте 0040, из которой будет извлечен очередной символ.
tail - 0040:001ch - смещение ячейки памяти в сегменте 0040, в которой будет сохранен очередной символ.
При этом возможны 2 варианта:
tail = head - буфер пуст, извлечь нам ничего не удастся, записать можем
tail = head - 2 или tail = head + 30 - буфер полон, писать нельзя, читать можем.
Т.о., мы можем сохранить не более 15 нажатий клавиш.
Указатели изменяются:
1. Обработчиком BIOS прерывания 9 - символ записывается в буфер, изменяется положение указателя tail
2. Обработчиком BIOS прерывания 16h - символ считывается из буфера, изменяется положение указателя head
3. Другими обработчиками (DOS, резидентные программы и т.п.)
Поэтому ваше обращение в буфер по адресу 0040:001eh чаще всего не приведет к каким-либо изменениям в буфере.
Во-вторых, вызов старого обработчика 9-го прерывания у вас происходит ПОСЛЕ обработки буфера клавиатуры, а вообще-то его неплохо бы вызывать ДО этого. Т.е. вы пытаетесь изменить символ до того, как он туда будет записан!
В-третьих, это бы работало в том случае, если бы обработчик 9-го прерывания (надоело мне писать эти слова, в дальнейшем буду просто писать Int09) записывал в буфер символ с признаком отжатия! Но ведь это не так! Не пишет он туда ничего. При отжатии Int09 либо меняет статус клавиш Ctrl, Alt, Shift (в т.ч. и Right-Ctrl, Rigth-Alt,
Right-Shift), либо игнорирует отжатие.
Как с этим бороться.
Я бы делал это так. Вначале своего обработчика прочитал бы значение из порта 61h - код нажатой клавиши. Если это нажатие (бит 7 = 0), то сохранил бы значание указателя tail, вызвал старый обработчик (call dword prt). По возвращении из Int09 (это старый обработчик) проверил бы, что указатель хвоста буфера изменился. Это гарантировало бы обработку нажатий сиволов, которые не генерят ASCII-кодов и расширенных ASCII-кодов. После этого сохранил бы значение в хвосте буфера во внутренней переменной. Плюс неплохо сохранить и само значение, прочитанное из порта 61h.
Если же бит 7 в байте, прочитанном из порта 61h равен 1, т.е. было отжатие клавиши, то сбрасываем старший разряд в 0 (and 7fh) и сравниваем результат с сохраненным значением порта 61h при нажатии. Если они равны, то дописываем в буфер клавиатуры сохраненный ASCII-код и не забываем скорректировать указатель tail.
После этого вызываем Int09 для окончательного выхода (jmp dword ptr).
Можно еще попробовать обрабатывать одновременное нажатие нескольких клавиш с их последующим отпусканием. Но это уже потом, когда программа заработает.
Если мне сейчас будет не лень, то я поробую написать код согласно этому алгоритму.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 111
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Форма подачи вопроса
ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!
Регистрация в качестве эксперта
Архив выпусков
Управляющий рассылкой,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||