ряд вопросов по FASM
-
68.16 - это нормальный способ загрузки в том числе и PE-драйверов, но имя драйвера должно заканчиваться нулевым символом. В 68.21 нужно указывать полный путь и дополнительно указывать командную строку.Сделаем мир лучше!
Имеется структура
И переменная
Как поместить n-й байт в notify_struct.msg?
Пробовал так:
Но в итоге в Notify выводится мусор.
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
Пробовал так:
Code: Select all
mov al, [path]
mov byte[notify_struct.msg], al
to infinity and beyond
notify_struct.msg - всего лишь ссылка. Варианта два:
а) если path уже не нужен, то
P.S.: если будет ошибка на строчке path + 1, то помести в eax сначала path, а потом inc eax
б) создать еще один буфер, в него поместить n символов в цикле. Потом mov [notify_struct.msg], buffer
А можно просто пересохранить байт [path + n + 1], потом сделать как в первом варианте, потом вернуть тот байт
а) если path уже не нужен, то
Code: Select all
mov eax, path + 1
add eax, [n]
mov [eax], byte 0
mov [notify_struct.msg], path
б) создать еще один буфер, в него поместить 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
Как-то это полегче делалось. С месяц назад я это уже делал, но исходники были утеряны. А вот теперь немогу понять как делал.
to infinity and beyond
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
Моя ошибка, прочитал n байт, а не n-ый. Тогда dunkaist прав. Можно еще так
Но при вызове нужно передавать не байт, а адрес, т.е. все ровно нужно создать где-то строку, в нее поместить нужный байт, затем 0, а потом mov [notify.msg], buffer, где buffer, строка, которую нужно вывести
Code: Select all
; eax = n
mov al, byte[path + eax]
mov byte[notify_struct.msg], al
Снова я с тупыми вопросами. Не могу разобраться с организацией кода для удаления tmp-дисков. Проблема скорее всего с неправильным заполнением структуры отдаваемой ф68.17. Буду рад если кто укажет на ошибки, а то у меня уже мозг кипит.
- Attachments
-
-
vdm.7z (1.04 KiB)Downloaded 375 times
-
to infinity and beyond
Hint: 'vdm d' deletes /tmp0.
И снова я с подобным вопросом. На этот раз немогу организовать создание tmp-диска, и прошу снова указать в каком направлении копать.
- Attachments
-
-
vdm.7z (1.17 KiB)Downloaded 375 times
-
to infinity and beyond
Проблема локализирована. Код снова работает, но неожиданным образом.
to infinity and beyond
Помогите разобраться, почему edit_box ведет себя не так как надо. На события мыши он вроде как вообще не реагирует, покрайней мере фокус не снимается. А при событии нажатия клавиатуры он и воввсе ведет себя непонятным образом.
- Attachments
-
-
vdm.7z (2.03 KiB)Downloaded 359 times
-
to infinity and beyond
punk_joker wrote:На события мыши он вроде как вообще не реагирует, покрайней мере фокус не снимается.
Spoiler:
Желательно:Code: Select all
mcall 40,0x27
Code: Select all
ed_focus= 10b ;фокус приложения
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
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Есть вопрос по 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
- Attachments
-
-
matr_asm.zip (14.01 KiB)
- программа множит матрицу и вектор, на доску отладки пишет результат
Downloaded 383 times
-
У тебя ведь даже не планировалось умножение матрицы на вектор:
Вот так выводит 0.5 0.7 0.9 1.1:
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]
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
Спасибо. Кажется понял я пропустил 4-ю координату, и забыл сделать сдвиг по вектору при выводе результата, потому последняя единица попадала в начало вектора. Остальные координаты не менялись, а я считал что они пересчитанные.
Уже много раз менял этот код в ходе экспериментов и много чего уже сделанного правильно выкинул из него. В начале вообще планировал загрузку вектора вынести перед циклом, чтобы не грузить его 4 раза, и по идее он будет меняться с каждым циклом, так что доработка еще будет нужна.
Уже много раз менял этот код в ходе экспериментов и много чего уже сделанного правильно выкинул из него. В начале вообще планировал загрузку вектора вынести перед циклом, чтобы не грузить его 4 раза, и по идее он будет меняться с каждым циклом, так что доработка еще будет нужна.
Who is online
Users browsing this forum: No registered users and 3 guests