Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср май 23, 2018 3:51 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 1105 сообщений ]  На страницу Пред. 170 71 72 73 74
Автор Сообщение
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн янв 29, 2018 1:39 am 
Не в сети

Зарегистрирован: Сб авг 03, 2013 12:29 pm
Сообщения: 8
Походу команда movzx как то не так работает как я ожидал, после того как заменил
movzx ebx, [iter]
на
mov ebx, dword[iter]
заработало правильно.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн янв 29, 2018 1:47 am 
Не в сети

Зарегистрирован: Сб апр 22, 2017 6:11 pm
Сообщения: 66
barbar89
Цитата:
; рядом message я написал iter db 1

Замени размер самой переменной iter.
Если ты её значение кладёшь в регистр eax или ebx, то она явно не байт db, а dd (4 байта). Иначе мусор может попасть или ещё что.


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

было бы правильнее заменить следующую строчку:
Код:
movzx ebx, [iter]

на
Код:
movzx ebx, byte[iter] ;в других ассемблерах byte ptr[iter] 


Либо как я отметил выше изменить iter dd 0 и писать как ты сделал.


Последний раз редактировалось theonlymirage Пн янв 29, 2018 2:42 am, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн янв 29, 2018 2:18 am 
Не в сети

Зарегистрирован: Сб авг 03, 2013 12:29 pm
Сообщения: 8
С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Пн янв 29, 2018 2:37 am 
Не в сети

Зарегистрирован: Сб апр 22, 2017 6:11 pm
Сообщения: 66
barbar89 писал(а):
С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.


Да, всё правильно размер dd 4 байта, dq 8 байт. Это я перепутал.
P.S. Исправил в посте выше.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Ср янв 31, 2018 5:01 am 
Не в сети

Зарегистрирован: Сб авг 03, 2013 12:29 pm
Сообщения: 8
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Ср янв 31, 2018 5:26 am 
Не в сети

Зарегистрирован: Сб апр 22, 2017 6:11 pm
Сообщения: 66
barbar89 писал(а):
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.

Сдвигами =) Смотри например shl, shr и примеры в SVN.
Одно значение из младших разрядов берёшь сразу из регистра ax, а второе сдвигом.

Примерно так:
Код:
mov ebx, 0
mov bx, ax ;теперь y в ebx
shr eax, 16 ;теперь x в eax


Если ты хочешь оставить в eax только y, то вот так:
Код:
shl eax, 16
shr eax, 16


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Ср янв 31, 2018 10:33 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1256
barbar89 писал(а):
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
Как было уже не раз сказано, наша документация оставляет желать лучшего.
Вот это eax = x*65536 + y следует читать как старшее слово регистра eax содержит x, а младшее содержит y.
theonlymirage писал(а):
Если ты хочешь оставить в eax только y, то вот так:
Код:

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


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт мар 06, 2018 6:17 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1256
Я тут вспомнил просто в связи с предыдущим вопросом viewtopic.php?p=69830#p69830
Есть у нас ещё такая функция
Цитата:
======================================================================
============ Функция 35 - прочитать цвет точки на экране. ============
======================================================================
Параметры:
* eax = 35
* ebx = y*xsize+x, где
* (x,y) = координаты точки (считая от 0)
* xsize = размер экрана по горизонтали
конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
Но не в этом дело :)
Товарищ barbar89 спрашивал
barbar89 писал(а):
как собственно вычленить 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: Помогите новичку
СообщениеДобавлено: Вт мар 06, 2018 6:29 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4450
Цитата:
конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
Хм, а много программ нужно переписывать?

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

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

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Помогите новичку
СообщениеДобавлено: Вт мар 06, 2018 8:46 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1256
Leency писал(а):
Я думаю это можно пофиксить в ядре и я бы мог пофиксить в программах.
Leency, вообще это обсуждалось SysFn35:GetPixel viewtopic.php?f=1&t=3403
Да ты и сам отметился в той теме :)
Пришли к выводу, что не нужно.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1105 сообщений ]  На страницу Пред. 170 71 72 73 74

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB