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

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


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

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

Выпуск № 755
от 02.08.2004, 12:00

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


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

Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 133.36
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
Dragoon
Статус: Доверительный
Общий рейтинг: 109.56
[Подробней >>]
bocha
Статус: Опытный
Общий рейтинг: 132.92
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 118.2
[Подробней >>]
Стас
Статус: Опытный
Общий рейтинг: 124.63
[Подробней >>]
PavPS
Статус: Доверительный
Общий рейтинг: 126.31
[Подробней >>]
 
flasher
Статус: Доверительный
Общий рейтинг: 105.69
[Подробней >>]
Горячев Игорь
Статус: Доверительный
Общий рейтинг: 118.25
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 116.5
[Подробней >>]


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

Вопрос № 5644. Здравствуйте, уважаемые эксперты. Почему в MASM32 нельзя писать так: mov [eax], 1? Он выдает ошибку:... (ответов: 3)
Вопрос № 5645. Уважаемые эксперты, подскажите как к програме написаной на MASM32 написать и подключить то что назыв... (ответов: 2)
Вопрос № 5648. Здравствуйте !!! Небольшой вопрос Экспертам. У меня есть программа подсчитывающая количество нулей в... (ответов: 3)
Вопрос № 5649. Здравствуйте! Хочу написать плагин для TotalCommander где найти инфу о формате? Может примерчик?... (ответов: 2)
Вопрос № 5650. помогите пожалуста с написанием драйверов. любая информация от простой теории до практических приме... (ответов: 4)
Вопрос № 5652. Здравствуйте ! Вот решил изучать ассемблер на основе Вашей рассылки. Извиняюсь, что так много вопро... (ответов: 6)
Вопрос № 5653. Здрасте! У меня одна ламерская просьба, и одЫн маленький вопросик. 1) дайте плиз примерчик использов... (ответов: 1)
Вопрос № 5654. Привет. Как в IDA патчить программы? ... (ответов: 2)
Вопрос № 5656. Привет. Проблемы с MFC. Когда в скомпилированой программе нажимаю ENTER в EDITBOX то моя прога выход... (ответов: 2)

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


 Вопрос № 5644

Здравствуйте, уважаемые эксперты.
Почему в MASM32 нельзя писать так: mov [eax], 1? Он выдает ошибку: invalid instructions operand.
Приходится писать так:
mov a, eax
mov [a], 1



Вопрос отправлен: 27.07.2004, 11:40
Отправитель: andrey

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

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

можно так писать. попробуй:
mov [byte ptr EAX], 1
а вот если ты напишешь так, как написал во втором примере, то нифига у тебя не будет работать ;)
Бывай!
* EMan: -=- Любовь всегда неразделённая... =-=


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


Отвечает Dragoon

Добрый день, andrey!
Eax не может использоваться для доступа к памяти.
Используй ESI, EDI...


Ответ отправлен: 28.07.2004, 18:40
Отправитель: Dragoon


Отвечает bocha

Доброе время суток, andrey!
mov dword ptr[eax],1

Ответ отправлен: 27.07.2004, 12:31
Отправитель: bocha


 Вопрос № 5645

Уважаемые эксперты, подскажите как к
програме написаной на MASM32 написать и
подключить то что называется манифестом
чтобы она в WindowsXP использовала её
стили. Может где-то примеры есть.



Вопрос отправлен: 27.07.2004, 15:43
Отправитель: Kostik (mks@norcom.ru)

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

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

Добрый день, Kostik!
Сейчас тебе Боб скажет ;)
* EMan: -=- Любовь всегда неразделённая... =-=


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


Отвечает _vt

Здравствуйте, Kostik!
Необходимо слинковать с программой comctl32.lib, в самой программе вызвать функцию InitCommonControls, и слинковать с программой файл манифеста. Пример есть на сайте Боба Джонсона.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 28.07.2004, 20:43
Отправитель: _vt


 Вопрос № 5648

Здравствуйте !!! Небольшой вопрос Экспертам. У меня есть программа подсчитывающая количество нулей в массиве:
cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
begin:
xor ax,ax
xor si,si
mov cx,len
looper:
cmp [si],0
jne scok
inc sum
scok:
inc si
loop looper
int 20h
sum db 0
len equ 10
arrays db 1,4,3,0,0,1,2,8,9,0
cseg ends
end begin
Впрос такой. Как мне вывести результат (sum) на экран.Пробовал mov ah,9 lea dx,sum int 21h.
Но получается олная фигня, хотя и добавлял в конец sum $. В ассемблере я новичок - просьба
не ругаться за глупые ошибки.
Mikl mikl09@samtel.ru



Вопрос отправлен: 27.07.2004, 20:44
Отправитель: Mikl (mikl09@samtel.ru)

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

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

Здравствуйте, Mikl!
Сходи на сайт Калайджана.
* EMan: -=- Любовь всегда неразделённая... =-=


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


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

Доброе время суток, Mikl!
Ну и в каком же массиве ты считаешь нули?
Вместо xor si,si поставь lea si,arrays.
xor ax,ax вообще лишнее.
А насчет вывода на экран числа посмотри рассылку, вопрос неоднократно поднимался, надоело уже отвечать.
(коротко: в sum лежит число, а на экран нужно выводить последовательность символов)

Ответ отправлен: 27.07.2004, 23:22
Отправитель: Стас


Отвечает PavPS

Добрый день, Mikl!
Непонятно как ты читаешь по адресу обнуленного SI, ну да ладно: для решения Твоей задачи нужно написать маленькую прогу, которая будетт переводить число в строку путем, например, div операций. Если надо, то могу скинуть прогу, в котрой есть такая процедура. IF надо, то пиши сюда: PavPS@List.ru

Ответ отправлен: 28.07.2004, 22:59
Отправитель: PavPS


 Вопрос № 5649

Здравствуйте!
Хочу написать плагин для TotalCommander где найти инфу о формате? Может примерчик?



Вопрос отправлен: 27.07.2004, 23:24
Отправитель: НС

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

Отвечает _vt

Добрый день, НС!
У Total Commander-а есть две разновидности плагинов - плагины для Lister-а (LS-Plugins) и плагины файловых систем (FS-Plugins). Примеры можно скачать с wincmd.ru - там море плагинов и среди них есть плагины с исходниками.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 28.07.2004, 20:44
Отправитель: _vt


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

Доброе время суток, НС!
Ищи на их сайте SDK для плагинов.
* EMan: -=- Любовь всегда неразделённая... =-=


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


 Вопрос № 5650

помогите пожалуста с написанием драйверов. любая информация от простой теории до практических примеров пойдет на пользу



Вопрос отправлен: 27.07.2004, 23:40
Отправитель: alexx (kjop@fromru.com)

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

Отвечает Dragoon

Добрый день, alexx!
А исходники DirectX тебе не надо?
'Простой' теории в написании драйверов просто
не существует! Зачем тебе это?!

Ответ отправлен: 28.07.2004, 18:42
Отправитель: Dragoon


Отвечает flasher

Приветствую Вас, alexx!
http://www.wasm.ru/article.php?article=1003001

Ответ отправлен: 28.07.2004, 12:15
Отправитель: flasher


Отвечает PavPS

Доброе время суток, alexx!
http://www.wasm.ru/article.php?article=drvw2k01
Это только начало, а так читай все его статьи - я сам по ним до сих поручусь - зашибенная вешь!!!

Ответ отправлен: 28.07.2004, 23:00
Отправитель: PavPS


Отвечает Горячев Игорь

Здравствуйте, alexx!
Зайди на сайт http://wasm.ru. Там есть хорошие уроки и статьи.

Ответ отправлен: 28.07.2004, 00:03
Отправитель: Горячев Игорь


 Вопрос № 5652

Здравствуйте !
Вот решил изучать ассемблер на основе Вашей рассылки.
Извиняюсь, что так много вопросов, но просто что ни начнешь делать постоянно возникают у меня эти вопросы.
1. Захотелось сделать что-нибудь свое, в частности игру "Змейка" (змей ползает, ест что-то и растет).
Так вот, скажите пожалуйста какая функция (досовская) и какое прерывание выводит точку (в графическом режиме) на экран.
Я пробовал вот так и ничего почему-то не получилось:
mov ah,0Ch - ф-ция вывода точки
mov al,1 - цвет точки (зеленый)
mov bh,0 - видео страничка
mov cx,10 - х-координата
mov dx,10 - у-координата
int 10h - вывод точки на экран
Может нужно принудительно показывать ассемблеру, что видео страничка начинается здесь:
mov ax,0B800h (0A000h)
mov es,ax
.. и уж потом выводить точку
2. Вот такой вопрос: Как в цикле сделать проверку нажатия на какую-либо клавишу без остановки цикла, вот пример:
Cikl:
inc cx
mov ah,10h - вот здесь он (цикл) постоянно будет
int 16h останавливался. А как сделать так чтобы он
cmp al,27 клаву постоянно "опрашивал" (ждал нажатия
je Exit клавиши и если я нажму ESC выходил).
jmp Cikl
Exit:
int 20h
3. А в ассемблере что ли нет команд как в Бэйсике типа Sin, Cos, хотелось бы какую-нибудь простенькую
демку сделать, а кроме +, -, *, / ничего нету. Неужели самому выдумывать формулу синуса?
4. Вот еще есть такая глючная тема - стек (аж страшно спрашивать, так все запутанно). Не плохая весчь, только устроен как-то неправильно. Почему он постоянно сдвигается "вверх" при вытаскивании чисел?
Можно ли вытащить число из стека, но при этом чтобы оно там осталось (не занося обратно его pushем), как бы скопировать число из стека?
И как доставать произвольно числа из стека?
Пример:
mov ax,5
mov bx,10
mov cx,15
push ax
push bx
push cx
вот теперь хотелось бы вернуть 5 в ах, не трогая 15 и 10 (как-бы перепрыгнуть 15 и 10).
Может надо писать как-то так:
pop ax+4
Или по-любому надо сначала вытащить 15, 10 а потом только 5.
Нет ли аналога рор только не сдвигая стек "вверх"? А то если я произвольно вытащу например 10 то 5 поднимется вверх (было 15,10,5 стало 15,5), вот как бы эту 5 оставить на своем же третьем месте (чтобы было 15,0,5) или чтобы 10 вытащилась, но в стеке осталась на своем же месте 15,10,5 (просто скопировалась в регистр)).
И еще, можно ли записывать в стек в произвольном порядке, например я вытащил 10 не сдвинув стек, теперь у меня
в стеке 15, 0, 5 (или 15,10,5 если предпочел 10 оставить на своем месте), можно мне теперь записать между 15 и 5 другое число, пример:
...
mov dx,20
push dx+2 или как-то по-другому?
и теперь в стеке наверное 15,20,5.
Вот пока что все, если нетрудно большое плиз ответьте на все вопры !!!
С уважением А.Д.



Вопрос отправлен: 28.07.2004, 12:47
Отправитель: Данат

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

Отвечает bocha

Добрый день, Данат!
1.
push 0a000h
pop es
2.ф-я 06 int 21h-вод без ожидания
3.мучай сопроцессор
4. mov ax, [sp+04]и все останется на своих местах

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


Отвечает Горячев Игорь

Приветствую Вас, Данат!
3. Тут надо либо придумавать "свою" формулу (точнее использовать уже известную) либо использовать сопроцессор. Там они есть!
4. Стек - область памяти, но специфическая! и это важно т.к. сним можно очень легко работать как с областью памяти для изъятия значений.
mov ax,5
mov bx,10
mov cx,15
push ax
push bx
push cx
mov ax,sp ; в ax адрес вершины стека
sub ax,4 ;
mov bx,[ax] ; в bx теперь лежит 5
Вставить другое число между уже лежащими в стеке уже никак низя (произвольно писать в стек низя). И переписать содержимое стека тоже низя!


Ответ отправлен: 28.07.2004, 23:09
Отправитель: Горячев Игорь


Отвечает Ayl

Добрый день, Данат!
1. Рисовать точки через BIOS - это ужасно! Все будет работать очень медленно! Надо рисовать напрямую в видеопамять. А так, в принципе, правильно написано. Не знаю, почему не работает. Пришли полный текст. Может, ты режим не установил?

2. Функции 01h и 11h прерывания 16h возвращают в регистрах AH и AL скен-код нажатой клавиши и ASCII-код (либо 0 для расширенных кодов) соответственно, а также устанавливают флаг ZF в случае, если есть нажатая клавиша. Если же флаг ZF сброшен, то в текущее время нет доступных клавиш. Проверка должна выглядить как-нибудь так:

@@Wait_Key:
mov ah, 1
int 16h
jnz @@Get_Key

call do_Something
jmp short @@Wait_Key

@@Get_Key:
xor ax, ax
int 16h
...

3. Синусы, косинусы и т.п. можно считать с помощью команд сопроцессора. Либо по таблицам (чаще это будет гораздо быстрее, чем через сопроцессор).

4. Ничего в стеке неправильного или глючного нету. А устроен он элементарно - типа магазина (для стрелкового оружия). Первый пришел - последний ушел - вот его характеристика.
А по поводу того, что стек сдвигается вверх - это немного неточная терминология. На самом деле при работе со стеком требуется только одно понятие - вершина стека. Обычно это указатель на ячейку памяти, в которой находится последнее занесенное значение. При добавлении нового элемента указатель сначала сдвигается так, чтобы указывать на пустую ячейку, а затем в эту ячейку заносится значение элемента. При выборке происходит все в точности до наоборот - выбирается элемент и затем указатель сдвигается к следующему.
Так уж повелось, что при аппаратной реализации стека на процессорах x86 стек "растет вниз", т.е. при добавлении элемента указатель стека УМЕНЬШАЕТСЯ, а при извлечении УВЕЛИЧИВАЕТСЯ на размер элемента стека (обычно слово процессора).
Для извлечения верхнего значения из стека без изменения самого стека можно использовать следующий код:
mov bp, sp
mov ax, [bp]

но это дольше, чем pop ax; push ax и места в программе занимает больше на 2 байта.
В твоем примере 5 и так уже находится в регистре ax и никуда не девается после выполнения команды push ax. А доступ к 3-ему элементу стека можно получить так:
mov bp, sp
mov ax, [bp + 4]

Аналога pop без сдвига и из середины нет. Надо извращаться. Например, так:
push 5
push 10
push 15 ; стек: 15, 10, 5
mov bp, sp
mov ax, [bp + 2] ; стек: 15, 10, 5; ax = 10
mov word ptr [bp + 2], 20 ; стек: 15, 20, 5


Ответ отправлен: 28.07.2004, 15:22
Отправитель: Ayl


Отвечает Dragoon

Здравствуйте, Данат!
1) 1 - синий, а не зеленый
Такая запись у меня работает нормально
2)
Есть функция, проверяющяя буфер, и ТОЛЬКО ЕСЛИ
там есть код, помещяет его в ax
Int 16h
Ждет:AH 01H
Возвращает: ZF ZR = no keys in buffer
NZ = key is ready
AH (if ZR) scan code
AL (if ZR) ASCII character code or extended ASCII keystroke
3)Функции Sin,Cos не в языках программирования, а
в сопроцессоре(Floating Point Unit). Поищи документацию.
Например 'команды FPU';
А где ты в ассемблере нашел знаки '+,-,*'? Насколько я понимаю,
это псевдкоманды, не умеющие работать ни с регистрами,
ни с памятью.
Использую Add,Sub,Mul,Div....
4) Регистр SP - Stack Pointer.
Как следует из названия, указывает на вершину стека, т.е.
на адрес в памяти, где находится посл. число.
А система не глючная, а очень даже правильная, сначала раобраться непросто, но потом...


Ответ отправлен: 28.07.2004, 18:53
Отправитель: Dragoon


Отвечает PavPS

Приветствую Вас, Данат!
Вопросы №1,2 - это просто найди справочник по прерываниям - там всё есть - читай.
№3: Читай про сопроцессор - там есть синус; А формулу выдумывать нечего - это степенной ряд - а вот как в степень - думай...
№4: раз уж так глухо, то возьми какую - то книжку и читай - быстро не вдолбишь - с этим надо жить...

Ответ отправлен: 28.07.2004, 23:00
Отправитель: PavPS


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

1. а ты установил графический видеорежим?
2. sub ax, ax
int 22
3. есть команды математического процессора.
FSIN, FCOS.
4. стек - очень простая вещь.
он расположен в любом месте памяти.
работать с ним можно через переключатель сегмента SS и указатель стека ESP.
Также есть регистр EBP. его удобно использовать для доступа к стеку.
mov ax,5
mov bx,10
mov cx,15
push ax
push bx
push cx
mov bp,sp ;BP указывает на CX (15)
mov dx, [bp+2+2] - в DX есть 5
mov [bp+2],46 - на место BX (10) записали 46.
усё просто
Бывай.



* EMan: -=- Любовь всегда неразделённая... =-=


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


 Вопрос № 5653

Здрасте!
У меня одна ламерская просьба, и одЫн маленький вопросик.
1) дайте плиз примерчик использования NetSessionEnum.
2) моно-ли на удалённом компе замутить FindFirstFileFindNextFile в разшаренных папках?



Вопрос отправлен: 28.07.2004, 13:25
Отправитель: Flashik

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

Отвечает _vt

Доброе время суток, Flashik!
2) А почему нет? Этим функциям всё равно, локальные папки, или сетевые.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 28.07.2004, 20:45
Отправитель: _vt


 Вопрос № 5654

Привет. Как в IDA патчить программы?



Вопрос отправлен: 28.07.2004, 16:23
Отправитель: freestyle

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

Отвечает PavPS

Добрый день, freestyle!
В IDA код изучают и осмысляют, а падчить лучше в Hiew.

Ответ отправлен: 28.07.2004, 23:01
Отправитель: PavPS


Отвечает Dragoon

Добрый день, freestyle!
Читай Help, там все объяснено. Или, как вариант -
книгу Криса Касперски(кстати, никакой он не Касперски,
а очень даже наш парень) 'Образ мышления IDA'. Она
на русском, валяется на wasm.ru

Ответ отправлен: 28.07.2004, 18:55
Отправитель: Dragoon


 Вопрос № 5656

Привет.
Проблемы с MFC.
Когда в скомпилированой программе нажимаю ENTER в EDITBOX то моя прога выходит. Как мона исправить?



Вопрос отправлен: 29.07.2004, 11:57
Отправитель: Евгений

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

Отвечает bocha

Доброе время суток, Евгений!
в диалоге надо нажимать еще и ctrl, что бы кнопка по умолчанию отдыхала

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


Отвечает Горячев Игорь

Добрый день, Евгений!
Проблема не в MFC, а в днк! Надо внимательно посмотреть код, что ты наваял, т.к.:
1. MFC - библиотека классов для VC++, а EditBox лежит в системных библиотеках винды! Интересно как ты в асме использовал MFC?
2. Скорее всего по нажатию enter'a ты обрабатываешь какое либо событие (читай: делаешь действие). Вот там и ищи ошибку!
3. Возможно по нажатию enter'a ты пытаешься перейти на новую строку для ввода текста. Ты не забыл сделать EditBox многострочным?
4. В винде бывают глюки :)

Ответ отправлен: 29.07.2004, 23:12
Отправитель: Горячев Игорь



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

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

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (24)
C / C++ (12)
Perl (6)
Builder / Delphi (18)
Pascal (23)
Basic / VBA (8)
Java / JavaScript (7)
PHP (16)
Криптография (8)
WinAPI (10)
Радиоэлектроника (12)
Пользователю
Windows 95/98/Me (47)
Windows NT/2000/XP (60)
"Железо" (47)
Поиск информации (15)
Администратору
Windows NT/2000/XP (35)
Linux / Unix (20)
Юристу
Гражданское право (11)
Семейное право (8)
Трудовое право (9)
КоАП (7)

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




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


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

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

В избранное