Создаётся файл "/hd0/1/_t_e_s_t_f_i_l_e_" размером 100 Mb.
И читается 10 раз полностью в буфер размером 100 Mb.
Не уверен, в каких именно "попугаях" получается результат, но по ощущениям кажется, что долго.
Code:
ORG 0
BITS 32
; ---------------------------------------------------------------------------- ;
FILE_SIZE equ (1024 * 1024 * 100)
LOOP_COUNT equ 10
TIMER_TICKS_PER_SECOND equ 100
BYTES_PER_MEGABYTES equ 1024 * 1024
OUT_STRING_LEFT equ 16
STACK_SIZE equ 256
; ---------------------------------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END + FILE_SIZE + STACK_SIZE
program.stack dd END + FILE_SIZE + STACK_SIZE
program.params dd 0
program.path dd 0
; ---------------------------------------------------------------------------- ;
action_string dd sz_start
timer_ticks dd 0
result dd 0
; ---------------------------------------------------------------------------- ;
file_info:
.action dd 0
.position dd FILE_SIZE ; for "create file"
dd 0
.count dd 0
.buffer dd 0
db 0
.file_path dd sz_file_path
; ---------------------------------------------------------------------------- ;
sz_caption db "test",0
sz_start db "start..",0
sz_done db " done. ",0
sz_error db " error ",0
sz_file_path db "/hd0/1/_t_e_s_t_f_i_l_e_",0
; ---------------------------------------------------------------------------- ;
START:
; set.event:
mov eax, 40
mov ebx, 5 ; redraw + button
int 64
call On_Redraw
; ----------------------------------
call StartTest
call DrawInfo
; ----------------------------------
WaitEvent:
mov eax, 10
int 64
dec eax
jnz Terminate
call On_Redraw
jmp WaitEvent
Terminate:
or eax, -1
int 64
; ---------------------------------------------------------------------------- ;
On_Redraw:
; redraw.start
mov eax, 12
mov ebx, 1
int 64
; draw.window
xor eax, eax
mov ebx, 200
mov ecx, 100
mov edx, 0x34CCDDEE
mov edi, sz_caption
int 64
call DrawInfo
; redraw.finish
mov eax, 12
mov ebx, 2
int 64
ret
; ---------------------------------------------------------------------------- ;
DrawInfo:
; draw action
mov eax, 4
mov ecx, 0xC0000000
mov edi, 0x00CCDDEE
mov ebx, (OUT_STRING_LEFT << 16) | 10
mov edx, [action_string]
int 64
; draw result
mov eax, 47
mov ebx, (10 << 16)
mov edx, (OUT_STRING_LEFT << 16) | 20
mov esi, 0x70000000
mov edi, 0x00FFFFFF
mov ecx, [result]
int 64
ret
; ---------------------------------------------------------------------------- ;
StartTest:
; if error then we go to .exit and action_string="error"
; else before .exit action_string="done."
mov [action_string], dword sz_error
; try create file
mov eax, 70
mov [file_info.action], dword 2
lea ebx, [file_info]
int 64
test eax, eax
jnz .exit
; try resize created file
mov eax, 70
mov [file_info.action], dword 4
lea ebx, [file_info]
int 64
test eax, eax
jnz .exit
; get timer ticks
mov eax, 26
mov ebx, 9
int 64
mov [timer_ticks], eax
; read from file
mov [file_info.position], dword 0
mov [file_info.action], dword 0
mov [file_info.count], dword FILE_SIZE
mov [file_info.buffer], dword END
lea edx, [file_info]
mov ecx, LOOP_COUNT
; ----------------------------------
.next:
mov eax, 70
mov ebx, edx
int 64
loop .next
; ----------------------------------
; get timer ticks
mov eax, 26
mov ebx, 9
int 64
; calculate result
; result = (FILE_SIZE * LOOP_COUNT / (delta(timer_ticks)) / (BYTES_PER_MEGABYTES * LOOP_COUNT / TIMER_TICKS_PER_SECOND)
sub eax, [timer_ticks]
inc eax ; to avoid next possible division by zero
mov ecx, eax
mov eax, FILE_SIZE * LOOP_COUNT
xor edx, edx
div ecx
mov ecx, BYTES_PER_MEGABYTES * LOOP_COUNT / TIMER_TICKS_PER_SECOND
xor edx, edx
div ecx
mov [action_string], dword sz_done
.exit:
mov [result], eax
ret
; ---------------------------------------------------------------------------- ;
END:
Attachment:
rdt.kex [498 Bytes]
Downloaded 113 times