Page 56 of 77

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

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

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

Posted: Sat Jun 22, 2013 1:45 am
by Leency
Огромное спасибо dunkaist - баг исправлен!

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

Posted: Wed Jul 03, 2013 3:04 pm
by CleverMouse
GerdtR wrote:Вопрос: как вызвать функцию, если известен её адрес? Писал так: call 4F3h, но ассемблер написал, что неверное использование символа.
В обычных бинарниках такое должно работать. В COFF-файлах такая команда невозможна из-за устройства машинного кода: call N кодирует свой операнд относительно начала следующей инструкции, то есть в итоговом машинном коде должно быть N - (адрес следующей инструкции) = (что-то) - (адрес загрузки COFF); COFF умеет кодировать только вещи типа (что-то) + (адрес загрузки COFF). Как следствие, нужно использовать одну из форм с абсолютными адресами: либо mov (регистр), N / call (регистр), либо call [variable], где variable - отдельная переменная вида variable dd N.

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

Posted: Wed Jul 03, 2013 11:21 pm
by GerdtR
Ну я использовал mov eax,proc call eax. proc - это константа, и так экономится место в таблице релокаций. А eax всё равно почти наверняка измениться.

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

Posted: Sat Jul 20, 2013 9:01 pm
by 0CodErr
Это из ZKEY.asm:

Code: Select all

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: Select all

mov esp, stack_top

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

Posted: Sun Jul 21, 2013 1:15 am
by Asper
Zkey не нужны были дополнительные параметры, поэтому я использовал старую версию заголовка.
esp вручную устанавливать не нужно.
Смотри taskman.inc

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

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

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

Posted: Fri Aug 02, 2013 4:15 pm
by dunkaist
Посмотри, как сделано в libimg. А лучше просто используй libimg.

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

Posted: Tue Aug 06, 2013 3:58 pm
by Phantom-84
BITMAPINFOHEADER - 28h байт;
палитры нет;
XOR-маска - 32x32x4 байт;
AND-маска - 32x32/8 байт.

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

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

Posted: Sun Sep 08, 2013 4:36 pm
by Leency
Как можно этот код записать короче?

Code: Select all

mov ecx, ebx
sub ecx, WIN_H
shl ecx, 16
add ecx, WIN_H

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

Posted: Sun Sep 08, 2013 5:35 pm
by Asper
И так хорошо.

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

Posted: Sun Sep 08, 2013 8:26 pm
by Mario_r4
Если есть свободные регистры, например EAX, то можно так:

Code: Select all

mov eax, WIN_H
mov ecx, ebx
sub ecx, eax
shl ecx, 16
add ecx, eax
Не всегда этот код будет меньше (не компилировал и не проверял), зато обращение к регистру выполняется намного быстрее чем к ячейке памяти, где хранятся нужные данные.

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

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

Posted: Sun Sep 08, 2013 10:30 pm
by 0CodErr
Leency, если WIN_H — константа, то:

Code: Select all

WIN_H equ 3333
; ........................................
        mov    ecx, ebx
        shl    ecx, 16
        sub    ecx, (WIN_H << 16) - WIN_H

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

Posted: Fri Sep 13, 2013 6:10 pm
by punk_joker
При подключении какой либо библиотеки, необходимо выделять в программе дополнительно память в размере этой библиотеки?

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

Posted: Fri Sep 13, 2013 10:02 pm
by Mario_r4
punk_joker wrote:При подключении какой либо библиотеки, необходимо выделять в программе дополнительно память в размере этой библиотеки?
В обязательном порядке под сам код библиотеки не нужно - система сама все решит, на то она и Операционная Система. А вот под данные либо статически выделяется, либо динамически - все зависит от ситуации и предпочтений самого программиста. Смотри API библиотеки.