Page 42 of 77

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

Posted: Mon Nov 12, 2012 4:10 pm
by Leency
Остался один момент - не хочет удалять диски. А добавляет отлично. Падает с PageFault.

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

Posted: Mon Nov 12, 2012 4:34 pm
by CleverMouse
strchr в этой странной реализации, в отличие от POSIX, при ошибке возвращает не 0, а длину строки, соответственно, ветка про добавление диска срабатывает и при запросе на удаление и из-за этого всё идёт наперекосяк. Я, правда, не поняла, почему именно падает, а не сообщает об ошибке. Где именно PF?

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

Posted: Mon Nov 12, 2012 7:36 pm
by Leency
Вот тут, сейчас буду проверять и править...

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

Posted: Mon Nov 12, 2012 7:56 pm
by CleverMouse
Ясно. strchr в этой странной реализации при ошибке возвращает даже не длину строки, а мусор - то, что было до вызова в eax, с обнулённым al. Отсюда и падение при попытке проинтерпретировать этот мусор как указатель на число.

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

Posted: Tue Nov 13, 2012 2:43 am
by Leency

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. Что я делаю не так?

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

Posted: Tue Nov 13, 2012 3:21 am
by IgorA
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 <>
Потому как в ассемблере сначала идет имя переменной а потом ее тип (а в Си наоборот)

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

Posted: Tue Nov 13, 2012 4:23 am
by Leency
Спасибо, но не прокатило. Я уже прочитал инструкцию и сделаю обычно-привычно.

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

Posted: Tue Nov 13, 2012 4:52 am
by Leency
Сделал, компилится, но не работает.

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
почему-то тоже выдаёт ошибку...

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

Posted: Tue Nov 13, 2012 6:59 am
by dunkaist
Ты не делаешь int 0x40.

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

Posted: Tue Nov 13, 2012 12:49 pm
by SoUrcerer
Закомментированый, ты имеешь в виду? ;)

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

Posted: Tue Nov 13, 2012 1:02 pm
by Leency
dunkaist
Ох, спасибо. Я завтыч. :)

SoUrcerer
Типа да)

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

Posted: Tue Nov 13, 2012 3:45 pm
by 0CodErr
Устанавливаю с помощью 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

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

Posted: Tue Nov 13, 2012 7:04 pm
by Leency
Так наверно оно не поддерживает ../ надо вручную обрезать последнюю папку и устанавливать результат.

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

Posted: Wed Nov 14, 2012 5:43 pm
by CleverMouse
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, для чего нет специальной обработки.

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

Posted: Wed Nov 14, 2012 6:35 pm
by Leency
Замечу только что когда HTMLv был ещё молодым [инвалидом] и не умел переходить по ../
Адреса типа /rd/1/html/history/olala/../../page.htm работали и загружали нужную страницу.