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
станет
но это если не жалко значение в 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
заменил на
ошибка "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
А при таком объявлении ассемблер сам сможет определить размер операнда:
Машинный код по идее получится один и тот же.
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
Выглядит очень круто, но в С-- не работает Т_Т