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

Assembler programming questions
  • Храни массив указателей на строки.
  • Если точнее, то хранятся структуры. Все таже, что и в job. Мне необходимо просто вывести kol элемениов массива начиная с element.
    to infinity and beyond
  • Тогда

    Code: Select all

    ProcessJobArray:
            movzx   eax, [el_index]
            call    GetJob
            mov     esi, eax
            movzx   ecx, [el_quantity]
      .try_next_job:
            ;Process Job element here
            ;.....
            mov     [esi+JOB.done], 1
            inc     [done_jobs_num]
            mov     al, [jobs_num]
            add     al, [el_index]
            cmp     al, [done_jobs_num]
            jle     close_app
        .skip:
            add     esi, JOB.sizeof
            dec     ecx
            jnz     .try_next_job
            ret
    
    ;data
    el_index db ?
    el_quantity db ?
    
    
  • Тобишь пропускать действие пока не будет достигнут элемент с которого необходимо начать вывод?
    to infinity and beyond
  • Нет конечно.
    call GetJob - получить адрес нужного элемента.
  • Пока ничего не прояснилось. Кстате, в JOB.done что хранится?
    to infinity and beyond
  • punk_joker wrote:Пока ничего не прояснилось.
    А что не понятно-то?
    Ты посмотри код GetJob.
    Что пытался сделать ты:
    mov esi, [Jobs]
    add esi, JOB.sizeof*0

    В место нуля должен быть номер элемента массивп. Номер хранится в переменной element. Если написать add esi, JOB.sizeof*element программа компилируется но не запускается.
    Как это делается в предложенном коде:

    Code: Select all

       movzx   eax, [el_index]
       imul eax, JOB.sizeof
       mov  esi, [Jobs+eax]
    
    punk_joker wrote:Кстате, в JOB.done что хранится?
    Флаг - выполнена задача или нет. Нужен для того чтобы исключить повторный запуск одной и той же задачи.
  • Все ясно. Просто забыл о том сообщении, идиот. А ведь ответ уже давно был дан.
    to infinity and beyond
  • В идеале программа должна вывести через notify значение переменной wallpaper из ini-файла, но выводится почему-то не то. Подскажите в чем проблема всеже?
    Attachments
    eskin2.zip (1.09 KiB)
    Downloaded 265 times
    to infinity and beyond
  • вместо строк 32-33:

    Code: Select all

    	invoke	ini_get_str, ini_path, aDefault, aWallpaper, edi, PATH_MAX_CHARS, 0
    	mov [sz_merror2], edi
    попробуй написать так:

    Code: Select all

    	invoke	ini_get_str, ini_path, aDefault, aWallpaper, sz_merror2, PATH_MAX_CHARS, 0
    не проверял но думаю что сработает
  • Спасибо, сработало. Я пробовал, ток брал переменную в [], над теор часть перечитать.
    to infinity and beyond
  • В скобках [sz_merror2] пишется значение по адресу sz_merror2. А функция ini_get_str требует сам адрес sz_merror2 куда будет записана считанная строка, потому без скобок.
    В примере стояло значение адреса из регистра edi, хотя сам регистр edi в коде встречается впервые в 32-й строке где идет вызов функции ini_get_str. Получалось что значение писалось по неопределенному адресу ведь в регистре могло быть что угодно. А потом значение регистра edi попадало в 4-е четыре байта по адресу sz_merror2.
  • Пытаюсь загрузить в своей программе драйвер tmpdisk.obj

    mcall 68, 16, drv
    ...
    drv db 'tmpdisk'

    Но программа падает Page Fault
    Затем догадываясь что драйвер переведен в PE пробую так

    mcall 68, 21, drv,

    в итоге, если я конечно не ошибся, в eax я получаю 0, т.е. драйвер не загружается

    Вот код проверки
    cmp eax, 0
    jnz red
    mov [notify_struct.msg], err_load
    mcall 70, notify_struct
    mcall -1

    Если в eax не 0, то рисуем окно , иначе выводим сообщение через нотифи и выходим.

    Весь код в аттаче
    Attachments
    EXAMPLE.7z (1.45 KiB)
    Downloaded 269 times
    to infinity and beyond
  • punk_joker
    <<drv db 'tmpdisk' это должен быть полный путь к файлу, а сейчас не пойми что.
    Правильная последовательность

    Code: Select all

               mov eax, 68
               mov ebx, 16
               mov ecx, имя_сервиса
               int 0x40
               test eax, eax
               jnz .done             
                                     
    	   mov ebx, 21
    	   mov ecx, путь_к_драйверу
    	   mov edx, cmdline
    	   int 0x40
    	   test eax, eax
    	   jz .fail
    
    .done:
    
    Last edited by Serge on Fri Aug 29, 2014 3:15 pm, edited 1 time in total.
  • Who is online

    Users browsing this forum: No registered users and 6 guests