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

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать (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

Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Задать вопрос экспертам

Регистрация в качестве эксперта


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться Рейтингуется SpyLog

В избранное