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

Assembler programming questions
  • Имеется структура

    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 выводится мусор.
    to infinity and beyond
  • 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], потом сделать как в первом варианте, потом вернуть тот байт
  • Как-то это полегче делалось. С месяц назад я это уже делал, но исходники были утеряны. А вот теперь немогу понять как делал.
    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 прав. Можно еще так

    Code: Select all

    ; eax = n
    mov al, byte[path + eax]
    mov byte[notify_struct.msg], al
    
    Но при вызове нужно передавать не байт, а адрес, т.е. все ровно нужно создать где-то строку, в нее поместить нужный байт, затем 0, а потом mov [notify.msg], buffer, где buffer, строка, которую нужно вывести
  • Снова я с тупыми вопросами. Не могу разобраться с организацией кода для удаления tmp-дисков. Проблема скорее всего с неправильным заполнением структуры отдаваемой ф68.17. Буду рад если кто укажет на ошибки, а то у меня уже мозг кипит.
    Attachments
    vdm.7z (1.04 KiB)
    Downloaded 370 times
    to infinity and beyond
  • Hint: 'vdm d' deletes /tmp0.
  • И снова я с подобным вопросом. На этот раз немогу организовать создание tmp-диска, и прошу снова указать в каком направлении копать.
    Attachments
    vdm.7z (1.17 KiB)
    Downloaded 365 times
    to infinity and beyond
  • Проблема локализирована. Код снова работает, но неожиданным образом.
    to infinity and beyond
  • Помогите разобраться, почему edit_box ведет себя не так как надо. На события мыши он вроде как вообще не реагирует, покрайней мере фокус не снимается. А при событии нажатия клавиатуры он и воввсе ведет себя непонятным образом.
    Attachments
    vdm.7z (2.03 KiB)
    Downloaded 351 times
    to infinity and beyond
  • 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
    Всем чмоки в этом проекте! Засуньте эти 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 374 times
  • У тебя ведь даже не планировалось умножение матрицы на вектор:

    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
    
    
  • Спасибо. Кажется понял я пропустил 4-ю координату, и забыл сделать сдвиг по вектору при выводе результата, потому последняя единица попадала в начало вектора. Остальные координаты не менялись, а я считал что они пересчитанные.
    Уже много раз менял этот код в ходе экспериментов и много чего уже сделанного правильно выкинул из него. В начале вообще планировал загрузку вектора вынести перед циклом, чтобы не грузить его 4 раза, и по идее он будет меняться с каждым циклом, так что доработка еще будет нужна.
  • Who is online

    Users browsing this forum: No registered users and 2 guests