Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 024 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-06-16
Вопрос №151
Что такое функция прерывания ?
Ответ
предположим у нас есть кухонный комбайн, факс, стиральная машинка и т.п. каждый из них может выполнять разрые функции комбайн - потереть морковку, взбить коктель, порезать лук..., факс - принять факс, сделать копию, позвонить..., стиральная машинка - постирать, выжать, высушить... так вот прерывания - это факс, комбайн, машинка :)) и когда надо использовать какой-то объект (прерывание), мы должны указать (кухарке, секретарше, или компьютеру :)), что именно делать, т.е. какую функцию (из доступных) выполнить. обычно (в случае прерывания :)) для этого используется регистр AH/AX/EAX, но мы можем написать свою процедуру для какого-либо прерывания (т.е. перехватить какое-нибудь прерывание), которая возможно будет использовать другие регистры.
Отправил: BELTSY
Эксперт отправил ответов (всего): 22
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №148
Эксперты! Ответьте, пожалуйста, в чем тут дело?
.model tiny
.code
org 100h
.386
start:
mov ax,03h
int 10h ; текстовый режим
mov ax,0
int 33h ; инициализация мыши
mov ax,0Ch ; установить обработчик
mov cx,2h ; условие: левая кнопка мыши нажата
mov dx,offset obrab ; адрес обработчика
int 33h
mov ah,0
int 16h ; нажмите же кнопку!
mov ax,0Ch
mov cx,0
int 33h ; удалить обработчик
ret ; выход из ком проги
obrab:
mov ah,9h
mov dx,offset mes
int 21h
retf
mes db 'test'
end start
Как вы уже догадались, программа выводит строку "Тест" при нажатии левой кнопки мыши. Т.е. она должна ее выводить, но комп просто виснет намертво (один раз даже почему то сбросилась часть настрек CMOS...)
В умной книжке прочитал, что "... при вызове обработчиков прерываний лучше не использовать в них никаких прерываний дос, особенно 21h. Также не рекомендуется использовать прерывания BIOS...". Что делать? (пробовал ВСЕ прерывания и доса и биоса вывода на экран, в лучшем случае выводится какаято х..ня.
P.S. Если переделать ее в EXE, то она вообще почему то при нажатии на лев. кнопку выдает какоето тупое сообщение об ошибке (мне кажется, это тоже както связано с 21h).
Пожалуйста, помогите!
Ответ
Дело в том что:
1)Адрес нового обработчика прерываний должен находиться в ES:DI
2)Зачем ты используешь прерывание 16h(функция 00h)-эта функция считывает символ из буфера КЛАВИАТУРЫ.Если ты хочешь вызвать свой обработчик прерываний достаточно организовать в программе задержку,т.е
ожидание программой нажатия кнопки мыши.После нажатия кнопки начнётся
выполнение обработчика прерываний.
3)Ты не сохранил СТАРЫЙ обработчик прерывания мыши,который был в памяти компьютера до того как ты заменил его своим => после завершения твоей программы мыша остаётся без обработчика прерываний.
4)насчёт вызова других прерываний из обработчика-мне кажется,что ничего противопоказанного в этом нету.На всякий случай высылаю тебе листинг проги по замене обработчика прерываний от таймера(взят из приложения к книге Юрова "ASSEMBLER")
Приложение:
Отправил: Oleg G.
Эксперт отправил ответов (всего): 1
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №133
Уважвемые эксперты !
По книге Абеля написано что группа из 9 бит - это байт.
8 бит данные а один контроль четности. По другим источникам
везде пишут что 8 бит - один байт.
В чем тут заковырка ? Объясните чайнику.
Ответ
На самом деле длинна байта варьируется от 7 до 8 бит. В случае военной необходимости может быть даже до 10! :))) шутка :)
но есть и еще один бит. (раньше, давным давно не было) Этот бит контроля четности. для программиста совершенно прозрачен, обрабатывается на аппаратном уровне.
Отправил: Dron
Эксперт отправил ответов (всего): 26
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №157
Что такое точка останова и для чего она используется ?
Ответ
В отладчике, чтобы большую программу прогнать надо быть или маньяком, или точками останова пользоваться. Точка останова, это адрес при достижении которого отладчик прекращает выполнение программы и переходит в режим отладки.
Отправил: Александр
Эксперт отправил ответов (всего): 37
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №157
Что такое точка останова и для чего она используется ?
Ответ
Точка останова используется в отладчике, для того что бы выполнить программу до точки установа и посмотреть интересующие к примеру регистры и т.п. тем самым часто используется для выявления логических ошибок.
Отправил: sasha
Эксперт отправил ответов (всего): 19
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №156
При компилировании какого либо файла MASM 611 мне пишет что не может
открыть этот файл. ( cant open file ...)
Что делать ?
Вообще поясните пошагово как скомпилировать файл который лежит в:
D:\masm611\bin\
то есть в той же папке что и сам MASM ,
Ответ
Эта ошибка часто возникает в следствии компилировании несуществующего файла, т.е. скорее всего вы ошиблись в его названии
Отправил: sasha
Эксперт отправил ответов (всего): 20
Экспертная группа: Работа с MASM/TASM
Вопрос №155
И ещё я тут попутно с Ассемблером C++ хочу изучать
вы можете посоветовать какой из всех C++ самый лучший
и чем они различаются ? ( visual , builder m borland )
Ответ
Конечно си и ассемблер это хорошо, даже очень хорошо! Что касается того какой си лучше , это вопрос поставлен некорректно. Ну например если ты хочешь быстрой разработки приложения , ну или создания баз данных то лучше использовать билдер с++ , но у висуал с++ тоже есть свои прелести (например в нём легче писать для сети). А вот борланд с++ я вобще не уважаю. Так что решай сам!
Отправил: sasha
Эксперт отправил ответов (всего): 21
Экспертная группа: Пользовательская работа с Windows
Вопрос №155
И ещё я тут попутно с Ассемблером C++ хочу изучать
вы можете посоветовать какой из всех C++ самый лучший
и чем они различаются ? ( visual , builder m borland )
Ответ
C++ это язык такой, он стандартизирован, посему он не бывает разный. а вот то, что вы хотите узнать, так это компиляторы (или даже среды разработки). тут сказать какой самый лучший не возможно, у каждого свои недостатки/преимущества. во-первых, builder - это тоже borland, они его сделали. borlad c++ - это компилятор для доса, хотя начиная с версии 4.5 и для win. visual и builder - они для win. многие кричат, что visual лучше, потому что код он меньше делает. вообще, сначало лучше просто с++ выучить, т.е. взять может даже borland c++ 3.1 и разобраться с самим языком. потом, если под win писать хотите, разберитесь с WinAPI и вообще с программированием под win (тоже можно сначало взять компилятор попроще, например borland c++ 5.0). если будете это знать, то уже не сложно разобраться и с builderом и с visualом, а там уже, что больше понравится, то и будете использовать.
Отправил: BELTSY
Эксперт отправил ответов (всего): 23
Экспертная группа: Пользовательская работа с Windows
Вопрос №154
Здравствуйте уважаемые эксперты !
Может кто подскажет мне, где найти информацию о применении ассемблера для работы с базами данных (в частности с форматом DBF). Например, я хочу сделать конвертер из одной базы данных в другую.
Заранее благодарен.
Ответ
а какая разница в чем с ними работать, в асме, или в С, или в паскале... тут главное знать структуру файла (т.е. в вашем случае структуру DBF, и остальных бд в которые хотите конвертировать), и используете те же функции - чтения из файла, запись в файл, обработка каких-то структур и т.д. то есть поищите описание структуры нужных вам бд (думая в нете это найти не проблема) и пишите. если знаете как это сделать не на асме, то на асме также :)) тут важен алгоритм, а не язык, на чем хотите, на том и реализуйте его. навряд ли можно найти информацию именно по применению асма для бд, а вот описание структур и алгоритмов, думаю, не проблема разыскать. кстати, у меня даже есть дока с описанием формата dbf, если надо, могу кинуть.
Отправил: BELTSY
Эксперт отправил ответов (всего): 24
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №155
И ещё я тут попутно с Ассемблером C++ хочу изучать
вы можете посоветовать какой из всех C++ самый лучший
и чем они различаются ? ( visual , builder m borland )
Ответ
Если "хочу" изучать, то могу посоветовать Borland C++ 5.x. ТАм все просто и понятно. Хотя вот в Билдере окошки колотитьлегче, чем в Вижуале. Но выжуал - очень мощный и я всем советую именно его!!! Ну а для начала, думаю, и Билдер прокатит. Но смотри не увлекись - неотучишься !!!! РАЗМЕР И СКОРОСТЬ - ЭТО ГЛАВНОЕ !!!
Отправил: K.A. NiCK
Эксперт отправил ответов (всего): 6
Экспертная группа: Пользовательская работа с Windows
Вопрос №156
При компилировании какого либо файла
MASM 611 мне пишет что не может открыть этот
файл . ( cant open file ...)
Что делать ?
Вообще поясните пошагово как скомпилировать файл который
лежит в :
D:\masm611\bin\
то есть в той же папке что и сам MASM ,
Ответ
Попрошу у вас имя файла ! Возможно, что это из-за этого! А про ассемблирование и линковку читайте в первых выпусках.
Отправил: K.A. NiCK
Эксперт отправил ответов (всего): 7
Экспертная группа: Работа с MASM/TASM
Вопрос №158
Здравствуйте!
1) Я использую для запуска программы (нап. Notepad ) функцию ShellExecuteA, но она не возвращает дескриптора открывшегося окна.
Нет ли какой-нибудь ф-ии, делающей это или можно ли как получить HWND зная HINSTANCE приложения?
2) Как эмулировать ввод символа (нап в NotePad)?
Ответ
а че бы не использовать CreateProcess, и тогда в PROCESS_INFORMATION есть все что надо. shell-то он все равно использует эту функцию, в windе-то другой нету для этого дела (ну по крайней мере из известных простому смертному :)) по поводу второго вопроса, делай ему PostThreadMessage WM_CHAR. и вообще, читай win32.hlp, там есть все это.
Отправил: BELTSY
Эксперт отправил ответов (всего): 25
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
Вопрос №159
Господа эксперты!
Мы тут прогу с приятелем писали, кто типа меньше напишет. Прога выводит на экран счетчик двоичный. Вот значится есть такой вариант (27 байт com):
.486
ideal
model tiny
codeseg
org 100h
start: mov ah,0b8h
mov es,ax
mov al,'0'
mov cx,50h
rep stosw
@@1: mov [es:di],al
@@2:
dec di
dec di
btc [es:di],bx ; ???
jc @@1
mov di,158
jmp @@2
end start
Это типа он насобачил. (у меня 25 получилось). Я не совсем понял что там происходит. Кстати, если вам не в лом, может посоветуете как соптимизировать?
Ответ
1. Команда BTC инвертирует бит, который находится в битовой строке с
началом, определяемым первым операндом (у тебя - [es:di]), и номером,
указанном во втором операнде. А регистр CF равен значению считанного
бита до его изменения.
2. Во-первых, группу команд
@@1: mov [es:di], al
@@2: dec di
dec di
можно заменить на
@@1:stosb
dec di
@@2:dec di
dec di
Во-вторых, если у тя тасм, то jmp @@2 надо заменить на jmp short @@2.
Будет короче на один байт (насчет масма не знаю, но по идее, так же).
Отправил: Nik
Эксперт отправил ответов (всего): 16
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №156
При компилировании какого либо файла
MASM 611 мне пишет что не может открыть этот
файл . ( cant open file ...)
Что делать ?
Вообще поясните пошагово как скомпилировать файл который
лежит в :
D:\masm611\bin\
то есть в той же папке что и сам MASM ,
Ответ
Вариант работающий всегда:
d:\masm611\bin\ml.exe /at d:\masm611\bin\имя_файла.asm
Должно получиться.
Отправил: Алексей Чатов (http://www.bobrland.com - Плотина Бобров)
Эксперт отправил ответов (всего): 8
Экспертная группа: Работа с MASM/TASM
Вопрос №161
Я сейчас разбираю программу из 6-го выпуска:
CSEG segment
assume cs:CSEG, es:CSEG, ds:CSEG, ss:CSEG
org 100h
Begin:
mov sp,offset Lab_1
mov ax,9090h
push ax
int 20h
Lab_1:
mov ah,9
mov dx,offset Mess
int 21h
int 20h
Mess db 'А все-таки она выводится!$'
CSEG ends
end Begin
Я понял, почему отладчик работает неправильно: при изменении адреса стека в нем (стеке) оказывается код нашей программы, т.е. то, что мы видим на экране. Поэтому уже при выполнении строки mov AX,9090h мы изменяет "реальный" код программы, и отладчик работает неверно.
Я не могу понять, почему в обычных условиях все работает. Я понимаю, что оператор push AX затирает код выхода из программы, но не понимаю как. Разве программа выполняется в стеке? Почему при изменении стека меняется наша программа, ведь по идее для этого нужно менять код в памяти, а не в стеке, он же нужет для хранения промежуточных данных. Помогите разобраться!
Ответ
Стек находится в памяти!! По адресу SS:SP или SS:ESP
Например, команда PUSH AX делает следующее:
mov ss:[sp-2],ax
sub sp,2
А команда POP AX делает
mov ax,ss:[sp+2]
add sp,2
Это только на первых процах вроде i4004 или i8008 стек был
внутри процессора ... ;)
Отправил: Nik
Эксперт отправил ответов (всего): 17
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Подписаться на рассылки
Регистрация в качестве эксперта
Ведущий рассылки,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
______________
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
- Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
- Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
- Издание книги (спонсорство): Sponsor@Kalashnikoff.ru
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Рейтингуется SpyLog |
В избранное | ||