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

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


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

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

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

Рассылки 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

В избранное