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

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


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

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

Выпуск № 748
от 10.07.2004, 21:40

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


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

Tigran K. Kalaidjian
Статус: Профессиональный
Общий рейтинг: 195.27
URL: Оптимизация ПК
[Подробней >>]
Foamplast
Статус: Профессиональный
Общий рейтинг: 138.92
URL: мой личный сайт
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 133.73
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 116.65
[Подробней >>]
bocha
Статус: Опытный
Общий рейтинг: 135.47
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 118
[Подробней >>]
 
Artemy
Статус: Опытный
Общий рейтинг: 109.74
Телефон: 8 905 549 38 66
[Подробней >>]
Стас
Статус: Опытный
Общий рейтинг: 126.68
[Подробней >>]


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

Вопрос № 5556. Где бы найти статью на тему "Пишем свою ОС". Только для самых начинающих, а то нашел стать... (ответов: 2)
Вопрос № 5557. Добрый день! пожалуйста, подскажите как правильно использовать функцию CreateBitmap. У меня создаётс... (ответов: 2)
Вопрос № 5558. Привет всем! Подскажите как понять такой код cdq xor eax,edx sub eax,edx and eax,0FFh xor eax,edx su... (ответов: 2)
Вопрос № 5559. Привет! Пишу ОС. В защищеном режиме как известно нельзя использовать прерывания BIOS. А как читать с... (ответов: 2)
Вопрос № 5560. Здравствуйте. Вот у меня есть программа, в которой я для выполнения определенной функции создаю пото... (ответов: 2)
Вопрос № 5561. Привет всем! Вопрос такой - можно ли в SI при отладке приложения для которого нет отладочной инфор... (ответов: 2)
Вопрос № 5562. Привет. Недавно был вопрос про выделения памяти. Эксперт Евгений Иванов ответил что можно использова... (ответов: 4)
Вопрос № 5563. Привет. Недавно был вопрос про выделения памяти. Эксперт Евгений Иванов ответил что можно использова... (ответов: 1)
Вопрос № 5564. Уважаемые господа! Такой вопросик - пишем на Visual Studio 2003 (Для Иванова : Тексты на асме - поэт... (ответов: 1)
Вопрос № 5565. Доброго времени суток, уважаемые. Хочу базу данных на ASS для DOS. Возможно ли?, или легче на СИ или... (ответов: 3)
Вопрос № 5566. Ув. Эксперты! Пишу в главном модуле моей программы(main.asm): include m1.asm .code start: end start... (ответов: 4)

Вопросов: 11, ответов: 25


 Вопрос № 5556

Где бы найти статью на тему "Пишем свою ОС". Только для самых начинающих, а то нашел статью и ничего не понял :(.



Вопрос отправлен: 05.07.2004, 18:29
Отправитель: cs

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

Отвечает Tigran K. Kalaidjian

Добрый день, cs!
http://www.lowlevel.ru/
И у меня где-то залежалось. Если надо - вышлю.

Ответ отправлен: 05.07.2004, 22:23
Отправитель: Tigran K. Kalaidjian


Отвечает Foamplast

Добрый день, cs!
1. Начинающим этим не следует заниматься. Зря время пропадёт.
2. Лучше читать не статьи, а книги. Такие статьи пишут ничего не понимающие люди (иначе не писали бы):
Э. Танненбаум "Современные Операционные Системы".
Фред Брукс "Мифический человеко-месяц".


Ответ отправлен: 08.07.2004, 09:07
Отправитель: Foamplast


 Вопрос № 5557

Добрый день!
пожалуйста, подскажите как правильно использовать функцию CreateBitmap. У меня создаётся почему-то только 16-битный битмап, а остальные не хотят. Читал winapi, мне там непонятно (дело не в языке а в смысле).
Основное - не понятно насчёт битовых плоскостей.
Или хотя бы подскажите в какую сторону копать. Если надо, то могу выслать исходники.
Заранее спасибо!


Приложение:


Вопрос отправлен: 05.07.2004, 18:41
Отправитель: soflot (soflot@ukr.net)

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

Отвечает Евгений Иванов

Добрый день, soflot!
смотри исходник и там найдёшь подпрограмму создания картинки.
http://superforest.narod.ru/research_sclock.htm
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 05.07.2004, 20:23
Отправитель: Евгений Иванов


Отвечает Foamplast

Приветствую Вас, soflot!
Лучше пользоваться CreateCompatibleBitmap().


Ответ отправлен: 08.07.2004, 09:07
Отправитель: Foamplast


 Вопрос № 5558

Привет всем!
Подскажите как понять такой код
cdq
xor eax,edx
sub eax,edx
and eax,0FFh
xor eax,edx
sub eax,edx
Видимо происходит приведение по модулю
0FFh, но что дают строки
xor eax,edx
sub eax,edx
непонятно.
Заранее благодарен за ответы.



Вопрос отправлен: 05.07.2004, 20:47
Отправитель: 1

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

Отвечает Ayl

Приветствую Вас, 1!
Знаковое приведение по модулю без проверки знакового бита. После команды cdq edx может быть либо 0, либо -1. Если edx = 0, т.е. eax > 0, то приведенный код равносилен and eax, 0ffh, т.е. выделению младшего байта, т.е. остаток от деления на 256.
Если же edx = -1, т.е. eax < 0, то последовательность команд
xor eax, edx
sub eax, edx
приводит к тому, что в регистре eax будет содержаться -eax (xor eax, edx = xor eax, -1 = not eax; sub eax, edx = eax - (-1) = eax + 1 => обе вместе дают ^eax+1 = neg eax = -eax).
Далее выделяется младший байт и производится обратная операция.
Т.е. xor eax, edx; sub eax, edx = eax, если edx = 0 и -eax, если edx = -1.


Ответ отправлен: 06.07.2004, 16:34
Отправитель: Ayl


Отвечает Tigran K. Kalaidjian

Приветствую Вас, 1!
Это уже зависит от замысла автора =)
Попробуйте построить матрицу (eax ; edx), где eax и edx пробегают значения, скажем от 1 до 15 - может увидите некоторую закономерность. Вот пример программы на TP:
const n=15;
var i,j: integer;
tigmas: ARRAY[1..n,1..n] of REAL;
BEGIN
writeln;
for i:=1 to n do
for j:=1 to n do
tigmas[i,j]:= (i xor j)-j;
for i:=1 to n do begin
writeln;
for j:=1 to n do
write(tigmas[i,j]:4:0);
end;
END.
В приложении результат работы при n=5

Приложение:

Ответ отправлен: 09.07.2004, 09:26
Отправитель: Tigran K. Kalaidjian


 Вопрос № 5559

Привет!
Пишу ОС. В защищеном режиме как известно нельзя использовать прерывания BIOS. А как читать с хард/флоппи/сд-ром без BIOS?



Вопрос отправлен: 05.07.2004, 22:15
Отправитель: osmaker

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

Отвечает Tigran K. Kalaidjian

Здравствуйте, osmaker!
Через порты. Читайте мой FAQ - там есть такой ответ.
http://kalaidjian.narod.ru/rusfaq.rar

Ответ отправлен: 05.07.2004, 22:27
Отправитель: Tigran K. Kalaidjian


Отвечает Foamplast

Приветствую Вас, osmaker!
Как БИОС, по портам. Если надо, давай адрес, пришлю исходник.


Ответ отправлен: 08.07.2004, 09:08
Отправитель: Foamplast


 Вопрос № 5560

Здравствуйте.
Вот у меня есть программа, в которой я для выполнения определенной функции создаю поток, в самом начале программы. Возникают вопросы:
1. Я создаю поток с условием, что он сразу запускается на выполнение. Но отладчик W32dasm в процедуру нового потока не заходит. Т.е. пошагово выполняется CreateThread, а следующий за этим шаг сразу ExitProcess. Как же попасть в эту процедуру?
2. у программы нет окон, соответственно нет очереди сообщений. Как новому потоку после выполнения функции дать знать главному потоку, что он закончил?
Т.е. без сообщения. Программа под винду без очереди сообщений вообще выполняется линейно? Например так:
Старт->CreateThread->ThreadProc->обратно в основной тред->ExitProcess
Тогда можно просто завести глобальную переменную. Или я не прав?
Спасибо.



Вопрос отправлен: 06.07.2004, 12:51
Отправитель: SanyOK

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

Отвечает bocha

Здравствуйте, SanyOK!
можно конечно и глобальную переменную, но правильно ожидать завершения потока так:
HANDLE hev;
main()
{
CreateEvent(NULL, TRUE, FALSE, NULL);
CreateTread(....);
WaitForSingleObject(hev);//ожидаем установки события
ExitProcess(0);
}
TreadFunct(...)
{ ....
SetEvent(hev);
}


Ответ отправлен: 06.07.2004, 16:32
Отправитель: bocha


Отвечает Foamplast

Добрый день, SanyOK!
1. В отладчике OllyDbg есть галочка "останавливаться при создании нового потока" (break on new thread)
2. Главный поток может ждать на второстепенном функцией WaitForSingleObject(). Также можно завести переменную, вызвать процедуру либо воспользоваться средствами межпроцессного взаимодействия (каналы, почтовые ящики, сокеты, разделяемая память)
3. Да, линейно.
4. Если количество потоков каждого типа известно, проще завести переменные. Если количество потоков каждого типа больше 1, следует использовать синхронизацию. Если нужно ждать, вызывайте ожидающие функции как в пункте 2.


Ответ отправлен: 08.07.2004, 09:08
Отправитель: Foamplast


 Вопрос № 5561

Привет всем!
Вопрос такой -
можно ли в SI при отладке приложения для
которого нет отладочной информации.
вводить свои названия адресов и функций.
Скажем, чтобы при этом определенные пользователем
фукции отображались не адресами а привычными названиями.
Если это возможно то как это сделать.
Заранее благодарен за ответы.



Вопрос отправлен: 06.07.2004, 16:36
Отправитель: 1

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

Отвечает Tigran K. Kalaidjian

Приветствую Вас, 1!
В SI можно ввести адрес нужной функции, а что насчёт показа названий ф-ций, то это решается выбором отладчика.=)

Ответ отправлен: 09.07.2004, 18:16
Отправитель: Tigran K. Kalaidjian


Отвечает _vt

Приветствую Вас, 1!
Если функции находятся в DLL, то путь к этой DLL можно прописать в конфигурационном файле SoftICE (winice.dat, по-моему), и названия функций будут видны. В противном случае - нельзя.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 08.07.2004, 21:39
Отправитель: _vt


 Вопрос № 5562

Привет.
Недавно был вопрос про выделения памяти. Эксперт Евгений Иванов ответил что можно использовать winapi GlobalAlloc. Объясните пожалуйста по подробнее как ее можно использовать для выделения памяти?см. приложение



Приложение:


Вопрос отправлен: 06.07.2004, 18:28
Отправитель: aaa

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

Отвечает Евгений Иванов

Приветствую Вас, aaa!
тут все пишут про HeapAlloc, что она экономнее и быстрее..
а так вот:
Call GlobalAlloc, GPTR, 512
or eax,eax
jz err_mem
xchg edi,eax
stosd
stosb
;....
удачи!
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 07.07.2004, 22:53
Отправитель: Евгений Иванов


Отвечает Foamplast

Приветствую Вас, aaa!
Нечего её использовать. Она больше десяти лет назад создана под Windows 3.11. Делайте, как я сказал.


Ответ отправлен: 08.07.2004, 09:09
Отправитель: Foamplast


Отвечает Tigran K. Kalaidjian

Доброе время суток, aaa!
The GlobalAlloc function allocates the specified number of bytes from the heap. In the linear Win32 API environment, there is no difference between the local heap and the global heap.
HGLOBAL GlobalAlloc(
UINT uFlags, // object allocation attributes
DWORD dwBytes // number of bytes to allocate
);

Parameters
uFlags
Specifies how to allocate memory. If zero is specified, the default is GMEM_FIXED. Except for the incompatible combinations that are specifically noted, any combination of the following flags can be used. To indicate whether the function allocates fixed or movable memory, specify one of the first four flags:
Flag Meaning
GMEM_FIXED Allocates fixed memory. This flag cannot be combined with the GMEM_MOVEABLE or GMEM_DISCARDABLE flag. The return value is a pointer to the memory block. To access the memory, the calling process simply casts the return value to a pointer.
GMEM_MOVEABLE Allocates movable memory. This flag cannot be combined with the GMEM_FIXED flag. The return value is the handle of the memory object. The handle is a 32-bit quantity that is private to the calling process. To translate the handle into a pointer, use the GlobalLock function.
GPTR Combines the GMEM_FIXED and GMEM_ZEROINIT flags.
GHND Combines the GMEM_MOVEABLE and GMEM_ZEROINIT flags.
GMEM_DDESHARE Allocates memory to be used by the dynamic data exchange (DDE) functions for a DDE conversation. Unlike Windows version 3. x, this memory is not shared globally. However, this flag is available for compatibility purposes. It may be used by some applications to enhance the performance of DDE operations and should, therefore, be specified if the memory is to be used for DDE. Only processes that use DDE or the clipboard for interprocess communications should specify this flag.
GMEM_DISCARDABLE Allocates discardable memory. This flag cannot be combined with the GMEM_FIXED flag. Some Win32-based applications may ignore this flag.
GMEM_LOWER Ignored. This flag is provided only for compatibility with Windows version 3. x.
GMEM_NOCOMPACT Does not compact or discard memory to satisfy the allocation request.
GMEM_NODISCARD Does not discard memory to satisfy the allocation request.
GMEM_NOT_BANKED Ignored. This flag is provided only for compatibility with Windows version 3. x.
GMEM_NOTIFY Ignored. This flag is provided only for compatibility with Windows version 3. x.
GMEM_SHARE Same as the GMEM_DDESHARE flag.
GMEM_ZEROINIT Initializes memory contents to zero.

dwBytes
Specifies the number of bytes to allocate. If this parameter is zero and the uFlags parameter specifies the GMEM_MOVEABLE flag, the function returns a handle to a memory object that is marked as discarded.

Return Values
If the function succeeds, the return value is the handle of the newly allocated memory object.
If the function fails, the return value is NULL. To get extended error information, call GetLastError
.
Remarks
If the heap does not contain sufficient free space to satisfy the request, GlobalAlloc returns NULL.
Because NULL is used to indicate an error, virtual address zero is never allocated. It is, therefore, easy to detect the use of a NULL pointer.
All memory is created with execute access; no special function is required to execute dynamically generated code.
Memory allocated with this function is guaranteed to be aligned on an 8-byte boundary.
The GlobalAlloc and LocalAlloc functions are limited to a combined total of 65,536 handles for GMEM_MOVEABLE and LMEM_MOVEABLE memory per process. This limitation does not apply to GMEM_FIXED or LMEM_FIXED memory.
If this function succeeds, it allocates at least the amount of memory requested. If the actual amount allocated is greater than the amount requested, the process can use the entire amount. To determine the actual number of bytes allocated, use the GlobalSize function.

Ответ отправлен: 09.07.2004, 09:16
Отправитель: Tigran K. Kalaidjian


Отвечает Artemy

Добрый день, aaa!
см. Приложение

Приложение:

Ответ отправлен: 07.07.2004, 15:08
Отправитель: Artemy


 Вопрос № 5563

Привет.
Недавно был вопрос про выделения памяти. Эксперт Евгений Иванов ответил что можно использовать winapi GlobalAlloc. Объясните пожалуйста по подробнее как ее можно использовать для выделения памяти?см. приложение



Приложение:


Вопрос отправлен: 06.07.2004, 18:28
Отправитель: aaa

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

Отвечает Tigran K. Kalaidjian

Здравствуйте, aaa!
см. ответ на 5562

Ответ отправлен: 09.07.2004, 09:17
Отправитель: Tigran K. Kalaidjian


 Вопрос № 5564

Уважаемые господа! Такой вопросик - пишем на Visual Studio 2003 (Для Иванова : Тексты на асме - поэтому попал сюда). А вопросик вот в чем - у вижуала, борланда и прочее свои требования к именам процедур.
Так например функция Initialize класса WinSock должна быть - ?Initialize@WinSock@@QAGXXZ (так ее ищет линкер). Все эти ограничения обоснованы и понятны, но вот как облегчить процесс перкомпиляции проектов на компиляторах от разных производителей? Так, например, разработку драйверов приходиться осуществлять на Visual, а все отладочные операции предпочитаю на борланде.
При помощи макросов такого сделать не удается.
Поэтому вопрос -
Пусть имеем в теле модуля процедуру:
Initialize_WinSock
Можно ли для нее сделать "псевдоним", который бы в obj для этой процедуры создавал бы
public ?Initialize@WinSock@@QAGXXZ ?
При этом при смене платформ компиляций необходимо было бы изменить только сам псевдоним.
А сейчас приходиться это делать в описании функции, в описании public, в описании классов, да и еще в межклассовых вызовах (если вызов не виртуальный).



Вопрос отправлен: 06.07.2004, 20:21
Отправитель: fxobject

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

Отвечает Foamplast

Приветствую Вас, fxobject!
Надо всё писать на NASM или лучше FASM и не париться с искажением имён.


Ответ отправлен: 08.07.2004, 09:09
Отправитель: Foamplast


 Вопрос № 5565

Доброго времени суток, уважаемые. Хочу базу данных на ASS для DOS. Возможно ли?, или легче на СИ или Pascal? Если возможно, дайте пожалуйста приложение. Хотя бы БД на номера телефонов с полями И.Ф.О. и номер телефона.



Вопрос отправлен: 06.07.2004, 20:24
Отправитель: Rinat

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

Отвечает Foamplast

Приветствую Вас, Rinat!
В общем случае на асме намного проще, так как можно эффективно работать с любыми структурами данных.


Ответ отправлен: 08.07.2004, 09:09
Отправитель: Foamplast


Отвечает Стас

Здравствуйте, Rinat!
Можно конечно, средне сложно.
А писать базу для тебя влом... Ищите и обрящите!

Ответ отправлен: 07.07.2004, 14:11
Отправитель: Стас


Отвечает Artemy

Здравствуйте, Rinat!
Для организации БД под ДОС существует масса специально для этого созданных средств... в свое время наиболее распространенными у нас были такие языки как FoxPro и Clipper.


Ответ отправлен: 07.07.2004, 15:13
Отправитель: Artemy


 Вопрос № 5566

Ув. Эксперты!
Пишу в главном модуле моей программы(main.asm):
include m1.asm
.code
start:
end start
А в m1.asm:
.code
start:
WinMain proc
...
WinMain endp
end start
Функция WinMain создает окно. Компилирую, запускаю и появляется окно? Почему? ведь я в main.asm не вызывал функцию WinMain.



Вопрос отправлен: 06.07.2004, 21:30
Отправитель: hex

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

Отвечает Foamplast

Здравствуйте, hex!
Строка include m1.asm замещается на
.code
start:
WinMain proc
...
WinMain endp
end start
после end start ассемблер игнорирует всё.


Ответ отправлен: 08.07.2004, 09:10
Отправитель: Foamplast


Отвечает _vt

Здравствуйте, hex!
А это не зависит от того, где у тебя функция WinMain - ты указал ассемблеру точку входа командой end start - вот с нее код и выполняется.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 08.07.2004, 21:40
Отправитель: _vt


Отвечает Tigran K. Kalaidjian

Добрый день, hex!
Когда Вы указываете «include…» вы просто добавляете в этом месте текст m1.asm, потом происходит компиляция и выполнение блока, который содержится в m1.asm

Ответ отправлен: 09.07.2004, 19:17
Отправитель: Tigran K. Kalaidjian


Отвечает bocha

Добрый день, hex!
вместо include ml.asm подставляется содержимое файла. Результирующий файл получается
.code
start:;точка входа
WinMain proc
...
WinMain endp
end start; конец программы с точкой входа start, весь последующий код компилятор игнорирует
.code
start:
end start


Ответ отправлен: 07.07.2004, 01:47
Отправитель: bocha



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

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (27)
C / C++ (14)
Perl (4)
Builder / Delphi (18)
Pascal (28)
Basic / VBA (6)
Java / JavaScript (5)
PHP (13)
Криптография (8)
WinAPI (12)
Радиоэлектроника (12)
Пользователю
Windows 95/98/Me (40)
Windows NT/2000/XP (56)
"Железо" (38)
Поиск информации (16)
Администратору
Windows NT/2000/XP (32)
Linux / Unix (15)
Юристу
Гражданское право (8)
Семейное право (6)
Трудовое право (7)
КоАП (5)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Адрес подписки
Отписаться

В избранное