Board.KolibriOS.org
http://board.kolibrios.org/

Помогите новичку
http://board.kolibrios.org/viewtopic.php?f=2&t=684
Page 56 of 76

Author:  Leency [ Fri Jun 21, 2013 10:53 pm ]
Post subject:  Re: Помогите новичку

Мне очень нужна помощь. Дело в том, что при использовании потоков у меня всегда были проблемы, но иногда они не возникали, если ничего не трогать :) Сейчас вопрос стал ребром в новой версии Eolite:
1. http://imgur.com/sy9Btkm по этим адресам вылет в ядре или в приложении?
2. что это за странная отрисовка - я понимаю что-то одно бы глючило, но в данном случае проблема вообще с разными строками. После нескольких вызовов меню (но как минимум двух), основная прога падает, не меню. Что странно. Какие могут быть мысли?

Attachments:
iBqVE84.png
iBqVE84.png [ 63.51 KiB | Viewed 2530 times ]

Author:  Leency [ Sat Jun 22, 2013 1:45 am ]
Post subject:  Re: Помогите новичку

Огромное спасибо dunkaist - баг исправлен!

Author:  CleverMouse [ Wed Jul 03, 2013 3:04 pm ]
Post subject:  Re: Помогите новичку

GerdtR wrote:
Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.

В обычных бинарниках такое должно работать. В COFF-файлах такая команда невозможна из-за устройства машинного кода: call N кодирует свой операнд относительно начала следующей инструкции, то есть в итоговом машинном коде должно быть N - (адрес следующей инструкции) = (что-то) - (адрес загрузки COFF); COFF умеет кодировать только вещи типа (что-то) + (адрес загрузки COFF). Как следствие, нужно использовать одну из форм с абсолютными адресами: либо mov (регистр), N / call (регистр), либо call [variable], где variable - отдельная переменная вида variable dd N.

Author:  GerdtR [ Wed Jul 03, 2013 11:21 pm ]
Post subject:  Re: Помогите новичку

Ну я использовал mov eax,proc call eax. proc - это константа, и так экономится место в таблице релокаций. А eax всё равно почти наверняка измениться.

Author:  0CodErr [ Sat Jul 20, 2013 9:01 pm ]
Post subject:  Re: Помогите новичку

Это из ZKEY.asm:
Code:
use32
   org   0x0

   db   'MENUET00'   ; 8 byte id
   dd   38      ; required os
   dd   STARTAPP   ; program start
   dd   I_END      ; program image size
   dd   0x100000   ; required amount of memory
   dd   0x00000000   ; reserved=no extended header

include "ASPAPI.INC"

N_KEYCOLOR equ 0x00677889 ; Normal button color
C_KEYCOLOR equ 0x00344556 ; Control button color
L_KEYCOLOR equ 0x00258778 ; Lock button color
TEXTCOLOR  equ 0x00FFFFFF ; Button caption color


STARTAPP:
   mov   ecx, 1      ; to send scancodes.
   call   set_keyboard_mode
А что будет в esp? Я думал, в этом случае надо самому его настраивать, например:
Code:
mov esp, stack_top

Author:  Asper [ Sun Jul 21, 2013 1:15 am ]
Post subject:  Re: Помогите новичку

Zkey не нужны были дополнительные параметры, поэтому я использовал старую версию заголовка.
esp вручную устанавливать не нужно.
Смотри taskman.inc

Author:  GerdtR [ Fri Aug 02, 2013 12:08 am ]
Post subject:  Re: Помогите новичку

Помогите разобраться с форматом .ico . Итак добрался до каталога информации об изображении(у меня только одна запись с иконкой 32x32, 32бит). Читаю поле "размер растра" и вижу 10A8h. Но ведь должно быть 32*32*4=1000h . Т.е. есть какое-то поле(и очень похоже, что перед растром) размером 0A8h. Пробовал 32x32, 24бит и там тоже было это поле. Создавал иконки в Gimp. Что это за поле? Как часто встречается? И вообще есть где-нибудь нормальное описание формата? Ничего кроме Википедии не нашёл.

Attachments:
qwe.png
qwe.png [ 14.99 KiB | Viewed 2265 times ]

Author:  dunkaist [ Fri Aug 02, 2013 4:15 pm ]
Post subject:  Re: Помогите новичку

Посмотри, как сделано в libimg. А лучше просто используй libimg.

Author:  Phantom-84 [ Tue Aug 06, 2013 3:58 pm ]
Post subject:  Re: Помогите новичку

BITMAPINFOHEADER - 28h байт;
палитры нет;
XOR-маска - 32x32x4 байт;
AND-маска - 32x32/8 байт.

Инфа гуглится на раз.

Author:  Leency [ Sun Sep 08, 2013 4:36 pm ]
Post subject:  Re: Помогите новичку

Как можно этот код записать короче?
Code:
mov ecx, ebx
sub ecx, WIN_H
shl ecx, 16
add ecx, WIN_H

Author:  Asper [ Sun Sep 08, 2013 5:35 pm ]
Post subject:  Re: Помогите новичку

И так хорошо.

Author:  Mario_r4 [ Sun Sep 08, 2013 8:26 pm ]
Post subject:  Re: Помогите новичку

Если есть свободные регистры, например EAX, то можно так:
Code:
mov eax, WIN_H
mov ecx, ebx
sub ecx, eax
shl ecx, 16
add ecx, eax

Не всегда этот код будет меньше (не компилировал и не проверял), зато обращение к регистру выполняется намного быстрее чем к ячейке памяти, где хранятся нужные данные.

Кстати вероятно таки правильно [WIN_H], ты же не адресом работаешь, а с данными. Хотя если WIN_H заменяется постоянным значением, то квадратные скобки не нужны, но замечание насчет использования регистра в любом случае актуально.

Author:  0CodErr [ Sun Sep 08, 2013 10:30 pm ]
Post subject:  Re: Помогите новичку

Leency, если WIN_H — константа, то:
Code:
WIN_H equ 3333
; ........................................
        mov    ecx, ebx
        shl    ecx, 16
        sub    ecx, (WIN_H << 16) - WIN_H

Author:  punk_joker [ Fri Sep 13, 2013 6:10 pm ]
Post subject:  Re: Помогите новичку

При подключении какой либо библиотеки, необходимо выделять в программе дополнительно память в размере этой библиотеки?

Author:  Mario_r4 [ Fri Sep 13, 2013 10:02 pm ]
Post subject:  Re: Помогите новичку

punk_joker wrote:
При подключении какой либо библиотеки, необходимо выделять в программе дополнительно память в размере этой библиотеки?

В обязательном порядке под сам код библиотеки не нужно - система сама все решит, на то она и Операционная Система. А вот под данные либо статически выделяется, либо динамически - все зависит от ситуации и предпочтений самого программиста. Смотри API библиотеки.

Page 56 of 76 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/