Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 025 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-06-19
От ведущего
Извините, в программе генерации рассылки присутствует несколько ошибок, и пока не существует процедуры распознавания кодировки. Постараюсь исправить все в самое ближайшее время.
Спасибо за внимание!
Вопрос №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 мы по сути дела указываем место размещения стэка в памяти и его размер.В принципе его можно расположить где угодно в пямяти,но при этом возникает опасность того что в области,которую мы отводим под стэк,содержится код какой либо программы или любая другая информация =>после записи в стэк чего-либо
затрётся то что было в памяти до этого.
По этому принципу и работает программа в выпуске №6.
Отправил: Oleg G.
Эксперт отправил ответов (всего): 2
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №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 мы по сути дела указываем место размещения стэка в памяти и его размер.В принципе его можно расположить где угодно в пямяти,но при этом возникает опасность того что в области,которую мы отводим под стэк,содержится код какой либо программы или любая другая информация =>после записи в стэк чего-либо
затрётся то что было в памяти до этого.
По этому принципу и работает программа в выпуске №6.
Отправил: Oleg G.
Эксперт отправил ответов (всего): 3
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №163
Privet vsem expertam !
Prishlite mne pojaluista Tasm i Tlink dlia sozdania failov
pod WINDOWS.
Zaranee spasibo.
Evgenii (eugeniumus@chat.ru)
Ответ
Вот. Пропатченный!
Отправил: K.A. NiCK
Эксперт отправил ответов (всего): 8
Экспертная группа: Пользовательская работа с Windows
Вопрос №164
Программа из... непомню какого выпуска, которая заполняла экран символами через видеопамять... Короче, если запустить ее из батника или фара то она не работает...
Верней по ESC выходит но символов на экране нет.
Если же ее запустить из под Turbo Debuggera (есть там такая кнопочка F10), то все работает.
Вот прога:
CSEG Segment
Assume CS:CSEG, ES:CSEG, DS:CSEG, SS:CSEG
Org 100h
Begin:
Call Wait_key
cmp al,27
je Quit_Prog
cmp al,0
je Begin
Call Out_char
Jmp Begin
Quit_Prog:
Mov al,32
Call Out_char
int 20h
;=======[UnderPrograms]======
;-------[Wait_key]-----------
Wait_Key proc
Mov ah,10h
int 16h
ret
Wait_Key endp
;-------[Out_char]-----------
Out_Char proc
Push cx
Push ax
Push es
Push ax
Mov ax,0B800h
Mov es,ax
Xor di,di
Mov cx,2000
pop ax
mov ah,31
Next_sym:
mov es:[di],ax
add di,2
Loop Next_sym
Pop es
pop ax
Pop cx
Ret
Out_char endp
CSEG Ends
End Begin
Для работы из под внешнего редактора мне нужно запускать проги из батника. Как это сделать, что бы все работало?
Да, и пожалуйсто объясните мне, почему это она не пашет?
Ответ
на сколько я понимаю, она как раз наоборот очень даже пашет.
cmp al,27
je Quit_Prog
27 - код ESC, т.е. если мы нажали ESC, то она заполняет экран пробелом на синем фоне:
Quit_Prog:
Mov al,32
Call Out_char
и выходит. а вы пробовали нажимать другие клавиши кроме ESC? а, стоило попробовать. как ни странно, но у меня именно из под FARа и все работает. и еще, не знаю какой у вас td, но при нажатии F10, у меня ниче не работает, он только переходит в меню. а для запуска программы я использую F9!
Отправил: BELTSY
Эксперт отправил ответов (всего): 26
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №163
Privet vsem expertam !
Prishlite mne pojaluista Tasm i Tlink dlia sozdania failov
pod WINDOWS.
Zaranee spasibo.
Evgenii (eugeniumus@chat.ru)
Ответ
Если надо пиши evgo1@email.kht.ru
Кстати, тебе только tasm32 и tlink32 А rtm32 - не надо?
Пиши!
Отправил: Evgos (http://ospelnikov.narod.ru - Личная страничка)
Эксперт отправил ответов (всего): 15
Экспертная группа: Пользовательская работа с Windows
Вопрос №166
Здравствуйте, эксперты.
Я только начинаю изучать ассемблер, поэтому мне бы хотелось узнать ваше мнение по поводу книг Юрова. Их существует несколько и затрагивают они несколько разные области в програмировании. Посоветуйте с какой книги лучше начать и хороши ли вообще эти книги для начинающих?
Ответ
Для начинающих Юров пишет сложно. Снчала тебе как начинающему лучше почитать книга Абеля. Ну а уж потом к Юровы "Assembler" Учебник
Отправил: sasha
Эксперт отправил ответов (всего): 22
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
Вопрос №170
Здравствуйте
Мне нужно написать свое прерывание для клавиатуры ISR09
нужно чтобы если flag=1 она не принимала данных с клавиатуры, и выдавала бы OK на экране,а если 0 то просто принимала данные, как обычно.Я написала это, но там наверное что то не в порядке, потому что
компьютер просто застывает, когда я ее запускаю.проверьте
пожалуйста, что тут не правильно
Заранее спасибо
Ответ
old_isr9 dw ?
^^^ Не буду Вас учить (хотя, следовало бы!), что в реальном режиме
адрес задаётся сегментом и смещением. А у вас только смещение (или
сегмент ??) - хотя команда jump у Вас стоит DWORD (Что-то упустили?).
А надо запоминать и сегмент, и смещение, то бишь:
old_isr9_ofs dw ?
old_isr9_seg dw ?
или
old_isr9 dd ?
Что Вам больше по душе.
Отправил: Nik
Эксперт отправил ответов (всего): 18
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №165
Уважаемые эксперты,
Подскажите, пожадуйста, можно загружать MASM/TASM под
WIN_Me, если какие-то отличия при работе этих и других "необходимых"(рекомендуемых для программирования на ASM) программ с данным WIN7
Спасибо, Евгений
Ответ
конечно можно, только не загружать, а запускать. загружать - это значит, что программа будет постоянно в оперативной памяти, пока ее не выгрузят. а masm/tasm, они отработали и вышли сразу. WinMe так же как и Win9x поддерживает работу всего, что написано до них, как для win, так и для DOSа (т.е. V86 режим в pmode это называется).
Отправил: BELTSY
Эксперт отправил ответов (всего): 27
Экспертная группа: Работа с MASM/TASM
Вопрос №171
Пожалуйста помогите написать прогу на Ассеблере которая бы вывела квадратный корень или хотя бы его математику может сам догадаюсь написать. Как в Бейсике функции [sqrt] как я понял в Асме нету, поэтому пожалуйста если не трудно. Я пока еще, как вы догадались Чайник.
Ответ
в асме нету вообще никаких функций, это вам не языки высокого уровня, чтоб там все функции, да процедуры, в асме есть только команды, которые выполняет процессор. короче, sqrt нету, но зато есть сопроцессор, а у него есть команда fsqrt, думаю, догадываетесь, что она делает. короче, см. программу. чтоб посмотреть как оно работает, в td сделай View -> Numeric processor. то, что у тебя получится в переменной sqrt, не удивляйся, это число с плавающей запятой. можете вместо fstp sqrt, сделать fistp word prt [sqrt] (или dword, или qword, что вам надо), тогда там будет целое число.
Приложение:
Отправил: BELTSY
Эксперт отправил ответов (всего): 28
Экспертная группа: Пользовательская работа c DOS
Вопрос №171
Пожалуйста помогите написать прогу на Ассеблере которая бы вывела квадратный корень или хотя бы его математику может сам догадаюсь написать. Как в Бейсике функции [sqrt] как я понял в Асме нету, поэтому пожалуйста если не трудно. Я пока еще, как вы догадались Чайник.
Ответ
А может лучше вам на С или С++ поработать ?
Подразберетесь в мат. методах, и тд., и тп.
Отправил: PavelAT
Эксперт отправил ответов (всего): 3
Экспертная группа: Пользовательская работа c DOS
Вопрос №171
Пожалуйста помогите написать прогу на Ассеблере которая бы вывела квадратный корень или хотя бы его математику может сам догадаюсь написать. Как в Бейсике функции [sqrt] как я понял в Асме нету, поэтому пожалуйста если не трудно. Я пока еще, как вы догадались Чайник.
Ответ
см. приложение - вычисление корня из целочисленного числа
Приложение:
Отправил: Sensey
Эксперт отправил ответов (всего): 1
Экспертная группа: Пользовательская работа c DOS
Вопрос №173
Как под дос настроить PCI-ное устройство, то есть выдать ему адреса ввода-вывода и прерывание.
У меня есть PCI-ный модем из ресурсов у него только один промежуток ввода-вывода(базовый адрес) и прерывание, необходимо настроить их на адреса сом-порта и его прерывание.Модем полностью хардварный(не Вин), и он работает из доса(голого) при помощи одного кривого драйвера, который кроме настройки Plug and play выполняет еще кучу ненужных функций(Fossil и т.д.)(драйвер не от этого модема), а я хочу написать свой, маленький который делал бы только ПНП. Я точно уверен, что для работы модема надо только ПНП, т.к. в Линуксе надо только прописать его адреса, в досе можно было бы сделать также, если бы узнать адрес и сделать его трехзначным, по умолчанию что-то вроде 0D007h.
Ответ
Собствено вопрос мне не совсем понятен. Я так и не понял, что ты хочешь написать. Насчет адроеса COM-порта все просто, а насчет прерывания - придется написать свой маленький обработчик, который будет вызывать прерывание стандартное для COM-порта(Com1, Com3 - IRQ4, Com2, Com4 - Irq3). Программные обработчики для Irq4 - INT 0Ch, Irq3 - INT 0Bh. Да, чуть не забыл, базовые адреса Com1-Com4 располагаются по адресу 0000:0400 и занимают по 2 байта каждый, естественно. А причем здесь ПНП, в ДОС ведь его нет.
P.S. Мог бы прислать эти самые числа, всем было бы легче.
Отправил: Александр
Эксперт отправил ответов (всего): 38
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №172
ъДТБЧУФЧХКФЕ, ЬЛУРЕТФЩ!
рПДУЛБЦЙФЕ, НПЦОП МЙ ЙУРПМШЪПЧБФШ INT 6 Й INT 7 ДМС ОБРЙУБОЙС УПВУФЧЕООЩИ РТЕТЩЧБОЙК. лБЛ ХЪОБФШ УЧПВПДОЩ ПОЙ ЙМЙ ОЕФ. рП ЧЕЛФПТХ INT 6 ЮФП-ФП ЪБЫЙФП, ОП ОЕРПОСФОП ЮФП.
Ответ
Int 6 - неверная команда процессора.
Int 7 - команда отсутствующего сопроцессора.
Можно повесить на прерывание 2Fh. Для каждого значения регистра AH в этом прерывании свой обработчик. Если хочешь узнать подробнее - ищи по словосочетанию "мультиплексное прерывание" В приложении цитата из Ralf's Brown Interrupt List. Все обработчики при вызове функции 0 должны возвращать в регистре AL - ненулевое значение, если они не хотят быть замещенными. Это должно быть единственным признаком для проверки занятости. Это дайджест того, что написано в приложении
Приложение:
Отправил: Александр
Эксперт отправил ответов (всего): 39
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №166
Здравствуйте, эксперты.
Я только начинаю изучать ассемблер, поэтому мне бы хотелось узнать ваше мнение по поводу книг Юрова. Их существует несколько и затрагивают они несколько разные области в програмировании. Посоветуйте с какой книги лучше начать и хороши ли вообще эти книги для начинающих?
Ответ
Лично у меня стоят книги: "Assembler учебник" и "Assembler специальный справочник". Все они В. Юрова и я ими доволен. Но для новичка - думаю, что тоже пойдут, если понимать написанное. Прочитай рассылку, там много умного. Потом бери книжку и вперед!!!!!!
Отправил: K.A. NiCK
Эксперт отправил ответов (всего): 9
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
Вопрос №178
ъДТБЧУФЧХКФЕ, ЬЛУРЕТФЩ!
рТПВМЕНБ Ч ПФМБДЛЕ РТПЗТБННЩ (ЙУИПДОЙЛПЧ ОЕФ, ФПМШЛП exe). рТПЗТБННБ РЕТЕИЧБФЩЧБЕФ РТЕТЩЧБОЙЕ INT 3h. рТЙ ПФМБДЛЕ Ч td.exe РЕТЕИЧБФБ INT 3 ЛПНРШАФЕТ ЪБЧЙУБЕФ. пФМБДЮЙЛ ЛПОЕЮОП ФПЦЕ ЙУРПМШЪХЕФ ЬФП РТЕТЩЧБОЙЕ. ъБНЕОЙФШ INT 3 ОБ ДТХЗПЕ ОЕ ХДБЈФУС, Ф.Л. ЪБОЙНБЕФ ПДЙО ВБКФ. лБЛ НПЦОП ЧЩКФЙ ЙЪ РПМПЦЕОЙС.
Ответ
А зачем надо обрабатывать в твоей программе int 3?
Правильное написание обработчика может помочь. Во время инициализации сохраняешь адрес обработчика, который перед тобой. Потом, когда твой обработчик вызывается делаешь следующее:
1. Обрабатываещь как хочешь.
2. Сохраняешь в стеке регистр флагов (pushf в 80386+).
3. Делаешь длинный вызов предыдущего обработчика.
4. После этого с чистой совестью ставишь команду возврата из прерывания iret.
По идее все должно работать даже под отладчиком, ведь вначале ты загружаешь дебуггер, а затем свою программу. И постарайся не отлаживать сам вызов прерывания...
Да, забыл. Там где ты используешь в своей программе прерывание 3 можно попытаться поставить неверный однобайтовый код операции и тогда процессор будет кидать прерывание 6. Постараюсь найти такой опкод...
Отправил: Александр
Эксперт отправил ответов (всего): 40
Экспертная группа: Общие вопросы по программированию на Ассемблере под 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 |
В избранное | ||