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

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


Служба Рассылок Subscribe.Ru

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

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

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

Форма подачи вопроса

ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


Ваше имя *:

Ваш e-mail *:

Подгруппы:

Вопрос *:

Прилагаемая программа (если необходимо):


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

Архив выпусков


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

Калашников Олег: 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

В избранное