Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 122 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-10-24
Вопрос №1277
Ребзя ! Вообщем написал я прогу (резидентный таймер) (прилагается) почему она занимает маста в памяти аж (!) 128 байт (144 байта ? если верить досовскому mem (вообще кому верить ? если каждая прога говорит разное ?)) я так понял резидентная прога должна использовать стэк (;) а как инт 27h узнает скока нам его надо ? и где он распологается ? а может лучше инт 31h (или как там...) и вообще как резидент оставить без PSP ? максимум что я смог сделать это скопировать её в 32h меньше уже нельзя :( там сэйвится старые обрабочики ctr-break etc. да ! и еще предлагаю возобновить наши конкурсы самых маленьких прог ! а то нам с Broken Sword'om ужу надоело одним :( ну как ? напишите меньше ? (только чур оптимизировать только резидентную часть :)
.model tiny
.186
.code
org 2ch
env_seg dw ?
org 100h
begin:
jmp short initialize
int_1ch_handler proc far
pusha
push es
push ds
db 68h,00h,0b8h
pop es
mov di,70*2
mov ax,7020h
stosw
mov al,04h
repeat:
out 70h,al
push ax
in al,71h
push ax
db 0c0h,0e8h,04h
or al,30h
stosw
pop ax
and al,0fh
or al,30h
stosw
mov al,3ah
stosw
pop ax
sub al,2
jns repeat
dec di
dec di
mov al,20h
stosb
pop ds
pop es
popa
db 0eah
old_int_1ch dd ?
int_1ch_handler endp
initialize:
mov ah,49h
mov es,word ptr env_seg
int 21h
mov ax,351ch
int 21h
mov word ptr old_int_1ch,bx
mov word ptr old_int_1ch+2,es
push cs
pop es
mov si,offset int_1ch_handler
mov di,new_start
mov cx,offset initialize-offset int_1ch_handler
rep movsb
mov ax,251ch
mov dx,new_start
int 21h
mov dx,offset initialize-100h+new_start
int 27h
;данные
new_start equ 32h
end begin
Ответ
Здравствуйте, Барт Симпсон!
Нет, ну блин! Если оптимизировать только резидентную часть - то нифига не получится... Потому как PSP к этому времени у тебя уже сохранилось! Чтобы избавиться от PSP могу предложить два варианта:
1. Выделяешь память под резидентную часть, копируешь туда процедуры обработчиков прерываний, записываешь в таблицу новые значения обработчиков и радуешься жизни... Да, только еще с завершением программы надо будет поиграться - чтоб блок резидентной части не освободить...
2. Аккуратненько исправляешь значения MCB программы, освобождая 16 параграфов PSP... Прописываешь заголовок MCB перед своей прогой. Завершаешь программу int 27h, только cs должен указывать на новый MCB.
Кажется, так. Блин, опять приходится вспоминать, делал-то я это очень давно, а ничего справочного под рукой нету...
Но, по-моему, был еще способ, проще, понятнее, и без извращений с MCB. Надо будет не забыть дома посмотреть...
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 42
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1287
Почему при вызове прерывания int 16h в ah загружается 10h.
Я прочитал помощь из базы, которую скачал с сайта, там указано, что загружать надо 00h, 01h или 02h, хотя я не заметил никакой разницы между 10h и 00h ?
Ответ
Здравствуйте, Илья!
Вот что сообщает Tech Help:
INT 16H: Keyboard Services
This is the application-level interface to the keyboard. Keystrokes are processed asynchronously (in the background). As each keystroke is received from the keyboard, it is processed by INT 09H and placed into a circular queue at 40:001e in the BIOS Data Area.
AH BIOS Service Supported by
00H read keyboard input [PC] [XT] [AT]
01H query keyboard status/preview key [PC] [XT] [AT]
02H query keyboard shift flags [PC] [XT] [AT]
03H set typeamatic rate and delay [PC] [XT] [AT]
04H (reserved)
05H store key data [AT]
10H read extended keyboard input [AT]
11H query extended keyboard status [AT]
12H query extended keyboard shift flags [AT]
На самом деле отличие между функциями 00h и 10h заключаются в том, что функция 10h не производит преобразования расширенных кодов для 101-клавишной клавиатуры в 84-клавишную клаву XT. Для простого ожидания нажатия клавиши лучше использовать функцию 00h - она проще записыватеся :) :
xor ax, ax
int 16h
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 43
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1285
Здравствуйте уважаемые эксперты.
Подскажите
Поддерживает ли PROC синтаксис с явным заданием сегмента кода и можно ли из одного сегмента кода вызвать процедуру, описанную как NEAR в другом сегменте кода.
Ответ
Здравствуйте, ivekm!
А если немного головой подумать? Чем у нас завершается близкая процедура? А? Так... Раз, два, три... О, ответили! Правильно, retn! :) Молодцы! А что такое retn? И как оно действует? Знаете? Вот замечательно! Правильно, тащит из стека слово и пихает его в указатель команд (ip). И все! И никаких сегментов! Поэтому как ни извращайся при вызове близкой процедуры, но обратно мы не вернемся, если у нас cs был другой (Это для эксперта DiGiT).
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 44
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1281
Ответ для эксперта Painbringer'а!
Нет не одно и тоже. Например, ты находишься по смещению FFFC относительно начала сегмента, а переместиться надо на 0100 от начала сегмента. Так надо не считать разницу между 0100-fffc,т.к. это будет неправильно. А сместиться по смещению ffff-fffc+0100. Интересно,но факт такие вот смещения в ближнем переходе. А в коротком да знаковые!!!
Ответ
Здравствуйте, DiGiT!
И еще в дополнение. Дальний переход адресуется абсолютным адресом сегмент:смещение. А не относительно текущего указателя команд.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 45
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1281
Ответ для эксперта Painbringer'а!
Нет не одно и тоже. Например, ты находишься по смещению FFFC относительно начала сегмента, а переместиться надо на 0100 от начала сегмента. Так надо не считать разницу между 0100-fffc,т.к. это будет неправильно. А сместиться по смещению ffff-fffc+0100. Интересно,но факт такие вот смещения в ближнем переходе. А в коротком да знаковые!!!
Ответ
Здравствуйте, DiGiT!
А ВОТ НЕНАДО ЛЯЛЯ!!! Я не до конца вогнал где у тебя глюк, скорее всего надо просто прибавлять единицу, чтобы учесть славное число 0000, но вернемся в третий раз к моему листингу:
1 0000 .model tiny
2 0000 .code
3 org 100h
4 0100 C3 start: ret
5 org 0fff9h
6 FFF9 E9 0104 @@1: jmp start
7 FFFC 90 nop ;типа прыжок идет вот с этого смещения
8 end start
(я надеюсь ты догнал, что джамп ведется с 0fffch на 100h (3 байта сам jmp)). 100h-0fffch=104h (0ffffh-0fffch+100h)=103h, а не 104h)!
Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 200
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1290
Как работать с PS/2 портом???
Ответ
Здравствуйте, Дмитрий!
смотри в сторону прерывания 15h фунция C2h
Отправил эксперт: borneo
Эксперт отправил ответов (всего): 3
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1287
Почему при вызове прерывания int 16h в ah загружается 10h.
Я прочитал помощь из базы, которую скачал с сайта, там указано, что загружать надо 00h, 01h или 02h, хотя я не заметил никакой разницы между 10h и 00h ?
Ответ
Здравствуйте, Илья!
Разница в том, что 10h функция возвращает РАСШИРЕННЫЙ ASCII код символа в al, а 00h - "отбрасывает" расширенный код.
Я даже вычитал такую фишку, что:
some (older) clone BIOSes do not discard extended keystrokes and manage function AH=00h and AH=10h the same.
Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 196
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1292
Послал в группу в которой больше народу....
Мужики! Понимаю сам - хамство черезвычайное. Можете не отвечать или обложить.. НО...ОЧЕНЬ надо!!!
Софт: Винда98, Дельфи 5, Офис,и соответственно Акссес2000, BDE Administrator 5.01.
Проблема: не могу связать базу в Акссесе с Делфями, при создании алиаса через BDE прописываются все пути, но при попытке доступиться к базе говорит "Общая ошибка SQL...". В четвертом Делфи и Акссес97 все получалось.
Нужно СРОЧНО!! Асм-асмом, а денежку-то зарабатываешь на Делфях...
ЗЫ. Можно не отвечать, что-бы подобное свинство не попало в рассылку - скиньте совет на p_avtom@amk.lg.ua .
С уважением Вал.Ик.
Ответ
Здравствуйте, Вал.Ик.!
Я точно не помню, но помоему делфя не тянет 2000 офис, т.к. она появилась раньше. Попробуй сконвертировать свою базу в Ацесе во что нибудь (или Access 97, ил что там еще есть DBase, Paradox и т.п.).
Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 201
Экспертная группа: Пользовательская работа с Windows
Вопрос №1293
Привет всем!!!
Не помню задавал вчера вопрос этот или нет.
Такая проблема нужно сбросить пароль на биос. В какой порт что писать. Пробовал следующее:
mov al,0eh; а также 0dh,2eh,2fh
out 70h,al
mov al,0; например, разное писал.
out 71h,al
и нифига. Может кто-нибудь инфу пришлет.
Ответ
Здравствуйте, DiGiT!
В любом случае, есть некий защищенный контрольной суммой диапазон адресов, изменение которого повлечет за собой ошибку контрольной суммы и как следствие - сброс данных в исходное состояние.
mov cx,003Fh ; кол-во "исправляемых" регистров
next:
mov al,cl ; номер регистра
out 70h,al ; в адресный порт
jmp short $+2 ; ждем восстановления порта
mov al,ch ; нулевое значение
out 71h,al ; отправляем в порт данных
jmp short $+2 ; ...
loop next ; следующий
Отправил эксперт: UFO
Эксперт отправил ответов (всего): 30
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1293
Привет всем!!!
Не помню задавал вчера вопрос этот или нет.
Такая проблема нужно сбросить пароль на биос. В какой порт что писать. Пробовал следующее:
mov al,0eh; а также 0dh,2eh,2fh
out 70h,al
mov al,0; например, разное писал.
out 71h,al
и нифига. Может кто-нибудь инфу пришлет.
Ответ
Здравствуйте, DiGiT!
вот кусок кода на паскале - разбирайся
port[$70]:=$10;
port[$71]:=$51;
Отправил эксперт: Gn
Эксперт отправил ответов (всего): 15
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1295
Привет всем!!!
Не помню задавал вчера вопрос этот или нет.
Такая проблема нужно сбросить пароль на биос. В какой порт что писать. Пробовал
следующее:
mov al,0eh; а также 0dh,2eh,2fh
out 70h,al
mov al,0; например, разное писал.
out 71h,al
и нифига. Может кто-нибудь инфу пришлет.
Ответ эксперта GN:
Здравствуйте, DiGiT!
вот кусок кода на паскале - разбирайся
port[$70]:=$10;
port[$71]:=$51;
Конечно спасибо. Чексумма сбрасывается, а пароль остается ... Может кто еще что знает.А то биос всю выворачивать как-то жалко вдруг еще что накроется.
Ответ
Здравствуйте, DiGiT!
Нашкряб тут для тебя кой-какую инфу:
Для AWSARD-овского BIOS-а (!!!!!!!!!!!!!!!):
Регистр CMOS 11h:
биты:
1 BIOS Password Enabled (supervisor)
0 0 = Password controls BIOS Setup Only
1 = Password required to enter System
Регистр CMOS 1Ch,1Dh:
BIOS Password stored as a checksum using the following algorithm: initialize 16-bit checksum to zero for each ASCII character between 32 (space) and 127 (DEL) in the password, add character to checksum, then rotate left two bits store low byte of result in 1Ch and high byte in 1Dh (for user password, use locations 4Dh and 4Eh instead)
Регистр CMOS 4Dh:
AWARD - USER PASSWORD
Регстр CMOS 4Eh:
AWARD - USER PASSWORD
Регистр CMOS 5Eh:
биты:
0 user password enabled
Регистр CMOS 5Fh:
AWARD v4.50G - USER PASSWORD CHECKSUM
Регистр CMOS 62h:
AWARD v4.51pg - BIT FLAGS
Биты
0 user password is enabled
Вообщем,или вообще отруби все пассы, или изменяй с учетом всех сдвигов и ухищрений прямо в 4Dh и 4Eh порты
ПИСАТЬ В ЭТИ ПОРТЫ И ЧИТАТЬ ИНФУ ТЫ ЗНАЕШЬ КАК (70h и 71h), но...
ПРИ ЧЕМ ЗДЕСЬ РЕГИСТРЫ 0Eh и 0Dh (регистр статуса диагностики при последнем старте и регистр статуса RTC) и уж тем более регистры 2Fh и 2Eh (контрольная сумма CMOS) ??????????!!!!!!!! и вообще, поаккуратнее там с CMOS-ом...
Есть такая же полова для AMI и Phoenix BIOS-ов. Если нада - пиши.
Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 197
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1297
Есть модем без драйверов, н есть компьютер где был устанвлен
такой же модем.
Осуществлимо ли "перенести " драйвера на другой копьютер?
Спасибо
Ответ
Здравствуйте, oleg!
Проще найди драйвера в инете.
Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 47
Экспертная группа: Пользовательская работа с Windows
Вопрос №1296
Здравствуйте Эксперты!
Каким образом можно ставить разные дополнительные гр. режимы не через 10-е прерывание.Например, там для текстового только 2 режима - 40х25 и 80х25(без учета цветов). А я точно занаю что число строчек по вертикали может быть больше 25.
Ответ
Здравствуйте, Александр!
Если тебя интересует программирование через порты и тебе не нравится 10-е прырывание, то ты просто монстр. Ищи документацию. А в тичхелпе есть вот что...
The CGA decodes ports 3d0H through 3dfH (actually using 3d2H-3dcH)
Note: these ports overlap the EGA I/O Ports for upward compatibility.
With some exceptions, the CGA information applies to the EGA.
An early Tech Ref indicated that the CGA could force hardware interrupt level 2
upon vertical retrace. However, the CGA has never had this ability.
Note: BIOS stores "mirrors" of the current CRTC port values in the BIOS Data
area. To change a single bit, you should read the appropriate variable,
set the bit, perform the OUT, and store the new value in the variable.
Port Description
____ __________________________________________________________________________
3d4H Write: CRT Controller register select. Use this port to select any of the
18 CRTC registers. Do an OUT 3d4H,reg_no followed by a read from
or write to port 3d5H.
3d5H CRT Controller registers. After selecting via port 3d4H, output or input
here to access the CRTC internal registers.
Write: See Video Parameter Table for a summary of the CRTC registers and
a way to look up standard BIOS settings for the display modes.
Read: Registers R12 through R17 can be read to determine the current
video page address, cursor address, and light pen information.
3d8H Write: Mode Select Register (Note: BIOS keeps current value at 0:0465)
+7-6-5-4-3-2-1-0+
¦ ¦b¦r¦v¦c¦g¦w¦
+---------------+ bit
¦ ¦ ¦ ¦ ¦ +- 0: width (text modes): 0=40 clms; 1=80 clms
¦ ¦ ¦ ¦ +--- 1: 1=enable graphics modes; 0=text modes
¦ ¦ ¦ +----- 2: 1=disable color burst on composite monitor
¦ ¦ +------- 3: 1=enable video signal; 0=disable beam (all black)
¦ +--------- 4: dot resolution: 0=320 2-bit dots; 1=640 1-bit dots
Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 48
Экспертная группа: Работа с MASM/TASM
Вопрос №1298
Есть модем без драйверов, н есть компьютер где был устанвлен
такой же модем.
Осуществлимо ли "перенести " драйвера на другой копьютер?
Спасибо
Ответ
Здравствуйте, oleg!
Вооще можно, тока вот инф те сконфигть надо будет грамотно...
Отправил эксперт: змей
Эксперт отправил ответов (всего): 77
Экспертная группа: Пользовательская работа с Windows
Вопрос №1303
Приветствую вас, господа эксперты.
У меня тут накопилось несколько вопросиков.
Если не сильно влом, помогите.
1. Почему в сеансе DOS (под NT) строчки
0100 cli
jmp 100
вешают только DOS, в то время как под Вынь95 эти же строчки вешают всю систему.
2. Может кто-нить объяснит, почему
mov ax,1010h
out 70h,ax
нарушает контрольную сумму CMOS.
3. Ну и последний: может есть у кого описание алгоритмов архивации (любых) - пропейте, плз.
Благодарствую.
Ответ
Здравствуйте, Эйч"R!
1. Ну, блин, потому что надо корректно операционку писать. Нечего пользовательскому процессу полностью все прерывания отдавать! Маст дай, что ж с него взять.
2. Потому как происходит запись числа 16 в 16-ю ячейку CMOS. А эта ячейка контроллируется контрольной суммой. А когда контрольная сумма не совпадает с рассчитанной, то CMOS сбрасывается. В принципе, можно записывать в любую ячейку с адресами в диапазоне между 10h и 20h - результат должен быть аналогичным.
3. Есть, но только в распечатках :( Так что сорри.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 46
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1304
ДОбрый вечер!
Скажите, пожалуйста, что такое Мастдай (MastDiy????)?
Большое спасибо.
Наташа.
Ответ
Здравствуйте, Наталья Березовец!
MustDie- это в преводе с английского - "Must'- должен
"Die" - умереть. Т.е. "должен умереть"
P.S.
Так назыавют ОС Windows 95\98 но не NT или 2000
Отправил эксперт: klimenko (http://club.lsk.kz/myfoto/12.JPG - Фото)
Эксперт отправил ответов (всего): 5
Экспертная группа: Пользовательская работа с Windows
Вопрос №1304
ДОбрый вечер!
Скажите, пожалуйста, что такое Мастдай (MastDiy????)?
Большое спасибо.
Наташа.
Ответ
Здравствуйте, Наталья Березовец!
MustDie - этот тот самый Windows, под которым все работают, но который никто не любит...
Отправил эксперт: Spartak
Эксперт отправил ответов (всего): 21
Экспертная группа: Пользовательская работа с Windows
Вопрос №1304
ДОбрый вечер!
Скажите, пожалуйста, что такое Мастдай (MastDiy????)?
Большое спасибо.
Наташа.
Ответ
Здравствуйте, Наталья Березовец!
Мастадай ака "Маздай" есьм Винды...
Отправил эксперт: Anvar
Эксперт отправил ответов (всего): 17
Экспертная группа: Пользовательская работа с Windows
Вопрос №1299
Здравствуйте уважаемые эксперты!
Недавно один человек спрашивал о редакторе для Asm и ему посоветовали Tasmed. Я ради интереса его тоже скачал(версия 1.98с), вот только одна проблема, загружаясь в Command Promt Only(Win98se). Он при попытке запустить из под него tasm,tlink,td или afdpro каждый раз вешает систему. Выходя из программы, он тоже каждый раз вешает систему.:(
Если данный редактор запустить из Win в режиме эмуляции MS-DOS, то все запускается, но при выходе постоянно возникают ошибки, либо окошко зависнет, либо получу сообщение об ошибке, типа:
-
"В процессе работы программы возникла нестандартная ситуация"
Если использую 16-bit DPMI: "Место ошибки 19F8:178C"
Если использую 32-bit DPMI: "Место ошибки 07B5:0A31"
В обои случаях пишет: "Прерывания нет".
-
Все советы автора программы по устранению ошибок пробовал, использование 16/32 DPMI, тоже совет по решению проблем с зависанием программы, тоже не помогает.:(
Может хоть вы можете помочь!!!
Заранее спасибо!
Ответ
Здравствуйте, Ilya!
У меня 1.98d и ничего не глючит (win 98 se rus). и под досами тоже вроде бы.
Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 204
Экспертная группа: Пользовательская работа c DOS
Вопрос №1298
Есть модем без драйверов, н есть компьютер где был устанвлен
такой же модем.
Осуществлимо ли "перенести " драйвера на другой копьютер?
Спасибо
Ответ
Здравствуйте, oleg!
Да, можно. Если очень надо пиши, опишу весь процесс в подробностях. bitoff@pisem.net
Отправил эксперт: Andy Bitoff (http://bitoff.pisem.net - HomePage)
Эксперт отправил ответов (всего): 23
Экспертная группа: Пользовательская работа с Windows
Подписаться на рассылки
Форма подачи вопроса
ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!
Регистрация в качестве эксперта
Архив выпусков
Ведущий рассылки,
Калашников Олег:
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 |
В избранное | ||