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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
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.


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

http://subscribe.ru/
http://subscribe.ru/feedback/
Адрес подписки
Отписаться

В избранное