⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osfunc.asm

📁 small c complier 它也Menuet OS的一个附件,同样他也是有汇编实现
💻 ASM
字号:
;
; OS function implementation
; SmallC for MenuetOS
;
   
;B+ General definitions
   
;B+ File defs
 ;const
  ;param
  BAD   equ -1
  files equ 100
  save_buffer equ 0x20000 ;32
  ;system
  EOF equ -1
   
 ;memory
 fileinfo     equ I_END
 start_data   equ (fileinfo+16384)
 ;
 mem_heap equ 0x100000
 ;
 g_handle equ 0x300000
  ;dword - pointer - relative to file
  ;dword - begin of file
  ;dword - file size
  ;dword - 0/1 <=> read/write
;E:.
   
;E:.
   
init_osfunc:
;B+ Init OS functions
;B+ Clear file handles
  mov  edi,g_handle
  mov  ecx,files
  shl  ecx,2 ;*4
  xor  eax,eax
  cld
rep stosd
;E:.
  ret
;E:.
   
;B+ Main OS functions
ppp dd 70
   
_OS_fopen:
;B+ Implement "fopen"
  ;esp+4 - mode
  ;esp+8 - file name
   
;  mov  eax,-1
;  int  0x40
   
;  mov  ebx,[esp+8];
; push dword 10
; push dword [ppp]
; push ebx
; push dword 12
;  call _outstrg
;  add  esp,4*4
;  add  [ppp],10
   
;  cmp  byte [ebx+8],0
;  jne .l
;  mov  byte [ebx+8],'?'
;.l:
;  cmp  [ppp],80
;  je   .l
   
;B+ Copy file name
  mov  esi,[esp+8]
  mov  edi,[p_filename]
  mov  ecx,12
.next_copy:
lodsb
  ;fill name (space)
  or   al,al
  jz   .fill_space
  ;set upper case
  cmp  al,'a'
  jb   .good_char
  cmp  al,'z'
  ja   .good_char
  add  al,'A'-'a'
.good_char:
stosb
  dec  ecx
  jnz  .next_copy
.fill_space:
  mov  al,' '
  cld
rep stosb
;E:.
;B+ Find file handle
  mov  eax,g_handle
.new_handle:
  cmp  dword [eax+4],0
  je   .find_place
  add  eax,16
  cmp  eax,g_handle+files*16-16
  jne  .new_handle
  xor  eax,eax ; no free handle
  ret
.find_place:
; TMP:  mov  eax,[.ccc]
; TMP:  add  [.ccc],16
;E:.
 push eax
;B+ Test open mode
  mov  eax,[esp+4+4]
  cmp  byte [eax],'r'
  je   .open_read
  cmp  byte [eax],'w'
  je   .open_write
  ;bad mode
  add  esp,4
  mov  eax,eax ; invalid open mode
  ret
;E:.
   
; TMP:.ccc dd g_handle
   
.open_read:
;B+ Open for read
;B+ Read file
   
  ;Wait to read correct
  mov  ebx,100
  mov  eax,5
  int  0x40
   
  mov  eax,[g_fileend]
  mov  dword [file_parameters+2*4],2000 ;read all
  mov  dword [file_parameters+3*4],eax
   
  mov  dword [file_parameters],0
  mov  ebx,file_parameters
  mov  eax,58
  int  0x40
;E:.
   
;B+ TEST FILE FOUND
  or   eax,eax
  jz   .file_found
  cmp  eax,5
  je   .file_found
   
;  mov  ecx,eax ; eax
;  mov  ebx,8 shl 16 + 0x0100
;  mov  edx,100 shl 16 + 120
;  mov  esi,0xffffff
;  mov  eax,47
;  int  0x40
   
  ;file not found - return 0
  add  esp,4
  xor  eax,eax
  ret
.file_found:
;E:.
 pop  eax
 push ebx
  xchg eax,ebx
;B+ Fill file handle
  ;save current pointer
  xor  eax,eax
  mov  [ebx],eax
   
  ;save file begin
  mov  eax,[g_fileend]
  mov  [ebx+4],eax
   
  ;save file size
 pop  eax
  mov  [ebx+8],eax
  ;reserve file zone
  add  eax,7
  and  eax,not 7
  add  [g_fileend],eax
   
  ;save file mode
  mov  eax,0 ;read
  mov  [ebx+12],eax
;E:.
  xchg eax,ebx ;return pointer place
  ret
;E:.
   
.open_write:
;B+ Open for write
;B+ Reserve filename
  mov  esi,[p_filename]
  mov  edi,[g_fileend]
  mov  ecx,12
  cld
rep movsb
  add  [g_fileend],16
;E:.
 pop  ebx
;B+ Fill file handle
  ;save begin pointer
  xor  eax,eax
  mov  [ebx],eax
   
  ;save file begin
  mov  eax,[g_fileend]
  mov  [ebx+4],eax
   
  ;save file zone
  mov  dword [ebx+8],save_buffer
  ;reserve file zone
  add  [g_fileend],save_buffer
   
  ;save file mode
  mov  eax,1 ;write
  mov  [ebx+12],eax
;E:.
  xchg eax,ebx ;return pointer place
  ret
;E:.
   
;E:.
   
_OS_fclos:
;B+ Close file
 ;esp+4 - file handle
   
;B+ Test write mode - save file
  mov  eax,[esp+4]
  mov  eax,[eax+12]
  cmp  eax,1
;E:.
  jne  .no_write
   
;B+ Copy parameters
  mov  ebx,[esp+4]
  ;file size
  mov  eax,[ebx]
  mov  dword [file_parameters+2*4],eax
  ;file begin
  mov  eax,[ebx+4]
  mov  dword [file_parameters+3*4],eax
   
;B+ Update file memory
  sub  eax,16
  mov  dword [ebx+4],eax
  add  dword [ebx+8],16
;E:.
   
  ;copy filename
  mov  esi,[ebx+4]
  mov  edi,[p_filename]
  mov  ecx,12
  cld
rep movsb
;E:.
   
;B+ Save file
   
  ;Wait to read correct
  mov  ebx,100
  mov  eax,5
  int  0x40
   
  mov  dword [file_parameters+0],1
  mov  ebx,file_parameters
  mov  eax,58
  int  0x40
;E:.
  jmp  .read
   
 .no_write:
;B+ Test read mode - if no error end
  cmp  eax,0
  je   .read
  mov  eax,BAD
  ret
;E:.
.read:
   
;B+ Relace memory
  ;find file size
  mov  eax,[esp+4]
  mov  ecx,[eax+8]
  add  ecx,7
  and  ecx,not 7
 push ecx
   
  ;mov memory
  mov  esi,[eax+4]
  mov  edi,esi
  add  esi,ecx
  mov  ecx,[g_fileend]
  sub  ecx,edi
  jz   .is_last
  shr  ecx,2
  inc  ecx ;not neccessery
  cld
rep movsd
  ;update gl. memory
.is_last:
 pop  ecx
  sub  dword [g_fileend],ecx
   
  ;update file pointers
  mov  edx,ecx
  mov  ecx,[eax+4]
  mov  eax,g_handle
.new_handle1:
  mov  ebx,[eax+4]
  cmp  ebx,ecx
  jbe  .no_update
  sub  ebx,edx
  mov  [eax+4],ebx
.no_update:
  add  eax,16
  cmp  eax,g_handle+files*16
  jne  .new_handle1
   
  ;clear handle
  mov  edi,[esp+4]
  xor  eax,eax
  cld
  stosd
  stosd
  stosd
  stosd
;E:.
  ret
;E:.
   
_OS_fgetc:
;B+ Load char from file
 ;esp+4 - input file
   
  mov  eax,[esp+4]
  mov  ebx,[eax]
  cmp  ebx,[eax+8]
  je   .eof
  inc  dword [eax]
  add  ebx,[eax+4]
  movzx eax,byte [ebx]
  ret
.eof:
  mov  eax,EOF
  ret
;E:.
   
;rrr db 'g',0
   
_OS_fputc:
;B+ Save char to file
 ;esp+4 - output file
 ;esp+8 - char to write
   
;push dword '<'
;mov  cl,1
;push dword 0
;call test_outch
;add  esp,8
   
;B+ Temp - write direct.
  cmp  dword [esp+4],__iob
  jne  .real_write0
  jmp  _OS_exit
.real_write0:
  cmp  dword [esp+4],__iob+32
  jne  .real_write1
  mov  [print_textcolor],0x00ffff
  jmp  test_outch
.real_write1:
  cmp  dword [esp+4],__iob+64
  jne  .real_write2
  mov  [print_textcolor],0x77ffff
  jmp  test_outch
.real_write2:
;E:.
   
;push dword '<'
;mov  cl,1
;push dword 0
;call test_outch
;add  esp,8
   
  mov  eax,[esp+4]
  mov  ebx,[eax]
 push ebx
  cmp  ebx,[eax+8]
  jne  .write_normal
   
;B+ Alloc save_buffer bytes
  ;mov memory
  mov  ebx,[esp+4+4]
  mov  esi,[g_fileend]
  mov  edi,esi
  add  edi,save_buffer-4
  mov  ecx,esi
  sub  ecx,[ebx+4]
  sub  ecx,[ebx+8]
  shr  ecx,2
  jz   .is_last
  sub  esi,4
  std
rep movsd
.is_last:
   
  ;expand file size
  add  dword [eax+8],save_buffer
   
  ;update file pointers
  mov  ebx,g_handle
.new_handle:
  mov  ecx,[ebx+4]
  cmp  [eax+4],ecx
  jae  .no_update
  add  dword [ebx+4],save_buffer
.no_update:
  add  ebx,16
  cmp  ebx,g_handle+files*16-16
  jne  .new_handle
;E:.
   
.write_normal:
 pop  ebx
  inc  dword [eax]
  add  ebx,[eax+4]
  mov  cl,[esp+8]
  mov  byte [ebx],cl
   
;sub  [test_outch.x_coord],2
;
;push dword '>'
;mov  cl,1
;push dword 0
;call test_outch
;add  esp,8
;
;sub  [test_outch.x_coord],6
   
  xor  eax,eax
  ret
;E:.
   
_OS_callo:
;B+ Alloc memory
  ;find all size
  mov  eax,[esp+4]
  mov  ebx,[esp+8]
  mul  ebx
 push eax
   
  ;clear memory
  mov  edi,[.mem_p]
  xor  eax,eax
  mov  ecx,[esp]
  cld
rep  stosb
   
  ;update new memory pointer
 pop  ebx
 push dword [.mem_p]
  add  ebx,7
  and  ebx,not 7
  add  [.mem_p],ebx
   
  ;return value
 pop  eax
  ret
   
.mem_p dd mem_heap
;E:.
   
_OS_exit:
;B+ Exit program
;  ;TMP
;  mov  eax,-1
;  int  0x40
  mov  esp,[exit_esp]
  sub  esp,4
  ret
;E:.
   
;E:.
   
   
   
   
;B+ Test procedures
   
;B+ Definitions
LEFTMARGIN equ 11
BEGIN_CHARS equ 20
NL equ 10
;E:.
   
print_textcolor dd 0x00ffff
   
_file_beg:
;B+ Show begin of file - test fopen
 ;esp+4 - file handle (descriptor)
   
  mov  eax,[esp+4]
  mov  ebx,10 shl 16 + 30
  mov  ecx,[print_textcolor]
  mov  edx,[eax+4]
  mov  esi,BEGIN_CHARS
  mov  eax,4
  int  0x40
  ret
;E:.
   
_outstrg:
;B+ Draw black text - test function call
 ;esp+4*4 - x
 ;esp+4*3 - y
 ;esp+4*2 - *c
 ;esp+4*1 - len
   
  mov  ebx,[esp+4*4]
  shl  ebx,16
  mov  bx,[esp+4*3]
  mov  ecx,[print_textcolor]
  mov  edx,[esp+4*2]
  mov  esi,[esp+4]
  mov  eax,4
  int  0x40
  ret
;E:.
   
test_outch:
;B+ Draw one char - use as _OS_fputc, to test printf(...)
 ;esp+8 - char to write
   
  ;this is test! \b \r - not nesessary
   
  mov  al,[esp+8]
  cmp  al,NL
  jne  .no_newline
  add  [.y_coord],10
  mov  [.x_coord],LEFTMARGIN
  ret
.no_newline:
   
  mov  ebx,[.x_coord]
  shl  ebx,16
  mov  bx,word [.y_coord]
  mov  ecx,[print_textcolor]
  mov  [.out_char],al
  mov  edx,.out_char
  mov  esi,1
  mov  eax,4
  int  0x40
   
  add  [.x_coord],6
;mov  eax,5
;mov  ebx,5
;int  0x40
  ret
   
.x_coord dd LEFTMARGIN
.y_coord dd 60
.out_char db 0
;E:.
   
;E:.
   
;B+ Data section
;B+ Memory managment
g_fileend dd g_handle+files*4*4 ;from 2MB+100*4*4
   
;E:.
   
;B+ File parameters
file_parameters:
 dd 0x0 ; mode
 dd 0x0  ; first block
 dd 1000 ; block read
 dd -1   ; return place
 dd fileinfo ; work area
filepath: times 100 db 0
   
p_filename dd 0x0
;E:.
;E:.
   
  ;TO DO
  mov  eax,-1
  int  0x40
  ;TO DO
   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -