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

Applications development, KoOS API questions
  • strchr в этой странной реализации, в отличие от POSIX, при ошибке возвращает не 0, а длину строки, соответственно, ветка про добавление диска срабатывает и при запросе на удаление и из-за этого всё идёт наперекосяк. Я, правда, не поняла, почему именно падает, а не сообщает об ошибке. Где именно PF?
    Сделаем мир лучше!
  • Вот тут, сейчас буду проверять и править...
    Attachments
    Безымянный.png
    Безымянный.png (157.88 KiB)
    Viewed 4589 times
    Из хаоса в космос
  • Ясно. strchr в этой странной реализации при ошибке возвращает даже не длину строки, а мусор - то, что было до вызова в eax, с обнулённым al. Отсюда и падение при попытке проинтерпретировать этот мусор как указатель на число.
    Сделаем мир лучше!
  • Code: Select all

    struc boxy
    {
      left   dd ?
      top    dd ?
      width  dd ?
      height dd ?
    }
    
    BOX boxy
    
    struc process_info
    {
      cpu_usage               dd ?  ; +0
      window_stack_position   dw ?  ; +4
      window_stack_value      dw ?  ; +6
                              dw ?  ; +8
      process_name            rb 12 ; +10
      memory_start            dd ?  ; +22
      used_memory             dd ?  ; +26
      PID                     dd ?  ; +30
      box                     BOX   ; +34
      dw ?
      slot_state              dw ?  ; +50
                              dw ?  ; +52
      client_box              BOX   ; +54
      dw ?
      wnd_state               db ?  ; +70
      rb (1024-71)
    }
    Пишет ошибка box BOX ; +34 - illegal instuction. Что я делаю не так?
    Из хаоса в космос
  • Leency wrote:Пишет ошибка box BOX ; +34 - illegal instuction. Что я делаю не так?
    В этой записи скорее всего предполагается что BOX это тип данного т. е. название структуры.
    А у тебя структура имеет тип данного boxy вместо BOX, потому и конфликтует. Т. е. этот код:
    Leency wrote:struc boxy{  left   dd ?  top    dd ?  width  dd ?  height dd ?}BOX boxy
    должен быть таким:

    Code: Select all

    struc BOX{
      left   dd ?
      top    dd ?
      width  dd ?
      height dd ?
    }
    boxy BOX <>
    Потому как в ассемблере сначала идет имя переменной а потом ее тип (а в Си наоборот)
  • Спасибо, но не прокатило. Я уже прочитал инструкцию и сделаю обычно-привычно.
    Из хаоса в космос
  • Сделал, компилится, но не работает.

    Code: Select all

    		;Leency{
    		mov     eax,9
    		mov     ebx,process_info_buffer
    		mov     ecx,-1
    		mov     eax,[ebx+70]
    		mov     [window_status],eax
    		test    [window_status],100b   ; window is rolled up
    		jnz     .exit
    		test    [window_status],10b    ; window is minimized to panel
    		jnz     .exit
    		;test	[process_info_buffer.wnd_state], 0x04
    		;jnz	    .exit
    		;}Leency
            call    con.draw_image
    
    .exit:
            push    12
            pop     eax
            push    2
            pop     ebx
            int     0x40
    		
            ret
    
    ......................................
    
    struc process_info
    {
      cpu_usage               dd ?  ; +0
      window_stack_position   dw ?  ; +4
      window_stack_value      dw ?  ; +6
                              dw ?  ; +8
      process_name            rb 12 ; +10
      memory_start            dd ?  ; +22
      used_memory             dd ?  ; +26
      PID                     dd ?  ; +30
      box.x                   dd ?  ; +34
      box.y                   dd ?  ; +38
      box.width               dd ?  ; +42
      box.height              dd ?  ; +46
      slot_state              dw ?  ; +50
                              dw ?  ; +52
      client_box.x            dd ?  ; +54
      client_box.y            dd ?  ; +58
      client_box.width        dd ?  ; +62
      client_box.height       dd ?  ; +66
      wnd_state               db ?  ; +70
      rb (1024-71)
    }
    process_info_buffer process_info
    window_status		rd 1
    
    Не могу понять где ошибка. Закоммиченый код
    test [process_info_buffer.wnd_state], 0x04
    jnz .exit
    почему-то тоже выдаёт ошибку...
    Из хаоса в космос
  • Ты не делаешь int 0x40.
  • Закомментированый, ты имеешь в виду? ;)
  • dunkaist
    Ох, спасибо. Я завтыч. :)

    SoUrcerer
    Типа да)
    Из хаоса в космос
  • Устанавливаю с помощью SysFn30.1 текущую папку "/rd/1/fonts/".
    Сразу после этого устанавливаю текущую папку "../".
    Затем с помощью SysFn30.2 получаю текущую папку.
    Возвращается "/rd/1/fonts" (без слеша в конце).

    Code: Select all

    ORG 0
    BITS 32
    MENUET01           db 'MENUET01'
    version            dd 1
    program.start      dd start_
    program.end        dd end_
    program.memory     dd end_ + STACK_SIZE  
    program.stack      dd end_ + STACK_SIZE
    program.params     dd 0
    program.path       dd 0 
    
    STACK_SIZE     equ 256
    
    sz_path      db "/rd/1/fonts/",0
    ; sz_dot_slash db "./",0
    sz_dot_dot_slash db "../",0
    
    curdir: resb 256
    
    start_:
    
      call on_redraw
      
      L_1:
        ; wait.event
        mov eax, 10
        int 64
    
        cmp eax, 1
        jne L_2
            call on_redraw
        jmp L_1
        
        L_2:    
        cmp eax, 2
        jne L_3
          ; get.key.code
          ; mov eax, 2
          int 64
        jmp L_1
        
        L_3:    
        cmp eax, 3
        jne L_1
          ; get.button.number
          mov eax, 17
          int 64
          
          shr eax, 8
          cmp eax, 1
          jne L_1
              
          ; program.terminate
          neg eax
          int 64
    
    
    on_redraw:
        
        ; redraw.start
        mov eax, 12
        mov ebx, 1
        int 64
    
        ; draw.window
        xor eax, eax
        mov ebx, 200
        mov ecx, 200
        mov edx, 33AABBCCh
        xor edi, edi
        int 64    
        
        ; set.current.directory
        mov eax, 30
        mov ebx, 1
        mov ecx, sz_path
        int 64    
    
        ; set.current.directory
        ; mov eax, 30
        ; mov ebx, 1
        ; mov ecx, sz_dot_slash
        mov ecx, sz_dot_dot_slash
        int 64       
          
        ; get.current.directory
        ; mov eax, 30
        inc ebx ;mov ebx, 2
        mov ecx, curdir
        mov edx, 256
        int 64   
    
        ; draw.text
        mov eax, 4
        xor ebx, ebx
        mov edx, ecx ;curdir    
        mov ecx, 80000000h
        int 64    
        
        ; redraw.finish
        mov eax, 12
        mov ebx, 2
        int 64
        
    ret
    
    end_:
    А вот что выдал SHELL:
    Image
  • Так наверно оно не поддерживает ../ надо вручную обрезать последнюю папку и устанавливать результат.
    Из хаоса в космос
  • 0CodErr
    Со слешами на конце вообще мутная история. Самый простой способ - не использовать их.
    1. /rd/1/fonts/ интерпретируется как путь к подпапке с пустым именем в папке fonts. Например, попытки обращения к файлам относительно этой папки будут пытаться смотреть на файлы типа /rd/1/fonts//somefile и возвращать ошибку о несуществующем пути. С другой стороны, функция 30.1 съедает первый слеш после . и .., так что переход в папку ../ - то же самое, что и в папку .., что отбрасывает последний компонент пути - пустое имя. По-видимому, такая несогласованность - это баг, но неоднозначно, каким должно быть правильное поведение.
    2. shell не использует ни 30.1, ни 30.2, а самостоятельно хранит текущую папку, показывая её по pwd. В ситуации на картинке новой текущей папкой оказывается /rd/1/fonts/../, и это баг shell, что в этом случае .. не сворачивается.
    3. Последний ls обращается к ядру за листингом папки /rd/1/fonts/.., и мусор на картинке - баг ядра. Я полагаю, это связано с тем, что .. не обрабатывается специально, а в случае FAT, когда родительская папка - корень, папка .. указывает в 0, для чего нет специальной обработки.
    Сделаем мир лучше!
  • Замечу только что когда HTMLv был ещё молодым [инвалидом] и не умел переходить по ../
    Адреса типа /rd/1/html/history/olala/../../page.htm работали и загружали нужную страницу.
    Из хаоса в космос
  • Who is online

    Users browsing this forum: No registered users and 7 guests