Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 756
от 04.08.2004, 08:00
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 5679 Отправлено ответов: 15341 Активность: 270.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Ayl Статус: Профессиональный Общий рейтинг: 116.52 [Подробней >>] |
PavPS Статус: Доверительный Общий рейтинг: 127.1 [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 133.33 URL: Super Assembler Software Телефон: НСС +7 831 3107039 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 118.29 [Подробней >>] |
St Статус: Профессиональный Общий рейтинг: 104.87 [Подробней >>] |
Горячев Игорь Статус: Доверительный Общий рейтинг: 119.85 [Подробней >>] |
Dragoon Статус: Опытный Общий рейтинг: 111 [Подробней >>] |
bocha Статус: Опытный Общий рейтинг: 131.86 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 5657. Привет Ayl! Большое Спасибо за ответы. Ты был прав, рисовать точки через биос вообще труба,... (ответов: 1)
Вопрос № 5658. Уважаемые эксперты! Стал изучать рассылку "Учимся программировать на Ассемблере" возник ... (ответов: 6)
Вопрос № 5659. Здраствуйте. Как при помощи ассемблера изменить параметр в HKEY_Local_MachineSystemControlSet001Ser... (ответов: 3)
Вопрос № 5660. Как корректно установить MASM 6.11 - 6.12 на 1000 атлон, Миллениум и На 1800 4 Пень на ХР? Где запус... (ответов: 3)
Вопрос № 5661. Привет. Подскажите чем можно заменить HIEW, QVIEW? Чтоб с виндовым интерфейсом был.... (ответов: 2)
Вопрос № 5662. Ваш Вопрос № 5658 Уважаемые эксперты! Благодарю Вас за ответы на мой предыдущий вопрос: >>Стал изу... (ответов: 3)
Вопрос № 5663. Здравствуйте, уважаемые эксперты. Скажите, пожалуйста, как получить результат функции API если он во... (ответов: 4)
Вопрос № 5665. Привет всем добрым Экспертам :)) Есть пару маленьких вопросиков по аптимизации. Моно-ли патимизирова... (ответов: 2)
Вопрос № 5666. Здраствуйте Эксперты! Имеется диалоговое окно с edit-box'aми(superclassing). 1)Как вывести строку на... (ответов: 1)
Вопросов: 9, ответов: 25
Вопрос № 5657 |
Привет Ayl!
Большое Спасибо за ответы.
Ты был прав, рисовать точки через биос вообще труба, как-будто у меня не P4 a 286. Я действительно не установил видео режим, поэтому у меня ничего не рисовалось, спасибо и за эту подсказку. А как рисовать напрямую в видео память? Наверняка там всего лишь пара-тройка каких-нибудь команд? Это вот это что-ли - mov ax,0B800h, mov es,ax?
С клавой и стеком тоже полностью разобрался.
Вот еще есть такая команда XOR. Что это за загадка природы?
Вот пример:
xor 214F,2834 = 097B
Схема:
2 1 4 F
- + + -
2 8 3 4
= = = =
0 9 7 B
, по бокам минусы, в середине плюсы, смотрим далее:
xor 1234,4321 = 5115
Схема:
1 2 3 4
+ - - +
4 3 2 1
= = = =
5 1 1 5
, почему теперь по бокам плюсы, в середине минусы??? Причем никакой разницы, как иксорю, что 1234,4321, что 4321,1234, все равно получает 5115, с 214F,2834 та же самая фигня. Читал в справке по ассму про XOR, но там написано только про то как ведут себя 1 и 0, что мне теперь каждое число переводить в 1 и 0?
И еще вопросец: почему так мало регистров? Вот у меня программа в которой я использую 2 счетчика, но AX, BX, CX постоянно должны содержать одно число, под один счетчик и приспособил DX, под другой DI, остался только SI свободным, а если мне надо включить еще 3 разны счетчика? Может можно объявить какую-нибудь свою переменную и потом использовать её как захочу.
С уважением Данат.
Вопрос отправлен: 29.07.2004, 12:44
Отправитель: Данат
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Здравствуйте, Данат!
Начну с конца. Мало регистров - это вопрос к разработчикам процессора. Дело в том, что ранние x86 были сделаны по технологии CISC, которая предполагает микропрограммную интерпретацию. И для уменьшения длины команд (соответственно, повышения быстродействия) пришлось сократить число регистров. Вообще, малое число регистров - это беда всех процессоров типа CISC.
На самом деле, обычно их хватает. Смотри. У тебя всего 8 РОНов: AX, BX, CX, DX, DI, SI, BP и SP. Ну, использовать SP достаточно затруднительно, хотя при желании и можно (запретить прерывания и не использовать стек - вот и освободил регистр). Чем тебе не нравится BP? Если не использовать его в качестве базы при обращении к памяти, то он вообще не отличается от остальных. А при обращении к памяти либо делаешь SS равным DS, либо напрямую указываешь переопределение сегмента.
Объявлять переменные можешь сколько и как хочешь. В современных процессорах время обращения к памя ти не намного больше времени доступа к регистрам, т.ч. на это можно не обращать внимания. К тому же ты временно можешь использовать сегментные регистры ES, FS и GS для хранения разных данных (только не сможешь выполнять над ними никакие операции, кроме пересылки).
Не забывай, что константы можно указывать прямо в команде, не обязательно ее помещать в регистр.
XOR - это логическая операция, а не арифметическая, поэтому через сложение и вычитание ты ее не определишь. Она определяется именно побитово:
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Насчет того, что нет разницы между a xor b и b xor a ты абсолютно прав - эта операция коммутативна. Также она и ассоциативна: (a xor b) xor c = a xor (b xor c).
Замечательные свойства:
a xor a = 0
(a xor b) xor b = a
А насчет того, что надо все переводить в двоичный код... Хочешь, запомни табличку из приложения и работай в 16-ричной с.с.
Теперь о рисовании. Ты в каком режиме это собираешься делать? Самый простой режим для программирования - это 320*200, 256 цветов (режим 13h). Здесь каждый пиксель описывается ровно одним байтом. В одной строке у тебя 320 пикселей, всего строк 200. Адрес пикселя с координатами (x, y) вычисляется как 320 * y + x.
Сегмент видеопамяти - 0a000h. Например, следующий код выведет точку в середине экрана:
.Model TINY
.286
.Code
.StartUp
mov ax, 13h
int 10h
push 0a000h
pop es
mov di, 320 * 100 + 160
mov al, 15
stosb
xor ax, ax
int 16h
mov ax, 3
int 10h
ret
end
А вот программирование для VGA в режиме 640*480, 16 цветов (12h) гораздо труднее. Дело в организации памяти VGA. Там каждая точка описывается 4-мя битами, причем каждый бит помещается в отдельную т.н. цветовую плоскость. Один байт в видеопамяти содержит информацию о 8-ми соседних точках.
Если тебя интересует программирование для этого режима, посмотри инфу в инете. Зд есь писать это невозможно, в книжках программированию по плоскостям отводятся по нескольку глав.
Приложение:
Ответ отправлен: 29.07.2004, 14:03
Отправитель: Ayl
Вопрос № 5658 |
Уважаемые эксперты!
Стал изучать рассылку "Учимся программировать на Ассемблере"
возник такой вопрос можно ли программировать на асме под DOS используя Win
или нужно обязательно ставить DOS?
компьютер Cel-1,7Ghz/256 RAM/Win2003
Заранее спасибо,
Алексей
Вопрос отправлен: 29.07.2004, 15:32
Отправитель: alexey
[Следующий вопрос >>] [Список вопросов]
Отвечает PavPS
Доброе время суток, alexey!
Да не почему?! Вот, например, у меня ntvdm непного "подглючивает" но иногда без доса даже удобнее. Особенно если начинаешь, т.к. в чистом досе серьёзная ошибка и завис, а тут просто перезапустил и всё... да и доку одновременно читать можно. Правда вот если углубляться хочешь - то тут ntvdm накладывает ограничения.
Ответ отправлен: 29.07.2004, 21:05
Отправитель: PavPS
Отвечает Евгений Иванов
Добрый день, alexey!
Платформа тут ни при чём. Изучать программирование можно в любой ситуации.
* EMan: -=- Любовь всегда неразделённая... =-=
Ответ отправлен: 30.07.2004, 12:10
Отправитель: Евгений Иванов
Отвечает _vt
Добрый день, alexey!
Поставь MS Virtual PC 2004 и на него поставь DOS - отличное решение! А вообще, начинай сразу с Windows.
* Origin : Life begins at 1000Mhz!
Ответ отправлен: 30.07.2004, 00:22
Отправитель: _vt
Отвечает St
Привет, alexey!
Можно, однако под NT-системами бывают некоторые проблемы с DOS'овскими программами (хоть и редко - пара случаев такой несовместимости у меня была), так как там для таких программ запускается эмуляция DOS'а, которая не абсолютно совместима с реальным DOS'ом.
St
Ответ отправлен: 29.07.2004, 16:31
Отправитель: St
Отвечает Горячев Игорь
Доброе время суток, alexey!
Чтоб максимально изучить DOS, не мучитить Win2003 борьбой за монополизированные ресурсы и не убить винду, изгадив ей пару регистров, лучше создать маленький раздельчик под Дос и программить. По крайне мере, мне так удобно :)
Ответ отправлен: 29.07.2004, 23:19
Отправитель: Горячев Игорь
Отвечает Dragoon
Здравствуйте, alexey!
Можно. В Винде есть эмулятор DOS'a
Ответ отправлен: 02.08.2004, 19:38
Отправитель: Dragoon
Вопрос № 5659 |
Здраствуйте.
Как при помощи ассемблера изменить параметр в
HKEY_Local_MachineSystemControlSet001ServicesCdrom
с 1 на 0?Если можно примерчик.
Вопрос отправлен: 29.07.2004, 16:14
Отправитель: Семен
[Следующий вопрос >>] [Список вопросов]
Отвечает bocha
Доброе время суток, Семен!
LONG RegOpenKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE* lpData,
DWORD cbData
);
Ответ отправлен: 29.07.2004, 17:02
Отправитель: bocha
Отвечает PavPS
Приветствую Вас, Семен!
Юзай API:
для получения хэндла этого ключа реестра
LONG RegOpenKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);
для изменения значения...
LONG RegSetValue(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD dwType,
LPCTSTR lpData,
DWORD cbData
);
Ответ отправлен: 29.07.2004, 21:01
Отправитель: PavPS
Отвечает _vt
Здравствуйте, Семен!
Ну, например, так:
* Origin : Life begins at 1000Mhz!
Приложение:
Ответ отправлен: 30.07.2004, 01:19
Отправитель: _vt
Вопрос № 5660 |
Как корректно установить MASM 6.11 - 6.12 на 1000 атлон, Миллениум и На 1800 4 Пень на ХР? Где запускающий файл? Скачал с сайта Калашникофф, никак не могу этим воспользоваться! Заранее благодарен! Помогите!!! Очень надо!;-).
Вопрос отправлен: 29.07.2004, 18:45
Отправитель: Алексей Атртёмов (aartmov@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Добрый день, Алексей Атртёмов!
Запускающий файл - install.exe. ;-)
* Origin : Life begins at 1000Mhz!
Ответ отправлен: 30.07.2004, 00:23
Отправитель: _vt
Отвечает Горячев Игорь
Приветствую Вас, Алексей Атртёмов!
Под XP лучше MASM32... И там все понятно...
Ответ отправлен: 29.07.2004, 23:22
Отправитель: Горячев Игорь
Отвечает St
Привет Алексей Атртёмов!
И MASM и TASM обычно поставляются или в архиве или с инсталлятором. После распаковки в выбранный каталог вы можете сразу же его использовать, однако не ждите от него никакой встроенной оболочки, как в языках высокого уровня. Текст программы (*.asm) пишется в обычном редакторе (смотря подо что вы пишете - под DOS или Windows - выбирайте соответствующий редактор, помните о разнице в их кодировках) или специализированных редакторах (RadAsm, AsmEdit, подойдет и оболочка, например, от C/C++, хотя последняя, IMHO, слишком громодкая).
Далее полученный текст(ы) и сопутствующие файлы - *.inc, *.def, *.rc и тд (последние чаще всего нужны при написании программ под Windows) компилируются и линкуются либо вручную (каждый раз в командной строке набираются команды компиляции (ml.exe) и линковки (link.exe) с нужными ключами (узнать о них можно запустив это программы безо всяких ключей) и путями и именами требуемых файлов), либо, что гор аздо проще, создается bat-файл (в каталоге bin есть примеры, но лучше написать свой попроще).
St
Ответ отправлен: 30.07.2004, 12:40
Отправитель: St
Вопрос № 5661 |
Привет.
Подскажите чем можно заменить HIEW, QVIEW? Чтоб с виндовым интерфейсом был.
Вопрос отправлен: 29.07.2004, 19:25
Отправитель: shl
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Здравствуйте, shl!
Зайди на Wasm.Ru и выбари на свой вкус.
* Origin : Life begins at 1000Mhz!
Ответ отправлен: 30.07.2004, 00:23
Отправитель: _vt
Отвечает Dragoon
Добрый день, shl!
Hex Workshop
Hex Desktop
HexMan
HexCalcul
Ответ отправлен: 02.08.2004, 19:39
Отправитель: Dragoon
Вопрос № 5662 |
Ваш Вопрос № 5658
Уважаемые эксперты!
Благодарю Вас за ответы на мой предыдущий вопрос:
>>Стал изучать рассылку "Учимся программировать на >>Ассемблере"
>>возник такой вопрос можно ли программировать на асме под >>DOS используя Win
>>или нужно обязательно ставить DOS?
>>компьютер Cel-1,7Ghz/256 RAM/Win2003
>>Заранее спасибо,
>>Алексей
решил покамест использовать Win,подскажите пожалуйста,какой компилятор и компоновщик лучше всего использовать,чтобы он корректно отрабатывал на Win,и компилил под DOS?
Вопрос отправлен: 30.07.2004, 10:31
Отправитель: alexey
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, alexey!
Я использую TASM 5.0 или 5.5 (для компиляции Windows приложений), однако это так исторически сложилось, мне он нравится больше, чем MASM. Другие ассемблеры (типа NASM) никогда не пробовал, поэтому ничего не могу о них сказать :(. И под Win98 и под Win2000 у меня все компилируется нормально.
St
Ответ отправлен: 30.07.2004, 12:19
Отправитель: St
Отвечает PavPS
Приветствую Вас, alexey!
Лично я пишу на MASM. Да все в общем-то корректны...
Ответ отправлен: 30.07.2004, 14:00
Отправитель: PavPS
Отвечает Dragoon
Доброе время суток, alexey!
MASM, FASM.
FASM - с виндовым интерфейсом.
Ответ отправлен: 02.08.2004, 19:40
Отправитель: Dragoon
Вопрос № 5663 |
Здравствуйте, уважаемые эксперты.
Скажите, пожалуйста, как получить результат функции API если он возвращается не в регистре процессора, а в стеке? Например функция RegOpenKey в eax возвращает результат успешности открытия ключа реестра, а хэндл открытого ключа возвращает в стеке.
Например вот такой участок кода:
...
.data
Key equ HKEY_CURRENT_USER
SubKey db "SoftwareMicrosoftWindows",0
...
.data?
KeyHandle dw ?
.code
start:
...
push KeyHandle
push offset SubKey
push Key
call RegOpenKey
Как получить KeyHandle чтобы, например, передать его в другую функцию в качестве параметра?
Вопрос отправлен: 30.07.2004, 11:47
Отправитель: V
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
phkResult
[out] Pointer to a variable that receives a handle to the opened key.
и это ты называешь стеком?!
;)
* EMan: -=- И легко перо, да на крышу не закинешь. =-=
Ответ отправлен: 31.07.2004, 17:20
Отправитель: Евгений Иванов
Отвечает St
Привет, V!
Почему вы решили, что handle возвращается в стеке? Он помещается функцией в буфер, АДРЕС которой в вашем сегменте данных (в данном примере) вы передаете в нее.
См Справку:
LONG RegOpenKey(
HKEY hKey, // handle of open key
LPCTSTR lpszSubKey, // address of name of subkey to open
PHKEY phkResult // address!!!!! of handle of open key
);
Ваша программа должна выглядеть приблизительно так (см Приложение, мои добавления в верхнем регистре, вы ведь пишете в Win32 ???)
St
Приложение:
Ответ отправлен: 30.07.2004, 12:13
Отправитель: St
Отвечает PavPS
Добрый день, V!
Какой ещё стек! Читай доку!
LONG RegOpenKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);
Parameters
hKey
[in] Handle to an open key. This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function, or it can be one of the following predefined keys:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows Me/98/95: This parameter can also be the following key:
HKEY_DYN_DATA
lpSubKey
[in] Pointer to a null-terminated string containing the name of the key to open. This key must be a subkey of the key identified by the hKey parameter. If this parameter is NULL or a pointer to an empty string, the function returns the same handle that was passed in.
For more information, see Registry Element Size Limits.
phkResult
[out] Pointer to a variable that receives a handle to the opened key. When you no longe r need the returned handle, call the RegCloseKey function to close it.
Return Values
If the function succeeds, the return value is ERROR_SUCCESS.
If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
Remarks
The RegOpenKey function uses the default security access mask to open a key. If opening the key requires a different access right, the function fails, returning ERROR_ACCESS_DENIED. An application should use the RegOpenKeyEx function to specify an access mask in this situation.
RegOpenKey does not create the specified key if the key does not exist in the database.
Windows Me/98/95: RegOpenKeyW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows Me/98/95 Systems.
< /b>
Ответ отправлен: 30.07.2004, 13:57
Отправитель: PavPS
Отвечает bocha
Приветствую Вас, V!
LONG RegOpenKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult//адрес результата
);
а в стеке она ничего не оставляет
Ответ отправлен: 30.07.2004, 20:51
Отправитель: bocha
Вопрос № 5665 |
Привет всем добрым Экспертам :))
Есть пару маленьких вопросиков по аптимизации.
Моно-ли патимизировать это: cmp buf,1 ?
Или это: mov buf,0 ?
И почему masm не принимает это: movzx eax,1 ?
Чё-то я разашёлся :) но всё-же спрошу ещё кой что.
Как по проще замутить, чтоб при конекте не ждал так долго ответа, а то аж более 30 сек ждёт.
Я могу решить эту проблему используя WSASetBlockingHookWSACancelBlockingCall, но хотел-бы узнать, что Вы можете предложить.
Огромное посиба заранее!
Вопрос отправлен: 30.07.2004, 19:22
Отправитель: Flashik
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
mov esi, offset buf
mov eax,1
cmp [esi],eax
;-----
movzx eax, al
movzx eax,ax
а числа нельзя (immediate).
Удачи!
* EMan: -=- И легко перо, да на крышу не закинешь. =-=
Ответ отправлен: 31.07.2004, 17:21
Отправитель: Евгений Иванов
Отвечает Dragoon
Добрый день, Flashik!
Можно:
1)
cmp buf,1
jz ...
=
dec buf
jz ...
2)
mov buf,0
=
sub buf,buf
Ответ отправлен: 02.08.2004, 19:43
Отправитель: Dragoon
Вопрос № 5666 |
Здраствуйте Эксперты!
Имеется диалоговое окно с edit-box'aми(superclassing).
1)Как вывести строку напротив эдитов?
2)Как можно получить значения из этих элитбоксов(т.е. нажал на кнопку и значения по очереди из каждого эдита беруться)
Приложение:
Вопрос отправлен: 31.07.2004, 07:53
Отправитель: hurer
[Следующий вопрос >>] [Список вопросов]
Отвечает bocha
Добрый день, hurer!
1)в статической надписи с помошью
BOOL SetDlgItemText( HWND hDlg,
int nIDDlgItem,
LPCTSTR lpString
);
2)UINT GetDlgItemText( HWND hDlg,
int nIDDlgItem,
LPTSTR lpString,
int nMaxCount
);
Ответ отправлен: 31.07.2004, 18:31
Отправитель: bocha
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (24) C / C++ (13) Perl (6) Builder / Delphi (18) Pascal (23) Basic / VBA (7) Java / JavaScript (6) PHP (17) Криптография (8) WinAPI (10) Радиоэлектроника (11) |
Пользователю Windows 95/98/Me (46) Windows NT/2000/XP (59) "Железо" (45) Поиск информации (16) |
Администратору Windows NT/2000/XP (35) Linux / Unix (21) |
Юристу Гражданское право (10) Семейное право (7) Трудовое право (9) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Адрес подписки |
Отписаться |
В избранное | ||