Помогите новичку
-
Остался один момент - не хочет удалять диски. А добавляет отлично. Падает с PageFault.
- Attachments
-
-
tmpdisk.zip (2.46 KiB)Downloaded 195 times
-
Из хаоса в космос
strchr в этой странной реализации, в отличие от POSIX, при ошибке возвращает не 0, а длину строки, соответственно, ветка про добавление диска срабатывает и при запросе на удаление и из-за этого всё идёт наперекосяк. Я, правда, не поняла, почему именно падает, а не сообщает об ошибке. Где именно PF?
Сделаем мир лучше!
Вот тут, сейчас буду проверять и править...
- Attachments
-
-
Безымянный.png (157.88 KiB)Viewed 4590 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 это тип данного т. е. название структуры.Leency wrote:Пишет ошибка box BOX ; +34 - illegal instuction. Что я делаю не так?
А у тебя структура имеет тип данного 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 <>
Спасибо, но не прокатило. Я уже прочитал инструкцию и сделаю обычно-привычно.
Из хаоса в космос
Сделал, компилится, но не работает.
Не могу понять где ошибка. Закоммиченый код
test [process_info_buffer.wnd_state], 0x04
jnz .exit
почему-то тоже выдаёт ошибку...
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
Типа да)
Ох, спасибо. Я завтыч.
SoUrcerer
Типа да)
Из хаоса в космос
Устанавливаю с помощью SysFn30.1 текущую папку "/rd/1/fonts/".
Сразу после этого устанавливаю текущую папку "../".
Затем с помощью SysFn30.2 получаю текущую папку.
Возвращается "/rd/1/fonts" (без слеша в конце).
А вот что выдал SHELL:
Сразу после этого устанавливаю текущую папку "../".
Затем с помощью 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_:
Так наверно оно не поддерживает ../ надо вручную обрезать последнюю папку и устанавливать результат.
Из хаоса в космос
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, для чего нет специальной обработки.
Со слешами на конце вообще мутная история. Самый простой способ - не использовать их.
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 работали и загружали нужную страницу.
Адреса типа /rd/1/html/history/olala/../../page.htm работали и загружали нужную страницу.
Из хаоса в космос
Who is online
Users browsing this forum: No registered users and 10 guests