Вопрос № 67471: Здраствуйте, дорогие эксперты!!! У меня к Вам вопрос по ассемблеру. Моя программа должна запускать на выполнение другую программу, которая хранится на дискете. Сразу оговорюсь, что пишу прогу не под Дос и не не под Win, поэтому можно использовать то...Вопрос № 67556: Здравствуйте.
Я пишу резидент, который должен записывать в файл, то что вводится на клавиатуре. Я пишу например в буфер, как мне потом его в файл писать???
Тоесть, при использовании прерываний в резиденте, получаем несколько строк закарлюк(ка...Вопрос № 67580: Уважаемые эксперты! Подскажите, пожалуйста, зачем в проге нужна команда mov ah,9 (прога в приложении)? Зачем сначало заполнять 8-разрядный регистр, а затем 16-разрядный.
И объесните ,пожалуста, почему при ассемблеровании этой же проги (ехе-файл я...Вопрос № 67599: Привет ребята!
Знаю что Ассемблер ето классная и сразу тяжёлая штука, к нему потолкуна меня одна проблема мне надо прошить сканер, я на верном пути или нет !???, и я знаю что Ассемблер толоько для процов Intel - так или нет, больше вопросов чем о...
Вопрос № 67.471
Здраствуйте, дорогие эксперты!!! У меня к Вам вопрос по ассемблеру. Моя программа должна запускать на выполнение другую программу, которая хранится на дискете. Сразу оговорюсь, что пишу прогу не под Дос и не не под Win, поэтому можно использовать только биосовские прерывания.
Ну дак вот, при помощи прерывания 13h (функция 02h) я считываю нужное количество секторов в память по адресу es:bx (там наша запускаемая программа). А вот как передать управление из моей программы на ту, которую считали с дискеты в память? Естественно, что при завершении работы последней, мы должны возвращаться обратно в нашу программу. В этом тоже загвоздка...
Заранее благодарен за ответ! ;)
Приложение:
Отправлен: 18.12.2006, 03:05
Вопрос задал: Leito (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: ADSota
Здравствуйте, Leito!
Например запустить дальнюю процедуру находящуюся по адресу (cs:ip) 0x1234:0x5678:
PS - не думаю, что стандартный загрузочный сектор дискеты содержит возврат из функции, поэтому можно использовать команду:
...
jmp dword ptr[procaddr]
...
--------- Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Профессионал) Россия, Зеленоград Тел.: 8-916-53-43-916 ICQ: 84611301 ---- Ответ отправлен: 18.12.2006, 09:48
Вопрос № 67.556
Здравствуйте.
Я пишу резидент, который должен записывать в файл, то что вводится на клавиатуре. Я пишу например в буфер, как мне потом его в файл писать???
Тоесть, при использовании прерываний в резиденте, получаем несколько строк закарлюк(как мне уже отвечали, нежелательно использовать прерывания в резидентной части). Как мне тогда быть?
Код прилогается.
Спасибо.
Приложение:
Отправлен: 18.12.2006, 17:42
Вопрос задал: Lestat (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Евгений Иванов
Здравствуйте, Lestat!
Используй таймер, и проверку на доступность реентабельность ДОСа. Флаг такой есть.
удачи
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор) Россия, Нижний Новгород Тел.: +78313145721 Организация: M2Media.ru Адрес: Нижний Новгород, ул.Малая Ямская WWW:Eugene Ivanov ICQ: 214889076 ---- Ответ отправлен: 18.12.2006, 17:59
Вопрос № 67.580
Уважаемые эксперты! Подскажите, пожалуйста, зачем в проге нужна команда mov ah,9 (прога в приложении)? Зачем сначало заполнять 8-разрядный регистр, а затем 16-разрядный.
И объесните ,пожалуста, почему при ассемблеровании этой же проги (ехе-файл я всё-таки заставил комп сделать) , но он выдал такую строку:
LINK : warning L4021: no stack segment
( Про отсутствие сегмента я понял , но почему ведь в проге стоит - CSEG segment? Непонятно.)
Приложение:
Отправлен: 18.12.2006, 20:27
Вопрос задал: Loriendil (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Вiктор
Здравствуйте, Loriendil!
1) mov ah,9 - когда вызывается прерывание 21h, то обработчик прерывания смотрит что находится в регистре аh. Если мы положим туда значение 9, то обработчик вызовет 9-ю функцию 21h-го прерывания (вывод сообщения), что нам и надо.
2) обработчик использует значения обоих регистров (и аh, и dх). В каждом из них должны быть нужные данные. А порядок заполнения значения не имеет, главное чтобы перед вызовом прерывания регистры содержали нужные значения.
3) линковщик справедливо ругается - в программе нет сегмента стека. Вы ведь объявили единственный сегмент, как для СОМ-программы. Вообще, у вас код СОМ-программы, а не ехе-программы. (один сегмент, команда начать код с 100h байт - org 100h)
4)для того чтобы сделать работоспособную ехе-программу код должен быть другой - содержать по крайней мере сегменты стека и кода, например:
stk segment stack 'STACK'
db 100 dup (0fah) ; стек на 100 байт
stk ends
CSEG segment
assume cs:CSEG, ds:CSEG, ss:stk
Begin:
mov ah,9
mov dx,offset Message
int 21h
xor ax,ax
int 20h
Message db 'Hello world!$'
CSEG ends
end Begin
вместо объявления сегмента стека по упрощённому синтаксису можно написать что-то вроде
.model small
.stack 1024 ; стек на 1024 байт
.data
Message db 'Hello world!$'
.code
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
end Begin
(Р.S. в коде могут быть ошибки, давно не писал на асме.)
--------- ни дня без строчки (но не получается)
Ответ отправил: Вiктор (статус: 10-ый класс)
Ответ отправлен: 18.12.2006, 21:02 Оценка за ответ: 5 Комментарий оценки: Спасибо, очень понятное объеснение
Отвечает: Брона Вячеслав
Здравствуйте, Loriendil!
В регистре AHзадается код функции 21-го ДОС прерывания. В регистре DX задается смещение к выдаваемой на экран строке.
А сообщение выдается по поводу отсутствия в тексте вашей программы явного указания сегмента стека. это всего лишь предупреждение, и в данном случае все нормально.
На это предупреждение Вам придется обращать внимание при написании более сложных программ.
Дело в том, что, если Вы не указываете явным образом сегмент стека, ДОС, при загрузке Вашей программы на выполнение определит сегментом стека системмный, а его глубина весьма невелика - что приводит к неправильной работе программы при интенсивном использовании подпрограмм, особенно с большим колличеством параметров передаваемых через стек.
Ответ отправил: Брона Вячеслав (статус: 1-ый класс)
Ответ отправлен: 19.12.2006, 11:43 Оценка за ответ: 4
Вопрос № 67.599
Привет ребята!
Знаю что Ассемблер ето классная и сразу тяжёлая штука, к нему потолкуна меня одна проблема мне надо прошить сканер, я на верном пути или нет !???, и я знаю что Ассемблер толоько для процов Intel - так или нет, больше вопросов чем ответов- помогите пожалуйста!
Отвечает: IceWolf
Здравствуйте, Корниенко Сергей Серг.!
Если Вы говорите о создании собственной прошивки, то, в принципе, такие вещи пушут на ассемблере или на си. НО:
1. Информации по программированию микроконтроллеров, а это именно то, что Вам нужно, несравнимо меньше чем по x86.
2. Если даже Вы найдёте нужную литературу, документацию, то врядли в ближайшее время сможете написать прошивку-для этого надо разбираться в схемотехнике и знать как устроено конкретное устройство.
3. Вывод-лучше обратиться к специалисту.
Если же я не отбил интереса к теме то:
www.microchip.ru Производитель PIC-контроллеров
www.atmel.ru Производитель AVR-контроллеров
www.pic16f84a.narod.ru Сайт о программирвании микроконтроллеров
www.ikarab.narod.ru Сайт о программирвании микроконтроллеров
С уважением, IceW0|f.
--------- Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!
Ответ отправил: IceWolf (статус: 5-ый класс)
Ответ отправлен: 19.12.2006, 03:58