Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Jun 26, 2019 1:21 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 1119 posts ]  Go to page Previous 171 72 73 74 75 Next
Author Message
PostPosted: Mon Jan 29, 2018 1:39 am 
Offline

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


Top
   
PostPosted: Mon Jan 29, 2018 1:47 am 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 222
barbar89
Quote:
; рядом message я написал iter db 1

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


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

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

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


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


Last edited by theonlymirage on Mon Jan 29, 2018 2:42 am, edited 1 time in total.

Top
   
PostPosted: Mon Jan 29, 2018 2:18 am 
Offline

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


Top
   
PostPosted: Mon Jan 29, 2018 2:37 am 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 222
barbar89 wrote:
С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.


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


Top
   
PostPosted: Wed Jan 31, 2018 5:01 am 
Offline

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


Top
   
PostPosted: Wed Jan 31, 2018 5:26 am 
Offline

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

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

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


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


Top
   
PostPosted: Wed Jan 31, 2018 10:33 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
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:
and eax, 0x0000ffff


Top
   
PostPosted: Tue Mar 06, 2018 6:17 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Я тут вспомнил просто в связи с предыдущим вопросом viewtopic.php?p=69830#p69830
Есть у нас ещё такая функция
Quote:
======================================================================
============ Функция 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)
Quote:
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


Top
   
PostPosted: Tue Mar 06, 2018 6:29 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5053
Quote:
конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
Хм, а много программ нужно переписывать?

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

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

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


Top
   
PostPosted: Tue Mar 06, 2018 8:46 pm 
Offline

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


Top
   
PostPosted: Wed Jun 06, 2018 5:19 pm 
Offline

Joined: Mon Dec 05, 2016 11:04 am
Posts: 136
4 способа выделения массива (ответ JohnXenox скопированный из чата) :
Code:
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) "


Top
   
PostPosted: Wed Jun 06, 2018 11:45 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Пустые массивы(которые просто забиты нулями) лучше складывай в конце программы, после всех инициализированных данных и используй именно "1) my_array: rb 16 ". Сэкономишь на размере скомпилированного файла.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
PostPosted: Mon Aug 20, 2018 9:48 pm 
Offline
User avatar

Joined: Wed Mar 18, 2015 8:22 am
Posts: 173
Как пользоваться прогой exetokex?

_________________
Это очень плохо. Зачем ты это сделал?
Зачем кому-то подражать, если можно сделать что-то новое? Необычное. Захватывающее. Свое!
Развивай мышление, мысли не как все! Разве не этому нас учил Стив Джобс?
Попробуй сделать что-то такое, чего еще нету нигде!


Top
   
PostPosted: Mon Aug 20, 2018 10:06 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
А это лучше у её автора спросить.
Я лично не пользовался ни exetokex, ни pe2kos, ни t2fasm, потому как существуют куда более нормальные способы сборки\компиляции\линковки.
Если уж ты где-то нашёл такую программу, то, наверное, где-то там же нужно искать и описание к ней, а если его нет — то и вовсе не использовать её(ну или на свой страх и риск :) ).


Top
   
PostPosted: Mon Aug 20, 2018 10:08 pm 
Offline
User avatar

Joined: Wed Mar 18, 2015 8:22 am
Posts: 173
Блиииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииин!!!!!!!!!!!!!!!!!!!!!!!!!

_________________
Это очень плохо. Зачем ты это сделал?
Зачем кому-то подражать, если можно сделать что-то новое? Необычное. Захватывающее. Свое!
Развивай мышление, мысли не как все! Разве не этому нас учил Стив Джобс?
Попробуй сделать что-то такое, чего еще нету нигде!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 1119 posts ]  Go to page Previous 171 72 73 74 75 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited