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

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 666
от 26.01.2007, 02:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 367, Экспертов: 34
В номере:Вопросов: 3, Ответов: 5


Вопрос № 71774: Здравствуйте!По мотивам тамы резидентов попробовал напипсать следю код. НО он не работает :(. объясните пожалуйста где ошибка...
Вопрос № 71842: Здраствуйте, уважаемые эксперты! У меня вопрос по ассемблеру в частности по WinAPI. 1. Как вывести системное время прямо в окно программы(если можно подробно) 2. Можно ли на ассемблере с помощью WinAPI создавать такие формы как Label в De...
Вопрос № 71891: Здрасвуйте! Скажите как проверить чётное число или нет?!!...

Вопрос № 71.774
Здравствуйте!По мотивам тамы резидентов попробовал напипсать следю код. НО он не работает :(. объясните пожалуйста где ошибка

Приложение:

Отправлен: 20.01.2007, 09:20
Вопрос задал: ATZATZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, ATZATZ!

А что именно вы хотите получить? Искажение регистров вы получили, это точно, поэтому наверное, система и зависает. Сохраняйте все регистры через PUSHA.

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +78313145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214889076
----
Ответ отправлен: 20.01.2007, 15:58

Отвечает: Стас
Здравствуйте, ATZATZ!

1) Получается что вы запретили все 21 функции кроме 9, и ту подменили... Честно говоря не знаю как поведет себя система, но наверняка это будет похоже на зависание, ведь даже выход из проги (ah=4ch) не сработает и прога вылетит с ошибкой.

2) Вызов call dword ptr cs:[vect_21h] не корректен. Вот представте что должно произойти:
вы делаете длинный call, в стек идут (ДВА!!!) регистры CS:IP дальше начинает работать int21, по окончании в нем стоит iret который извлекает из стека ТРИ!!! регистра CS:IP:флаги. Ошибка. Правильно pushf:call dword...
Тут надо заметить что выходить из своей обработки следует сохраним флаги которые вам дала int21, а то программы не получат сообщения об ошибках (CF) или получат ложные сообщения об ошибках.

3) jmp dword ptr cs:[vect_21h] КРАЙНЕ не корректен так как у текущей проги по этому адресу ничего нет. Адрес int21 остался в резиденте.
4) может еще чтото я пропустил, смотрите...

Приложение:

Ответ отправил: Стас (статус: Специалист)
Ответ отправлен: 21.01.2007, 03:33
Оценка за ответ: 5
Комментарий оценки:
Спасибо Стас!Особенно за pushf/iret!


Вопрос № 71.842
Здраствуйте, уважаемые эксперты!
У меня вопрос по ассемблеру в частности по WinAPI.
1. Как вывести системное время прямо в окно программы(если можно подробно)
2. Можно ли на ассемблере с помощью WinAPI создавать такие формы как Label в Delphi (очень удобно им пользоваться в Delphi).
С глубоким уважением Stalker.
Отправлен: 20.01.2007, 18:13
Вопрос задал: Stalker-vir (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Stalker-vir!

По таймеру берёшь время и выводишь.

;---------------------
MsgTimer:
cmp [wparam],MyTimer1
jnz @@exit1

sub edi,edi ;=FALSE
mov esi,[Skin]
call SetState,ebx
or edi,eax
Call GetLocalTime,ofs newTime
call PrintTime,[hDCMain],edi
;add
jmp @@exit0
;--------------------------------------------------------------
; Выводит в DC текущее время
; IN -> hdc - DC для вывода
; fPaint = FALSE - не перерисовывать, если нет изменений
; = TRUE - перерисовывать всё
;
proc PrintTime
ARG hDC:dword,fPaint:dword
USES esi,edi,ebx
mov esi,[Skin]
mov edi,ofs tCrdOut0

sub eax,eax
mov ebx,eax
mov ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0+size SYSTEMTIME).wHour]
cmp [fPaint],0
jnz @@m1
cmp ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0).wHour]
jz @@m2
@m1:
cmp [Ini.f12or24],FALSE
jnz @@m1_0
cmp al,13
jc @@m1_0
sub al,12
@m1_0:
mov bl,10
div bl
mov ebx,eax
sub ah,ah

cmp [ww edi],-1
jz @@m1_1
Call BitBlt,[hDC],[ww edi],0,[(t skin esi).NumbersDX],[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+eax*4],0,SRCCOPY
@m1_1:
shr ebx,8
Call BitBlt,[hDC],[ww edi+4],0,[(t skin esi).NumbersDX],[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+ebx*4],0,SRCCOPY
@m2:
cmp [fPaint],0
jz @@m3
Call BitBlt,[hDC],[ww edi+2*4],0,[(t skin esi).StepTimeDX],
[(t skin esi).Height],[(t skin esi).create.hDC],
[(t skin esi).StepTimeX],0,SRCCOPY
@m3:
sub eax,eax
mov ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0+size SYSTEMTIME).wMinute]
cmp [fPaint],0
jnz @@m4
cmp ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0).wMinute]
jz @@m5
@m4:
mov bl,10
div bl
mov ebx,eax
cmp [fPaint],0
jnz @@m4_1
cmp al,[b edi+LenCrdOut0+LenCrdIn0+(size SYSTEMTIME)*2]
jz @@m4_0
@m4_1:
mov [b edi+LenCrdOut0+LenCrdIn0+(size SYSTEMTIME)*2],al
sub ah,ah
Call BitBlt,[hDC],[ww edi+3*4],0,[(t skin esi).NumbersDX],
[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+eax*4],0,SRCCOPY
@m4_0:
shr ebx,8
Call BitBlt,[hDC],[ww edi+4*4],0,[(t skin esi).NumbersDX],
[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+ebx*4],0,SRCCOPY
@m5:
cmp [fPaint],0
jz @@m6
Call BitBlt,[hDC],[ww edi+5*4],0,[(t skin esi).StepTimeDX],
[(t skin esi).Height],[(t skin esi).create.hDC],
[(t skin esi).StepTimeX],0,SRCCOPY
@m6:
sub eax,eax
mov ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0+size SYSTEMTIME).wSecond]
cmp [fPaint],0
jnz @@m7
cmp ax,[(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0).wSecond]
jz @@m8
@m7:
mov bl,10
div bl
mov ebx,eax
cmp [fPaint],0
jnz @@m7_1
cmp al,[b edi+LenCrdOut0+LenCrdIn0+(size SYSTEMTIME)*2+1]
jz @@m7_0
@m7_1:
mov [b edi+LenCrdOut0+LenCrdIn0+(size SYSTEMTIME)*2+1],al
sub ah,ah
Call BitBlt,[hDC],[ww edi+6*4],0,[(t skin esi).NumbersDX],
[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+eax*4],0,SRCCOPY
@m7_0:
shr ebx,8
Call BitBlt,[hDC],[ww edi+7*4],0,[(t skin esi).NumbersDX],
[(t skin esi).Height],
[(t skin esi).create.hDC],[ww edi+LenCrdOut0+ebx*4],0,SRCCOPY
@m8:
cmp [Ini.f12or24],FALSE
jnz @@m9
cmp [fPaint],0
jz @@m9
mov eax,[(t skin esi).AfterMorningX]
cmp [(t SYSTEMTIME edi+LenCrdOut0+LenCrdIn0+size SYSTEMTIME).wHour],12
jc @@m1_2
mov eax,[(t skin esi).PastMorningX]
@m1_2:
Call BitBlt,[hDC],[ww edi+8*4],0,[(t skin esi).MorningDX],
[(t skin esi).Height],[(t skin esi).create.hDC],
eax,0,SRCCOPY
@m9:
@exit:
mov esi,ofs newTime
mov edi,ofs time
sub ecx,ecx
mov cl,size SYSTEMTIME
rep movsb
ret
endp

LenCrdIn0 = 10*4
time SYSTEMTIME ?
newTime SYSTEMTIME ?


---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +78313145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214889076
----
Ответ отправлен: 20.01.2007, 19:41

Отвечает: QDSota
Здравствуйте, Stalker-vir!

2) В ассемблере есть стандартный класс STATIC - аналог label.

Создать текст:

invoke CreateWindowEx,0,ADDR LabelClass,ADDR Caption,WS_CHILD+WS_VISIBLE,x,y,width,height,hwnd,hCode,hInstance,NULL
...
LabelClass db "Static",0
Caption db "Заголовок вашего окна",0
hwnd dd HWND_окна_куда_ставиться_текст
hCode dd КОД_передаваемый_материнскому_окну_для_обработки_событий

---------
Открыть глаза навстречу солнцу
Ответ отправил: QDSota (статус: Профессионал)
Россия, Зеленоград
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 23.01.2007, 09:35


Вопрос № 71.891
Здрасвуйте!
Скажите как проверить чётное число или нет?!!
Отправлен: 21.01.2007, 01:54
Вопрос задал: chikanok (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, chikanok!

Проверяй нулевой бит.

test ax, 1
jz чётное

успехов.
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +78313145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214889076
----
Ответ отправлен: 21.01.2007, 01:59


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.42 beta от 25.01.2007
Яндекс Rambler's Top100

В избранное