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

Applications development, KoOS API questions
  • 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 и писать как ты сделал.
    Last edited by theonlymirage on Mon Jan 29, 2018 2:42 am, edited 1 time in total.
  • С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.
  • barbar89 wrote:С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.
    Да, всё правильно размер dd 4 байта, dq 8 байт. Это я перепутал.
    P.S. Исправил в посте выше.
  • Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
  • 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
    
  • 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
  • Я тут вспомнил просто в связи с предыдущим вопросом 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
  • конечно, передавать в качестве параметра размер экрана по горизонтали — это немного странно, ядро ведь это и так знает.
    Хм, а много программ нужно переписывать?

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

    Возможно это что-то легаси из Менуэта.
    Из хаоса в космос
  • Leency wrote:Я думаю это можно пофиксить в ядре и я бы мог пофиксить в программах.
    Leency, вообще это обсуждалось SysFn35:GetPixel http://board.kolibrios.org/viewtopic.php?f=1&t=3403
    Да ты и сам отметился в той теме :)
    Пришли к выводу, что не нужно.
  • 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) "
  • Пустые массивы(которые просто забиты нулями) лучше складывай в конце программы, после всех инициализированных данных и используй именно "1) my_array: rb 16 ". Сэкономишь на размере скомпилированного файла.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Как пользоваться прогой exetokex?
    Я один из тех, кто ещё не программист, но уже не новичок.
    Редактор в группе "KolibriOS - официальная группа".
  • А это лучше у её автора спросить.
    Я лично не пользовался ни exetokex, ни pe2kos, ни t2fasm, потому как существуют куда более нормальные способы сборки\компиляции\линковки.
    Если уж ты где-то нашёл такую программу, то, наверное, где-то там же нужно искать и описание к ней, а если его нет — то и вовсе не использовать её(ну или на свой страх и риск :) ).
  • Блиииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииииин!!!!!!!!!!!!!!!!!!!!!!!!!
    Я один из тех, кто ещё не программист, но уже не новичок.
    Редактор в группе "KolibriOS - официальная группа".
  • Who is online

    Users browsing this forum: No registered users and 5 guests