Page 6 of 10

Re: ряд вопросов по FASM

Posted: Fri Aug 29, 2014 3:12 pm
by CleverMouse
68.16 - это нормальный способ загрузки в том числе и PE-драйверов, но имя драйвера должно заканчиваться нулевым символом. В 68.21 нужно указывать полный путь и дополнительно указывать командную строку.

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 4:19 am
by punk_joker
Имеется структура

Code: Select all

notify_struct:
        dd 7
        dd 0
  .msg  dd 0
        dd 0
        dd 0
        db '/sys/@notify', 0
И переменная

Code: Select all

path:
	rb 4096
Как поместить n-й байт в notify_struct.msg?
Пробовал так:

Code: Select all

    mov al, [path]
    mov byte[notify_struct.msg], al
Но в итоге в Notify выводится мусор.

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 7:43 am
by e-andrew
notify_struct.msg - всего лишь ссылка. Варианта два:
а) если path уже не нужен, то

Code: Select all

mov eax, path + 1
add eax, [n]
mov [eax], byte 0
mov [notify_struct.msg], path
P.S.: если будет ошибка на строчке path + 1, то помести в eax сначала path, а потом inc eax
б) создать еще один буфер, в него поместить n символов в цикле. Потом mov [notify_struct.msg], buffer

Code: Select all

mov eax, buffer
mov ebx, path
mov ecx, [n]
@@:
mov dl, byte [ebx]
mov byte [eax], dl
inc eax
inc ebx
loop @b

mov [notify.msg], buffer

;-----
buffer rd 4096
А можно просто пересохранить байт [path + n + 1], потом сделать как в первом варианте, потом вернуть тот байт

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 11:48 am
by punk_joker
Как-то это полегче делалось. С месяц назад я это уже делал, но исходники были утеряны. А вот теперь немогу понять как делал.

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 1:01 pm
by dunkaist
I'm not sure I understand you correctly, but here is my version:

Code: Select all

; eax = n
movzx eax, byte[path + eax]
mov [notify_struct.msg], eax

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 2:40 pm
by e-andrew
Моя ошибка, прочитал n байт, а не n-ый. Тогда dunkaist прав. Можно еще так

Code: Select all

; eax = n
mov al, byte[path + eax]
mov byte[notify_struct.msg], al
Но при вызове нужно передавать не байт, а адрес, т.е. все ровно нужно создать где-то строку, в нее поместить нужный байт, затем 0, а потом mov [notify.msg], buffer, где buffer, строка, которую нужно вывести

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 7:54 pm
by punk_joker
Снова я с тупыми вопросами. Не могу разобраться с организацией кода для удаления tmp-дисков. Проблема скорее всего с неправильным заполнением структуры отдаваемой ф68.17. Буду рад если кто укажет на ошибки, а то у меня уже мозг кипит.

Re: ряд вопросов по FASM

Posted: Tue Oct 07, 2014 9:58 pm
by dunkaist
Hint: 'vdm d' deletes /tmp0.

Re: ряд вопросов по FASM

Posted: Wed Oct 15, 2014 10:09 pm
by punk_joker
И снова я с подобным вопросом. На этот раз немогу организовать создание tmp-диска, и прошу снова указать в каком направлении копать.

Re: ряд вопросов по FASM

Posted: Thu Oct 16, 2014 9:02 am
by punk_joker
Проблема локализирована. Код снова работает, но неожиданным образом.

Re: ряд вопросов по FASM

Posted: Wed Oct 22, 2014 8:20 am
by punk_joker
Помогите разобраться, почему edit_box ведет себя не так как надо. На события мыши он вроде как вообще не реагирует, покрайней мере фокус не снимается. А при событии нажатия клавиатуры он и воввсе ведет себя непонятным образом.

Re: ряд вопросов по FASM

Posted: Wed Oct 22, 2014 8:46 am
by Mario_r4
punk_joker wrote:На события мыши он вроде как вообще не реагирует, покрайней мере фокус не снимается.
Spoiler:Желательно:

Code: Select all

mcall 40,0x27
А также в mouse_dd

Code: Select all

ed_focus=                     10b   ;фокус приложения
Я в opendialog сделал:

Code: Select all

	mov	edi,edit1
	or	[edi+44],dword ed_focus
И да, я знаю, что использовать "магические" числа неправильный путь, но так вышло.
Можно сразу сделать:

Code: Select all

	or	[mouse_dd],dword ed_focus
punk_joker wrote:А при событии нажатия клавиатуры он и воввсе ведет себя непонятным образом.

Code: Select all

mcall 2

Re: ряд вопросов по FASM

Posted: Sat Oct 25, 2014 8:09 pm
by IgorA
Есть вопрос по FPU. Пишу функцию которая множит матрицу m(4*4) на вектор v(4). Пока что для упрощения беру единичную матрицу, т. е. после умножения я должен получить исходный вектор. Проблема в том что первое число получаемого вектора равно 1.0, другие числа совпадают. Вычисляю числа вектора в цикле потому для всех чисел по идее используются одни и те же формулы. Потому-то и не могу понять почему именно первое число делается единицей :?
Сама функция для тех кто не хочет смотреть весь код.

Code: Select all

align 4
proc func_mv, m:dword, v:dword
pushad
	mov ebx,[m]
	mov edx,[v]
	mov ecx,4
	.cycle_0:
		finit
		fld dword[edx]
		fld dword[edx+4]
		fld dword[edx+8]

		fld dword[ebx]	   ;st0 = m[0]
		fmul st0,st3	   ;st0 *= v.coord.X
		fld dword[ebx+4]   ;st0 = m[1]
		fmul st0,st3	   ;st0 *= v.coord.Y
		fld dword[ebx+8]   ;st0 = m[2]
		fmul st0,st3	   ;st0 *= v.coord.Z
		fadd dword[ebx+12] ;st0 += m[3]
		fadd st0,st1	   ;st0 += v.coord.Z * m[2]
		fadd st0,st2	   ;st0 += v.coord.Y * m[1]
		fstp dword[edx]    ;v.coord.X = v.coord.X * m[0] + v.coord.Y * m[1] + v.coord.Z * m[2] + m[3]
		add ebx,16 ;следущая строка матрицы
		add esi,4  ;следущая координата вектора

		loop .cycle_0
	stdcall print_matrix,[v],1
popad
	ret
endp

.........

align 4
matr1 dd 1.0,0.0,0.0,0.0
	dd 0.0,1.0,0.0,0.0
	dd 0.0,0.0,1.0,0.0
	dd 0.0,0.0,0.0,1.0

vect1 dd 0.5,0.7,0.9,1.1

Re: ряд вопросов по FASM

Posted: Sat Oct 25, 2014 8:57 pm
by dunkaist
У тебя ведь даже не планировалось умножение матрицы на вектор:

Code: Select all

fld dword[edx]
fld dword[edx+4]
fld dword[edx+8]
...
fstp dword[edx]    ; v.coord.X = v.coord.X * m[0] + v.coord.Y * m[1] + v.coord.Z * m[2] + m[3]
Вот так выводит 0.5 0.7 0.9 1.1:

Code: Select all

proc func_mv, m:dword, v:dword
pushad
        mov ebx,[m]
        mov edx,[v]
        mov esi,edx
        mov ecx,4
        .cycle_0:
                finit
                fld dword[edx]
                fld dword[edx+4]
                fld dword[edx+8]
                fld dword[edx+12]
;fwait
                fld dword[ebx]     ;st0 = m[0]
                fmul st0,st4       ;st0 *= v.coord.X
                fld dword[ebx+4]   ;st0 = m[1]
                fmul st0,st4       ;st0 *= v.coord.Y
                fld dword[ebx+8]   ;st0 = m[2]
                fmul st0,st4       ;st0 *= v.coord.Z
                fld dword[ebx+12]
                fmul st0, st4

                fadd st0,st1       ;st0 += v.coord.Z * m[2]
                fadd st0,st2       ;st0 += v.coord.Y * m[1]
                fadd st0,st3
                fstp dword[esi]    ;v.coord.X = v.coord.X * m[0] + v.coord.Y * m[1] + v.coord.Z * m[2] + m[3]
;               fincstp
;               fincstp
;fwait
                add ebx,16
                add esi,4
;fwait
                loop .cycle_0
        stdcall print_matrix,[v],1
popad
        ret
endp


Re: ряд вопросов по FASM

Posted: Sat Oct 25, 2014 9:58 pm
by IgorA
Спасибо. Кажется понял я пропустил 4-ю координату, и забыл сделать сдвиг по вектору при выводе результата, потому последняя единица попадала в начало вектора. Остальные координаты не менялись, а я считал что они пересчитанные.
Уже много раз менял этот код в ходе экспериментов и много чего уже сделанного правильно выкинул из него. В начале вообще планировал загрузку вектора вынести перед циклом, чтобы не грузить его 4 раза, и по идее он будет меняться с каждым циклом, так что доработка еще будет нужна.