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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 363
от 09.09.2002, 20:30

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 1208
Отправлено ответов: 3705
Активность: 306.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе]


 Список экспертов, ответы которых опубликованы в данном выпуске

Lank
Статус: Начальный
Общий рейтинг: 115.9
[Подробней >>]
masquer
Статус: Профессиональный
Общий рейтинг: 157.77
[Подробней >>]
Broken Sword
Статус: Профессиональный
Общий рейтинг: 135.16
URL: моя рассылка по Protected Mode
[Подробней >>]
 
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 139.48
[Подробней >>]
Sinner
Статус: Доверительный
Общий рейтинг: 105.66
[Подробней >>]
Portnov
Статус: Профессиональный
Общий рейтинг: 121.86
URL: Мой сайтик...
[Подробней >>]
 
VicSimon
Статус: Начальный
Общий рейтинг: 102.7
[Подробней >>]
Beeblebrox
Статус: Профессиональный
Общий рейтинг: 115.82
URL: Beeblebrox / TMA HomePage
[Подробней >>]
kvINT
Статус: Профессиональный
Общий рейтинг: 111.56
Телефон: (34316)2-31-45
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 119.52
[Подробней >>]
ASMодей
Статус: Опытный
Общий рейтинг: 123.48
[Подробней >>]
Pablo
Статус: Профессиональный
Общий рейтинг: 131.63
URL: Моя страничка
[Подробней >>]
 
baldr
Статус: Профессиональный
Общий рейтинг: 117.47
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
ARDoS
Статус: Доверительный
Общий рейтинг: 105.99
[Подробней >>]
Топор
Статус: Профессиональный
Общий рейтинг: 117.77
URL: Хорошая Русская Металлическая команда
Телефон: (8462)500298
[Подробней >>]
 
nix
Статус: Опытный
Общий рейтинг: 110.95
[Подробней >>]
SonicX
Статус: Доверительный
Общий рейтинг: 114.78
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 1176. Где можно надыбать исходник для Z-modem протокола? Инет перерыл, нету :( Может где завалялся?... (ответов: 1)
Вопрос № 1177. Уважаемые эксперты обьясните пожалуйста, что такое системамы виртуальной памяти 1. с сегментной орг... (ответов: 2)
Вопрос № 1178. Добрый день. Подскажите, как создать массив большой длины в MASM? Мне надо определить массив из сотн... (ответов: 7)
Вопрос № 1179. Уважаемые эксперты, подскажите пожалуйста алгоритм записи номера занятого клястера в FAT12.... (ответов: 3)
Вопрос № 1180. Привет эксперты! Вопрос: что из себя представляют команды leave и ret # (где # - число)? Насколько я... (ответов: 7)
Вопрос № 1181. Skajite pojaluista, pochemu proga zavisaet(smotri prilojenija) posle v'jvoda na ekran soobshtenie 'T... (ответов: 6)
Вопрос № 1182. Приветствую Вас всех! Помогите как с помощю TASM создать VXD. Незнаю какие команды нужно ставить пос... (ответов: 2)
Вопрос № 1183. Hi all! Какой функцией и какого прерывания написать прогу низеоуровневого форматирования? Спасибо! ... (ответов: 3)
Вопрос № 1184. Можно ли вместо UPSовского аккумулятора подключить обычный автомобильный аккумулятор. Я думаю, что а... (ответов: 3)

Вопросов: 9, ответов: 34


 Вопрос № 1176

Где можно надыбать исходник для Z-modem протокола? Инет перерыл, нету :( Может где завалялся?



Вопрос отправлен: 04.09.2002, 21:47
Отправитель: Pano

[Следующий вопрос >>] [Список вопросов]

Отвечает Lank

Доброе время суток, Pano!
Исходники с документацией есть только на Си. Если надо напиши я тебе скину на мыло. Мой E-Mail: Lank@regi.rovno.ua
С уважением Lank.

Ответ отправлен: 05.09.2002, 13:39
Отправитель: Lank


 Вопрос № 1177

Уважаемые эксперты обьясните пожалуйста, что такое
системамы виртуальной памяти
1. с сегментной организацией
2. с страничной организацией
Если у вас есть документация по этим вопросам вышлите мне пожалуйста.
Спасибо.



Вопрос отправлен: 05.09.2002, 03:32
Отправитель: Pasha

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Здравствуйте, Pasha!
1. сегмент+смещение=асолютный адрес
2. размер страницы зависит от архитектуры процессора (для х86-4кб)
подробнее - см. интеловские мануалы

Ответ отправлен: 05.09.2002, 11:16
Отправитель: masquer


Отвечает Broken Sword

Добрый день, Pasha!
http://subscribe.ru/catalog/comp.soft.prog.intelpm
подпишись и скачай архив, скоро будет страничная организация

Ответ отправлен: 05.09.2002, 15:26
Отправитель: Broken Sword


 Вопрос № 1178

Добрый день.
Подскажите, как создать массив большой длины в MASM? Мне надо определить массив из сотни слов. Пишу так:
Massiv dw 029Bh,01B3h, .... ,10A3h
На это компилятор ругается (code128.asm(66) : error A2042: statement too complex).



Вопрос отправлен: 05.09.2002, 07:40
Отправитель: kemerovchanin (sudv@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Dark_Lord

Добрый день, kemerovchanin!
попробуй
massiv dw 00h,00h,02..
dw 02h,45h,...
Тоесть лучше несколько строчек!

Ответ отправлен: 07.09.2002, 12:42
Отправитель: Dark_Lord


Отвечает Sinner

Доброе время суток, kemerovchanin!
Не понимаю, в чем проблема.
В одну строку он тебе не даст написать столько,
а если написать так, то без проблем...

Massiv dw 029Bh,01B3h, .... ,10A3h
dw 029Bh,01B3h, .... ,10A3h
dw 029Bh,01B3h, .... ,10A3h
...

Ответ отправлен: 05.09.2002, 08:02
Отправитель: Sinner


Отвечает Portnov

Доброе время суток, kemerovchanin!
Кажется, Masm такие вещи не понимает... Попробуйте так:
Massiv:
dw 1,2,3,..
dw 0e,0d,...
dw...
Т.е. метка, а потом массив в несколько строк записывать. Вы ведь скорее всего нигде этот массив как единую переменную не используете (собственно, этого вроде Masm и не позволит, нету ведь инструкции для копирования массива целиком, придется rep movsb там или чего-то еще...), а используете только его части, напр., massiv[5]. Такое будет позволено.
С уважением, Portnov.


Ответ отправлен: 05.09.2002, 08:18
Отправитель: Portnov


Отвечает VicSimon

Добрый день, kemerovchanin!
Такая ошибка возникает в случае, когда в строке слишком много элементов. Попробуй разбить массив на несколько строк. Например так:
Massiv dw 0123h, 0345h, ..., 0724h
dw 0BE5h, ..., 0FEDh
...
dw 013Ah, ..., 0FFEh


Ответ отправлен: 05.09.2002, 08:45
Отправитель: VicSimon


Отвечает Beeblebrox

Здравствуйте, kemerovchanin!
Разбей длинную строку на несколько - меньшей длины
dw ...,...,...
dw ...,...,...
...
dw ...
Символов 80 в строке и меньше считается хорошим тоном.
Уверен, что при этом обнаружится еще пару ошибок :)

Ответ отправлен: 05.09.2002, 09:57
Отправитель: Beeblebrox


Отвечает masquer

Приветствую Вас, kemerovchanin!
Ну 162 значения в одну строку заходят, а вообще я так делаю
massiv dw 1,2,3
dw 4,5,6
dw 7,8,9


Ответ отправлен: 05.09.2002, 11:25
Отправитель: masquer


Отвечает kvINT

Приветствую Вас, kemerovchanin!
Напиши его в несколько строк.
Massive dw ...
dw ...
dw ...

Ответ отправлен: 08.09.2002, 13:04
Отправитель: kvINT


 Вопрос № 1179

Уважаемые эксперты,
подскажите пожалуйста алгоритм записи номера занятого клястера в FAT12.



Вопрос отправлен: 05.09.2002, 09:30
Отправитель: Kostyan

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Здравствуйте, Kostyan!
Пусть у тебя кластер C должен быть помечен, как занятый. При этом есть 2 варианта:
- этот кластер не последний в цепочке
- последний
Во втором случае все просто - надо записать в соответствующее место FAT значение fffh. В первом случае нужно также знать номер следующего кластера в цепочке (N).
Алгоритм определения места в FAT для FAT12 такой (см. Приложение).
Если же надо просто пометить кластер как занятый без его привязки к файлу, то можно попробовать использовать значения от ff0 до ff6 - зарезервированный кластер. Либо пометить его как BAD (значение ff7).
Вообще, в FAT могут быть представлены следующие значения:
- 0 - свободный кластер
- от ff0 до ff6 - зарезервированный кластер
- ff7 - BAD кластер
- от ff8 до fff - последний кластер в цепочке
- от 002 до fef - номер следующего кластера в цепочке


Приложение:

Ответ отправлен: 05.09.2002, 11:56
Отправитель: Ayl


Отвечает Broken Sword

Доброе время суток, Kostyan!
Для FAT12 фактически тебе нада сделать так:
1. Умножить номер элемента на 3
2. Разделить результат на 2
3. Извлечь из FAT 16-разрядное слово, используя в качестве адреса результат предыдущей операции
4. Если номер элемента четный, выполнить операцию AND над считанным словом и маской 0FFFh. Если номер нечентый, сдвинуть считанное слово вправо на 4 разряда. В результате получим изскомое значение элемента FAT.
Так как ты хочешь найти занятый кластер, то для FAT12 тебе нада искать кластер, не содержащий ни нулей, ни FF7 (дефектный), ни FF8-FFF (последний). Если он удовл. условию, то просто запомни номер - это и будет номер занятого кластера.

Ответ отправлен: 05.09.2002, 15:26
Отправитель: Broken Sword


Отвечает ASMодей

Здравствуйте, Kostyan!
Алгоритм такой:
1. Прочитай FAT в память.
2. Умножь номер кластера на 3 и раздели результат на 2.
Получишь смещение относительно начала FAT.
3. Прочитай оттуда слово.
4. Если номер кластера четный, то в этом слове нужно
использовать младшие 12 бит.
5. Если номер кластера нечетный то в этом слове нужно
использовать старшие 12 бит.
Как записать туда информацию не испортив при этом
оставшиеся 4 бита я надеюсь догадаешся сам ;)
PS. Учти, что изменять нужно все копии FAT, а не только
первую.


Ответ отправлен: 06.09.2002, 09:23
Отправитель: ASMодей


 Вопрос № 1180

Привет эксперты!
Вопрос:
что из себя представляют команды leave и ret # (где # - число)? Насколько я понял они вычещают стек по выходу из процедцры объявленой proc. Интересует технический аспект их работы (как, почему, когда и при каких условиях). Просто у меня есть след. код (при model = flat, stdcall):
myProc proc temp:DWORD
call proc2
ret
proc2:
ret
myProc endp
эта хрень транслируется в нечто вроде:
push ebp
mov ebp, esp
call proc2
leave
ret 4
proc2:
leave
ret 4
И в итоге в proc2 я не возвращаюсь на команду за call proc2, а вообще из процедуры proc вываливаюсь. Как бороться? Прыгать как козлу по проге с помощью jmp вроде неэстетично и тем более не практично... 8-)



Вопрос отправлен: 05.09.2002, 14:44
Отправитель: Priest

[Следующий вопрос >>] [Список вопросов]

Отвечает Pablo

Приветствую Вас, Priest!
ret 0ch - означает, что при возврате из подпрограммы после восстановления (e)ip, к значению указателя стека будет добавдено значение 0ch.
leave - означает, что из регистра (e)bp значение занесется в регистр (e)sp и, таким образом, восстановится старое значение стека.

Ответ отправлен: 05.09.2002, 19:33
Отправитель: Pablo


Отвечает masquer

Здравствуйте, Priest!
ret передает управление по адресу, находящемуся на вершине стека, если есть параметр, то это значение отнимается от вершины.
leave =
mov esp, ebp
pop ebp
Отсюда смотри, что у тебя происходит

Ответ отправлен: 05.09.2002, 16:39
Отправитель: masquer


Отвечает Portnov

Доброе время суток, Priest!
ret n: снмает со стека адрес возврата (смещение), запоминает его, снимает со стека n байт, а потом передает управление по запомненному адресу.
leave в 32-х битном режиме эквивалентно последовательности
mov esp,ebp
pop ebp;
В 16-битном режиме - то же самое про sp,bp.
С уважением, Portnov.

Ответ отправлен: 05.09.2002, 16:38
Отправитель: Portnov


Отвечает kvINT

Приветствую Вас, Priest!
call proc2
ret
Из чего ret?
Чтобы вернуться из proc2 ret должен быть внутри нее, в конце.
Далее такой же туман.

Ответ отправлен: 08.09.2002, 13:03
Отправитель: kvINT


Отвечает Lank

Привет Priest, попробую тебе кое-что обяснить тебя
интересует работа инструкций LEAVE и RET #? А в
техническую документацию смотреть лень? Тогда читай
выписки из неё:
LEAVE (High Level Procedure Exit) -- Виход из процедуры высокого уровня.
Машинный код : 0C9h
Действие: команда копирует EBP/BP в ESP/SP, тем самым восстанавливая содержимое ESP/SP значением, которое было до вызова процедуры. Далее в регистр EBP/BP из новой вершины стека извлекается значение, тем самым восстанавливаеся кадр вызывающей программы.
Ret/RetF (RETurn/RETurn Far from procedure) -- возврат ближний(дальний) из процедуры.
0C3h -- близкий возврат в процедуру.
0CBh -- дальний возврат в процедуру.
0C2h i16 -- близкий возврат в процедуру с выталкиванием i16 байт из стека.
0CA i16 -- дальний возврат в процедуру с выталкиванием i16 байт из стека.
Действие: передача управления по адрессу, расположеному на вершине стека. Этот адрес помещается в стек Call, его значение соответствует команде, следующей за командой Call. Необязательный операнд число опредиляет количество байт стека, которие будут вытолкнуты после выталкивания адреса возврата.
Она используется в языках высокого уровня для очистки стека от переменных, которые передавались вызываемой процедуре.
Надеюсь поможет :)А у тебя в коде должно быть просто RET а не RET 4, так, как ты параметры процедуре по всей видимости не передавал.
С уважением Lank.

Ответ отправлен: 05.09.2002, 15:42
Отправитель: Lank


Отвечает Beeblebrox

Здравствуйте, Priest!
Ты объединил в одно описание proc-endp две отдельные процедуры, а это не есть правильно. Опиши их отдельно.

Ответ отправлен: 05.09.2002, 16:08
Отправитель: Beeblebrox


Отвечает ASMодей

Здравствуйте, Priest!
Чтобы она так не транслировалась, нужно определить proc2
как вложенную процедуру:
proc2 proc
ret
proc2 endp
А как работают команды ENTER, LEAVE и RET N смотри в
описании этих команд, там все подробно расписано.


Ответ отправлен: 06.09.2002, 09:25
Отправитель: ASMодей


 Вопрос № 1181

Skajite pojaluista,
pochemu proga zavisaet(smotri prilojenija) posle v'jvoda na ekran soobshtenie 'Tancho Rusev$', ja compiliruija
ml /Fl /AT xlatb.asm
compiliruetsja vse normalno poluchaetsja 'xlatb.com',a
posle zapuska zavisaet. Ja rabotau v DOS Prompt XP Windows.
V Windows'98SE delo stoit huje. Mne kagetsja chto problema
v instruksii 'cmp al,'$'' i jz @1 ili ja ochibaus?


Приложение:


Вопрос отправлен: 05.09.2002, 17:09
Отправитель: Tancho (rusev@neochim.bg)

[Следующий вопрос >>] [Список вопросов]

Отвечает Beeblebrox

Здравствуйте, Tancho!
У меня тасм, поэтому я слегка переделал заголовок. Ошибка - в нарушении стека

Приложение:

Ответ отправлен: 05.09.2002, 18:22
Отправитель: Beeblebrox


Отвечает Sinner

Здравствуйте, Tancho!
см. приложение

Приложение:

Ответ отправлен: 08.09.2002, 10:58
Отправитель: Sinner


Отвечает baldr

Добрый день, Tancho!
Ты делаешь push, потом проверяешь значение и если ноль - то выходишь... А в стеке при выходе находится число! Короче, сделай:
@1:
pop ax

и все должно работать.

Ответ отправлен: 05.09.2002, 17:44
Отправитель: baldr


Отвечает Broken Sword

Hi Tancho!
ты ошибаешься
прога твоя зависает исключительно из-за ret-а в конце (ты ж стек запортил перед этим push ax-ом, и у тебя уже не ноль на вершине).
еще непонятен твой хитроумный трюк с "K R A J", ты зачем то пихаешь его оффсет в si, а потом выводишь символ из al ($) в режиме телетайпа (0Eh ф-ция 10h прерывания) на экран. Нахрена? непонятно...

Ответ отправлен: 05.09.2002, 19:44
Отправитель: Broken Sword


Отвечает ASMодей

Приветствую Вас, Tancho!
Ошибка в том, что после перехода на метку @1 ты забыл
вытащить из стека сохраненный AX, поэтому возврат из
программы у тебя происходит х.з. куда. И еще не понятно
что ты хотел сделать функцией 0Eh - она выводит ОДИН символ
и совсем не из [SI] !!!


Ответ отправлен: 06.09.2002, 09:26
Отправитель: ASMодей


Отвечает ARDoS

Добрый день, Tancho!
По моему именно в jz @1 (Jump if Zero). Если ты сравниваешь al с "$", то что должно быть равно нулю? Хотя возможно я и не прав.


Ответ отправлен: 06.09.2002, 16:00
Отправитель: ARDoS


 Вопрос № 1182

Приветствую Вас всех!
Помогите как с помощю TASM создать VXD.
Незнаю какие команды нужно ставить после TASM.exe
Заранее благодарен!
Александр.



Вопрос отправлен: 05.09.2002, 17:53
Отправитель: Александр

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Здравствуйте, Александр!
По-моему - никак.
Используй масм, по крайней мере, нормальные люди все так делают.

Ответ отправлен: 07.09.2002, 10:45
Отправитель: masquer


Отвечает Топор

Добрый день, Александр!
Процесс компиляции в общем такой же. В DEF-файл надо добавить строку вида:
VXD имя_файла тип_vxd
где тип_vxd - DYNAMIC или STATIC, смотря какой надо.


Ответ отправлен: 07.09.2002, 20:30
Отправитель: Топор


 Вопрос № 1183

Hi all!
Какой функцией и какого прерывания написать прогу низеоуровневого форматирования?
Спасибо!



Вопрос отправлен: 05.09.2002, 18:15
Отправитель: R@ptor (Spinosaur@narod.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает baldr

Приветствую Вас, R@ptor!
Нет ничего более низкоуровневого, чем паяльник... :)
А чуть повыше - работа через порты. Через них и шуруй. Если надо, могу поискать доку.

Ответ отправлен: 05.09.2002, 18:43
Отправитель: baldr


Отвечает nix

Доброе время суток, R@ptor!
Всего-то нужно:
1. Определить количество физических hdd.
2. Определить количество логических дисков.
3. Вывести сообщение типа "Processing..."
4. Поседовательно, начиная с первого, забить все диски нулями, или какой-нибудь чепухой.
ВСЕ:-))))))))


Ответ отправлен: 06.09.2002, 04:53
Отправитель: nix


Отвечает SonicX

Здравствуйте, R@ptor!
13h прерывание.

Ответ отправлен: 06.09.2002, 20:03
Отправитель: SonicX


 Вопрос № 1184

Можно ли вместо UPSовского аккумулятора подключить обычный автомобильный аккумулятор. Я думаю, что автомобильный аккумулятор будет гораздо дольше работать (не 10-15 минут, а хотя бы 1,5-2 часа). Но я не уверен подойдет ли этот аккумулятор (он все таки мощнее стандартного UPSовского) не сгорит ли там чего?



Вопрос отправлен: 05.09.2002, 19:02
Отправитель: Boss (kondratev@mail.kz)

[Следующий вопрос >>] [Список вопросов]

Отвечает ARDoS

Приветствую Вас, Boss!
Один мой знакомый подключил автомобильный аккумулятор и вроде бы ничего не сгорело.

Ответ отправлен: 06.09.2002, 16:00
Отправитель: ARDoS


Отвечает baldr

Приветствую Вас, Boss!
Если компа не жалко - пробуй... А если жалко - не пробуй.
Я ОЧЕНЬ не советую этого делать. Если питание выключат - тебе 15 минут хватит на сохранение любого документа... А сидеть и продолжать работать (играть?) от аккумулятора, когда отключен свет - это уж совсем...
Если так хочешь - то уж подключись еще к одной фазе! И тебе нервов меньше, и надежнее...

Ответ отправлен: 06.09.2002, 10:12
Отправитель: baldr


Отвечает SonicX

Здравствуйте, Boss!
Можно, но может сгореть.
Этот вопрос в другую группу отошли.


Ответ отправлен: 06.09.2002, 20:03
Отправитель: SonicX



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (39)
C / C++ (28)
Perl (9)
Delphi (14)
Pascal (25)
Basic / VBA (10)
Java / JavaScript (13)
PHP (9)
MySQL / MSSQL (10)
Пользователю
Windows 95/98/Me (40)
Windows NT/2000/XP (27)
"Железо" (36)
Поиск информации (12)
Администратору
Windows NT/2000/XP (14)
Linux / Unix (16)
Юристу
Гражданское право (11)
Семейное право (6)
Трудовое право (8)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное