52 lines
1000 B
ArmAsm
52 lines
1000 B
ArmAsm
|
global copy_page_physical
|
||
|
|
||
|
copy_page_physical:
|
||
|
push ebp
|
||
|
pushf
|
||
|
|
||
|
push eax
|
||
|
push ebx
|
||
|
push ecx
|
||
|
push edx
|
||
|
|
||
|
cli ; disabling interruptions
|
||
|
|
||
|
; pobieramy adresy stron zanim wyłączymy stronnicowanie
|
||
|
mov ebx, [esp+12]
|
||
|
mov ecx, [esp+16]
|
||
|
|
||
|
; wyłączamy stronnicowanie
|
||
|
mov edx, cr0
|
||
|
and edx, 0x7fffffff
|
||
|
mov cr0, edx
|
||
|
; wyłączono stronnicowanie
|
||
|
|
||
|
mov edx, 1024
|
||
|
|
||
|
.loop: ; pętla kopiująca dane strony
|
||
|
mov eax, [ebx] ; kopiujemy dane
|
||
|
mov [ecx], eax
|
||
|
add ebx, 4 ; przesuwamy wskaźniki
|
||
|
add ecx, 4
|
||
|
dec edx ; zmniejszamy licznik bajtów do przekopiowania
|
||
|
cmp edx, 0 ; tu w kodzie tego nie było TODO potestuj
|
||
|
jnz .loop
|
||
|
|
||
|
; przywracamy stronnicowanie
|
||
|
mov edx, cr0
|
||
|
or edx, 0x80000000
|
||
|
mov cr0, edx
|
||
|
; przywrócono stronnicowanie
|
||
|
|
||
|
|
||
|
sti ; enabling interruptions
|
||
|
|
||
|
pop edx
|
||
|
pop ecx
|
||
|
pop ebx
|
||
|
pop eax
|
||
|
|
||
|
popf
|
||
|
pop ebp
|
||
|
ret
|