Page 34 of 77

Re: Помогите новичку

Posted: Wed May 30, 2012 2:54 pm
by Gluk
ну lea может немножко помочь, и

Code: Select all

mov ecx, eax
shr ecx, 16
add ecx, 216
станет

Code: Select all

shr eax, 16
lea ecx, [eax+216]
но это если не жалко значение в eax

SysFn18.10

Posted: Fri Jun 08, 2012 11:15 pm
by 0CodErr
В Wiki написано, что функция 18.10 сворачивает собственное окно.
Но у меня почему-то сворачивается именно активное окно(это не обязательно собственное).
Я пробовал это в сборках svn2696-img и в 0.7.7.0.
Но скриншотер как-то ведь работает!? Судя по исходнику он тоже использует функцию 18.10.

Code: Select all

macro min_window
{
        mov     eax,18
        mov     ebx,10
        mcall
}
Как вообще такое может быть?

Если скомпилировать приведённый ниже код и запустить полученную программу, то она свернёт запускающее её приложение(например Eolite или Run):

Code: Select all

ORG 0
BITS 32
MENUET01            db 'MENUET01'
version             dd 1
program.start       dd start_
program.end         dd end_
program.memory      dd end_ + 256
program.stack       dd end_ + 256
program.params      dd 0
program.path        dd 0
start_:

	mov eax, 18
	mov ebx, 10
	int 64		


	or eax, -1
	int 64

end_:
Хотя тут и не создаётся окно, но всё равно, чужое окно ведь не должно было сворачиваться?
И с окном у меня такая же ситуация.

Я сперва было подумал, что каким-то образом могла вызываться 18.22 вместо 18.10, но как тогда в регистры попали нужные параметры?

Re: Помогите новичку

Posted: Sat Jun 09, 2012 10:56 am
by art_zh
18.10 предполагает, что у активного приложения и окно - активное.
Его и сворачивают.
Но если у приложения нет своего окна - тогда сворачивается чужое...

А у скриншотера-таки есть своё собственное окно, в котором задаются все нужные настройки. Программе нужно свернуть свое окно, чтобы прочитать то, что "под ним". Так что здесь все работает правильно.

Re: Помогите новичку

Posted: Sat Jun 09, 2012 4:32 pm
by 0CodErr
art_zh, спасибо за разъяснение.
Меня сбило с толку "собственное окно".
В Wiki не сказано, что оно должно быть активным.

Тогда, чтобы свернуть не обязательно активное, но именно своё окно можно использовать
18.22 или можно сначала активизировать своё окно с помощью 18.3, а потом свернуть с помощью 18.10.

Я просто тоже делал свой скриншотер и хотел прикрутить к нему клавишу PrintScreen.
Вот здесь я приводил скриншот своего скриншотера viewtopic.php?p=39839#p39839
Теперь он уже почти готов.

Re: Помогите новичку

Posted: Tue Jun 12, 2012 2:49 pm
by 0CodErr
А ведь может так получиться, что после вызова 18.3 произойдёт переключение на другой поток,
который тоже захочет активизировать какое-либо другое окно?
Тогда, после вызова 18.10, скорее всего, это другое окно и будет минимизировано.
А, значит, чтобы гарантированно свернуть своё окно надо использовать 18.22, верно?

Re: Помогите новичку

Posted: Wed Jun 13, 2012 3:47 pm
by Leency
Я хочу проверить не равнали строка 0.

В программе уже есть:
cmp [params],byte 0

Я пишу:
cmp [params],0

Выдаёт ошибку. Хотя в docpack такая строка есть и работает нормально.

Re: Помогите новичку

Posted: Wed Jun 13, 2012 3:56 pm
by SoUrcerer
Что-то не очень ясно, Leency.
У меня программа

Code: Select all

label:
cmp [params], 0
jz label
params db 0
отлично собирается с помощью fasm. Так что поясни, что за ошибка и где.

Re: Помогите новичку

Posted: Wed Jun 13, 2012 4:12 pm
by Leency
downloader

Code: Select all

align 4
params:		; db 4096 dup(0)
	rb 4096
446 строка

Code: Select all

; if called from command line, then exit
	cmp	[params],byte 0
заменил на

Code: Select all

cmp	[params],0
ошибка "error: operand size not specified". Замел на

Code: Select all

	;cmp	[params],byte 0
    mov        esi,params
    cmp        dword[esi],0
Работает.

Но тут ошибка у меня где-то в HTMLv... сейчас разбираюсь.

Re: Помогите новичку

Posted: Wed Jun 13, 2012 7:15 pm
by Insolor
При таком объявлении fasm не может определить, какого размера "единица" данных, расположенных по метке params, поэтому размер операнда нужно указывать явно:

Code: Select all

params:
    rb 4096
    ...
    cmp byte[params],0
А при таком объявлении ассемблер сам сможет определить размер операнда:

Code: Select all

params rb 4096
...
cmp   [params],0
Машинный код по идее получится один и тот же.

Re: Помогите новичку

Posted: Fri Jun 29, 2012 4:10 pm
by Leency
Есть такая штука:

Code: Select all

struct path_string {
char Item[4096];
};

path_string history_list[40];
sizeof(history_list) возвращает не 40, а 40*4096, можно ли узнать длинну исключительно history_list, то есть получить число 40?

Re: Помогите новичку

Posted: Fri Jun 29, 2012 4:18 pm
by 0CodErr
Leency wrote:sizeof(history_list) возвращает не 40, а 40*4096...
Но ведь это и есть размер history_list в байтах. SizeOf его и возвращает.

Re: Помогите новичку

Posted: Fri Jun 29, 2012 4:26 pm
by dunkaist

Code: Select all

sizeof(history_list)/sizeof(*history_list)
Может, красивее можно.

Re: Помогите новичку

Posted: Fri Jun 29, 2012 4:40 pm
by Leency
Всем спасибо.
sizeof(history_list)/sizeof(*history_list) - ругается. наверно с-- это не умеет
sizeof(history_list)/sizeof(path_string) - работает

Re: Помогите новичку

Posted: Fri Jun 29, 2012 5:26 pm
by Nable
в никсовых прогах пишут обычно sizeof(history_list)/sizeof(history_list[0]) , точнее, используют ARRAY_SIZE, который сделан либо через макрос, либо в компилятор встроен.

Code: Select all

#define ARRAY_SIZE(array) ((sizeof(array) / sizeof(array[0])))
http://lxr.free-electrons.com/source/in ... rnel.h#L45

Re: Помогите новичку

Posted: Fri Jun 29, 2012 6:04 pm
by Leency
Выглядит очень круто, но в С-- не работает Т_Т