Page 74 of 77

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

Posted: Mon Jan 29, 2018 1:39 am
by barbar89
Походу команда movzx как то не так работает как я ожидал, после того как заменил
movzx ebx, [iter]
на
mov ebx, dword[iter]
заработало правильно.

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

Posted: Mon Jan 29, 2018 1:47 am
by theonlymirage
barbar89
; рядом message я написал iter db 1
Замени размер самой переменной iter.
Если ты её значение кладёшь в регистр eax или ebx, то она явно не байт db, а dd (4 байта). Иначе мусор может попасть или ещё что.


UPDATE
Ты делаешь явно что-то не то =)
movzx дополняет значение нулями до нужной разрядной сетки, в твоём случае с

Code: Select all

iter: db 0
было бы правильнее заменить следующую строчку:

Code: Select all

movzx ebx, [iter]
на

Code: Select all

movzx ebx, byte[iter] ;в других ассемблерах byte ptr[iter] 
Либо как я отметил выше изменить iter dd 0 и писать как ты сделал.

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

Posted: Mon Jan 29, 2018 2:18 am
by barbar89
С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.

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

Posted: Mon Jan 29, 2018 2:37 am
by theonlymirage
barbar89 wrote:С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.
Да, всё правильно размер dd 4 байта, dq 8 байт. Это я перепутал.
P.S. Исправил в посте выше.

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

Posted: Wed Jan 31, 2018 5:01 am
by barbar89
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.

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

Posted: Wed Jan 31, 2018 5:26 am
by theonlymirage
barbar89 wrote:Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
Сдвигами =) Смотри например shl, shr и примеры в SVN.
Одно значение из младших разрядов берёшь сразу из регистра ax, а второе сдвигом.

Примерно так:

Code: Select all

mov ebx, 0
mov bx, ax ;теперь y в ebx 
shr eax, 16 ;теперь x в eax
Если ты хочешь оставить в eax только y, то вот так:

Code: Select all

shl eax, 16
shr eax, 16

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

Posted: Wed Jan 31, 2018 10:33 pm
by 0CodErr
barbar89 wrote:Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
Как было уже не раз сказано, наша документация оставляет желать лучшего.
Вот это eax = x*65536 + y следует читать как старшее слово регистра eax содержит x, а младшее содержит y.
theonlymirage wrote:Если ты хочешь оставить в eax только y, то вот так:
Код:

shl eax, 16
shr eax, 16
а если хочешь сделать меньше лишних действий, то

Code: Select all

and eax, 0x0000ffff

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

Posted: Tue Mar 06, 2018 6:17 pm
by 0CodErr
Я тут вспомнил просто в связи с предыдущим вопросом http://board.kolibrios.org/viewtopic.php?p=69830#p69830
Есть у нас ещё такая функция
======================================================================
============ Функция 35 - прочитать цвет точки на экране. ============
======================================================================
Параметры:
* eax = 35
* ebx = y*xsize+x, где
* (x,y) = координаты точки (считая от 0)
* xsize = размер экрана по горизонтали
конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
Но не в этом дело :)
Товарищ barbar89 спрашивал
barbar89 wrote:как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
Ну, собственно, как раз с помощью деления на этот самый xsize с помощью инструкции div, после деления искомые значения(x и y) будут содержаться в регистрах eax и edx.

Вот как ядро это делает(из kernel.asm http://websvn.kolibrios.org/filedetails ... #line-5217)
syscall_getpixel: ; GetPixel
mov ecx, [_display.width]
xor edx, edx
mov eax, ebx
div ecx
mov ebx, edx
xchg eax, ebx
and ecx, 0xFBFFFFFF ;negate 0x04000000 use mouseunder area
call dword [GETPIXEL]; eax - x, ebx - y
mov [esp + 32], ecx
ret

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

Posted: Tue Mar 06, 2018 6:29 pm
by Leency
конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
Хм, а много программ нужно переписывать?

Я думаю это можно пофиксить в ядре и я бы мог пофиксить в программах.

Возможно это что-то легаси из Менуэта.

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

Posted: Tue Mar 06, 2018 8:46 pm
by 0CodErr
Leency wrote:Я думаю это можно пофиксить в ядре и я бы мог пофиксить в программах.
Leency, вообще это обсуждалось SysFn35:GetPixel http://board.kolibrios.org/viewtopic.php?f=1&t=3403
Да ты и сам отметился в той теме :)
Пришли к выводу, что не нужно.

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

Posted: Wed Jun 06, 2018 5:19 pm
by floppy121
4 способа выделения массива (ответ JohnXenox скопированный из чата) :

Code: Select all

1) my_array: rb 16 ; выделит массив, размером в 16 байт заполненный нулями
2) my_array: db 5 dup (1,2) ; выделит массив из 5-ти пар чисел - 1,2,1,2,1,2,1,2,1,2
3) my_array: times 5 db 1,2 ; выделит массив из 5-ти пар чисел - 1,2,1,2,1,2,1,2,1,2
4) my_array: repeat 5 ; выделит массив, размером в 5 байт заполненный единицами.
db 1
end repeat 
Сейчас использую " my_array db 16 dup(0) "

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

Posted: Wed Jun 06, 2018 11:45 pm
by GerdtR
Пустые массивы(которые просто забиты нулями) лучше складывай в конце программы, после всех инициализированных данных и используй именно "1) my_array: rb 16 ". Сэкономишь на размере скомпилированного файла.

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

Posted: Mon Aug 20, 2018 9:48 pm
by bad_Dr3dd0x
Как пользоваться прогой exetokex?

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

Posted: Mon Aug 20, 2018 10:06 pm
by 0CodErr
А это лучше у её автора спросить.
Я лично не пользовался ни exetokex, ни pe2kos, ни t2fasm, потому как существуют куда более нормальные способы сборки\компиляции\линковки.
Если уж ты где-то нашёл такую программу, то, наверное, где-то там же нужно искать и описание к ней, а если его нет — то и вовсе не использовать её(ну или на свой страх и риск :) ).

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

Posted: Mon Aug 20, 2018 10:08 pm
by bad_Dr3dd0x
Блиииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииин!!!!!!!!!!!!!!!!!!!!!!!!!