1 ; **************************************************************************** 2 ; pfc.s (Retro Unix 386 v1.2) - get page fault count -Erdogan Tan- 27/12/2022 3 ; ---------------------------------------------------------------------------- 4 ; [ Last Modification: 27/12/2022 ] 5 6 ; **************************************************************************** 7 ; Assembler: NASM v2.15 8 ; ((nasm pfc0.s -l pfc0.txt -o pfc0 -Z error.txt)) 9 10 ; 27/12/2022 (40) 11 ; 12/01/2022 (37,38,39) 12 ; 21/09/2015 (36) 13 ; 01/07/2015 (35) 14 ; 14/07/2013 (0-34) 15 ; UNIX v1 system calls 16 _rele equ 0 17 _exit equ 1 18 _fork equ 2 19 _read equ 3 20 _write equ 4 21 _open equ 5 22 _close equ 6 23 _wait equ 7 24 _creat equ 8 25 _link equ 9 26 _unlink equ 10 27 _exec equ 11 28 _chdir equ 12 29 _time equ 13 30 _mkdir equ 14 31 _chmod equ 15 32 _chown equ 16 33 _break equ 17 34 _stat equ 18 35 _seek equ 19 36 _tell equ 20 37 _mount equ 21 38 _umount equ 22 39 _setuid equ 23 40 _getuid equ 24 41 _stime equ 25 42 _quit equ 26 43 _intr equ 27 44 _fstat equ 28 45 _emt equ 29 46 _mdate equ 30 47 _stty equ 31 48 _gtty equ 32 49 _ilgins equ 33 50 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 51 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 52 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 53 ; 12/01/2022 - Retro UNIX 386 v1.2 54 ; Retro UNIX 386 v2 system calls 55 _setgid equ 37 56 _getgid equ 38 57 _ver equ 39 ; (get) Retro Unix 386 version 58 ; 27/12/2022 - Retro UNIX 386 v1.2 59 _mem equ 40 ; get available memory 60 61 %macro sys 1-4 62 ; 03/09/2015 63 ; 13/04/2015 64 ; Retro UNIX 386 v1 system call. 65 %if %0 >= 2 66 mov ebx, %2 67 %if %0 >= 3 68 mov ecx, %3 69 %if %0 = 4 70 mov edx, %4 71 %endif 72 %endif 73 %endif 74 mov eax, %1 75 int 30h 76 %endmacro 77 78 ; 17/06/2022 - Retro UNIX 386 v1 79 ;struc stat 80 ; ; Retro UNIX v1 'sysstat' output ! 81 ; ; (34 bytes) 82 ; .inode: resw 1 83 ; .mode: resw 1 84 ; .nlinks: resb 1 85 ; .uid: resb 1 86 ; .size: resw 1 87 ; .dskptr: resw 8 88 ; .ctime: resd 1 89 ; .mtime: resd 1 90 ; .rsvd: resw 1 91 ; .strucsize: 92 ;endstruc 93 94 ENTERKEY equ 0Dh 95 NEXTLINE equ 0Ah 96 BACKSPACE equ 08h 97 98 ; Retro UNIX 386 v1 system call format: 99 ; sys systemcall (eax) , , 100 101 ; -------------------------------------------------------------- 102 103 [BITS 32] ; We need 32-bit intructions for protected mode 104 105 [ORG 0] 106 107 START_CODE: 108 ; 27/12/2022 109 ; get my (current process's) page faults count 110 00000000 31DB xor ebx, ebx ; 0 111 00000002 4B dec ebx ; -1 112 sys _geterr 113 <1> 114 <1> 115 <1> 116 <1> %if %0 >= 2 117 <1> mov ebx, %2 118 <1> %if %0 >= 3 119 <1> mov ecx, %3 120 <1> %if %0 = 4 121 <1> mov edx, %4 122 <1> %endif 123 <1> %endif 124 <1> %endif 125 00000003 B824000000 <1> mov eax, %1 126 00000008 CD30 <1> int 30h 127 0000000A A3[E4000000] mov [my_pfc], eax 128 ; get total page faults count 129 0000000F 4B dec ebx ; -2 130 sys _geterr 131 <1> 132 <1> 133 <1> 134 <1> %if %0 >= 2 135 <1> mov ebx, %2 136 <1> %if %0 >= 3 137 <1> mov ecx, %3 138 <1> %if %0 = 4 139 <1> mov edx, %4 140 <1> %endif 141 <1> %endif 142 <1> %endif 143 00000010 B824000000 <1> mov eax, %1 144 00000015 CD30 <1> int 30h 145 00000017 A3[E0000000] mov [total_pfc], eax 146 147 0000001C E820000000 call page_fault_info 148 149 sys _write, 1, msg_pfc_info, size_of_pfcinfo 150 <1> 151 <1> 152 <1> 153 <1> %if %0 >= 2 154 00000021 BB01000000 <1> mov ebx, %2 155 <1> %if %0 >= 3 156 00000026 B9[7D000000] <1> mov ecx, %3 157 <1> %if %0 = 4 158 0000002B BA60000000 <1> mov edx, %4 159 <1> %endif 160 <1> %endif 161 <1> %endif 162 00000030 B804000000 <1> mov eax, %1 163 00000035 CD30 <1> int 30h 164 165 sys _exit 166 <1> 167 <1> 168 <1> 169 <1> %if %0 >= 2 170 <1> mov ebx, %2 171 <1> %if %0 >= 3 172 <1> mov ecx, %3 173 <1> %if %0 = 4 174 <1> mov edx, %4 175 <1> %endif 176 <1> %endif 177 <1> %endif 178 00000037 B801000000 <1> mov eax, %1 179 0000003C CD30 <1> int 30h 180 here: 181 0000003E 90 nop 182 0000003F EBFD jmp short here 183 184 ; -------------------------------------------------------------- 185 186 page_fault_info: 187 00000041 A1[E0000000] mov eax, [total_pfc] 188 00000046 BB0A000000 mov ebx, 10 189 0000004B B107 mov cl, 7 190 0000004D BE[B1000000] mov esi, total_pfc_str 191 00000052 E809000000 call bintdstr 192 00000057 B107 mov cl, 7 193 00000059 BE[D1000000] mov esi, my_pfc_str 194 0000005E EB00 jmp short bintdstr 195 196 bintdstr: 197 ; EAX = binary number 198 ; ESI = decimal/numeric string address 199 ; EBX = divisor (10) 200 ; ECX = string length (<=10) 201 00000060 01CE add esi, ecx 202 btdstr0: 203 00000062 4E dec esi 204 00000063 31D2 xor edx, edx 205 00000065 F7F3 div ebx 206 00000067 80C230 add dl, 30h 207 0000006A 8816 mov [esi], dl 208 0000006C FEC9 dec cl 209 0000006E 740C jz short btdstr2 210 00000070 09C0 or eax, eax 211 00000072 75EE jnz short btdstr0 212 btdstr1: 213 00000074 4E dec esi 214 00000075 C60620 mov byte [esi], 20h ; blank space 215 00000078 FEC9 dec cl 216 0000007A 75F8 jnz short btdstr1 217 btdstr2: 218 0000007C C3 retn 219 220 msg_pfc_info: 221 ;db 07h 222 0000007D 0D0A db 0Dh, 0Ah 223 0000007F 0D0A db 0Dh, 0Ah 224 00000081 4D454D4F5259205041- db "MEMORY PAGE FAULT COUNTS", 0Dh, 0Ah, 0Dh, 0Ah 225 0000008A 4745204641554C5420- 226 00000093 434F554E54530D0A0D- 227 0000009C 0A 228 0000009D 546F74616C20706167- db "Total page faults : " 229 000000A6 65206661756C747320- 230 000000AF 3A20 231 total_pfc_str: ; 7 digits 232 000000B1 30303030303030200D- db "0000000 ", 0Dh, 0Ah 233 000000BA 0A 234 000000BB 0D0A db 0Dh, 0Ah 235 000000BD 4D7920706167652066- db "My page faults : " 236 000000C6 61756C747320202020- 237 000000CF 3A20 238 my_pfc_str: ; 7 digits 239 000000D1 3F3F3F3F3F3F3F200D- db "??????? ", 0Dh, 0Ah 240 000000DA 0A 241 000000DB 0D0A00 db 0Dh, 0Ah, 0 242 243 size_of_pfcinfo equ ($ - msg_pfc_info) - 1 244 245 ; -------------------------------------------------------------- 246 247 000000DE 90 align 4 248 249 bss_start: 250 251 ABSOLUTE bss_start 252 253 000000E0 total_pfc: resd 1 254 000000E4 my_pfc: resd 1 255 256 ; --------------------------------------------------------------