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

📄 ccomp.asm

📁 small c complier 它也Menuet OS的一个附件,同样他也是有汇编实现
💻 ASM
字号:
;
;   TEST
;   Compile with FASM for Menuet
;
   
;B+ System header
use32
org    0x0
  db     'MENUET01'
  dd     0x01
  dd     START
  dd     I_END
  dd     0x400000
  dd     0x7fff0
  dd     0x0,0x0
;E:.
   
;B+ Include C files
  ; Compiler tools
  include "INTRINS.ASM"
   
  ; C Library ("stdio.asm")
  include "LIBSTD.ASM"
   
  ; MenuetOS implement
  include "OSFUNC.ASM"
   
_fopen  equ _OS_fopen
_fputc  equ _OS_fputc
_fgetc  equ _OS_fgetc
_fclose equ _OS_fclos
   
  ;Main program (compiled from C)
  include "GETARG.ASM"
  include "CC1.ASM"
  include "CC2.ASM"
  include "CC3.ASM"
  include "CC4.ASM"
;E:.
   
START:
;B+ Main cycle
  call draw_window
still:
  mov  eax,10
  int  0x40
still1:
   
  cmp  eax,1
  je   red
  cmp  eax,2
  je   key
  cmp  eax,3
  je   button
  jmp  still
   
red:
  call draw_window
  jmp  still
   
key:
  mov  eax,2
  int  0x40
  jmp  still
   
button:
  mov  eax,17
  int  0x40
   
  cmp  ah,1
  jne  .noclose
  mov  eax,-1
  int  0x40
.noclose:
   
  cmp  ah,2
  jne  .no_run
;  call begin_osfunc
;B+ Copy file path
  mov  esi,inp_path
  mov  edi,filepath
  mov  ecx,[p_len]
 push ecx
  cld
rep movsb
 pop  ecx
  add  ecx,filepath
  mov  [p_filename],ecx
;E:.
;B+ Clear word area
  mov  ebx,10 shl 16 + 280
  mov  ecx,60 shl 16 + 250
  mov  edx,0x303030
  mov  eax,13
  int  0x40
;E:.
;B+ Init parameters
  mov  ecx,_input
  sub  ecx,_nogo
  mov  edi,_nogo
  xor  eax,eax
  cld
rep stosb
  mov  [_input],-1
  mov  [_input2],-1
  mov  [_usexpr],1
  mov  [_ccode],1
  mov  [_quote],34
  mov  [test_outch.y_coord],60
;E:.
  call init_osfunc
 push dword 4
 push args
;B+ Save exit ESP
  mov  [exit_esp],esp
;E:.
  call _main
  add  esp,8
;  call end_osfunc
.no_run:
   
  cmp  ah,3
  jne  .no_path
  mov  eax,inp_path
  mov  bx,27
  call read_string
  mov  edx,[r_pos]
  mov  [p_len],edx
  ;
  cmp  ah,10
  je   still
  jmp  still1
.no_path:
   
  cmp  ah,4
  jne  .no_file
  mov  eax,inp_file
  mov  bx,42
  call read_string
  mov  edx,[r_pos]
  mov  [f_len],edx
  ;
  cmp  ah,10
  je   still
  jmp  still1
.no_file:
   
  jmp  still
;E:.
   
read_string:
;B+ Read string
  mov  [c_place],eax
  mov  [r_pos],0
  mov  [rel_x],60
  mov  [rel_y],bx
   
  mov  ebx,60
  shl  ebx,16
  mov  bx,6*26+1
  movzx ecx,[rel_y]
  shl  ecx,16
  mov  cx,10
  mov  edx,0x000000
  mov  eax,13
  int  0x40
   
  add  ecx,11 shl 16
  mov  cx,2
  mov  edx,0x999999
  int  0x40
   
.next:
  mov  ebx,[rel_x]
  shl  ebx,16
  mov  bx,7
  movzx ecx,[rel_y]
  shl  ecx,16
  mov  cx,10
  mov  edx,0x000000
  mov  eax,13
  int  0x40
   
  mov  ebx,[c_place]
  mov  byte [ebx],0
   
  mov  eax,10
  int  0x40
  cmp  eax,2
  je   .key
  jmp  .to_ret
.key:
   
  mov  eax,2
  int  0x40
  cmp  ah,13
  jne  .no_enter
  jmp  .to_ret
.no_enter:
   
  cmp  ah,8
  jne  .no_back
  cmp  [r_pos],0
  je   .next
  dec  [r_pos]
  dec  [c_place]
  sub  [rel_x],6
  jmp  .next
.no_back:
   
  cmp  [r_pos],25
  je   .next
   
  cmp  ah,'a'
  jb   .no_sm_l
  cmp  ah,'z'
  ja   .no_sm_l
  add  ah,'A'-'a'
.no_sm_l:
   
  mov  byte [ebx],ah
  mov  [char],ah
  inc  [c_place]
  inc  [r_pos]
   
  mov  ebx,[rel_x]
  inc  ebx
  shl  ebx,16
  mov  bx,[rel_y]
  inc  bx
  mov  ecx,0x00ffff
  mov  edx,char
  mov  esi,1
  mov  eax,4
  int  0x40
   
  add  [rel_x],6
  jmp  .next
   
.to_ret:
 push eax
  mov  ebx,60
  shl  ebx,16
  mov  bx,6*26+1
  movzx ecx,[rel_y]
  add  ecx,11
  shl  ecx,16
  mov  cx,2
  mov  edx,0x000000
  mov  eax,13
  int  0x40
 pop  eax
  ret
   
rel_x dd 60
rel_y dw 0x0
c_place dd 0x0
r_pos dd 0x0
char db '?'
;E:.
   
draw_window:
;B+ Draw window
  mov  eax,12
  mov  ebx,1
  int  0x40
   
  mov  ebx,100*65536+300
  mov  ecx,100*65536+320
  mov  edx,0x02000000
  mov  esi,0x805080d0
  mov  edi,0x005080d0
  mov  eax,0
  int  0x40
   
  mov  ebx,8*65536+8
  mov  ecx,0x10ddeeff
  mov  edx,caption
  mov  esi,caption_end-caption
  mov  eax,4
  int  0x40
   
  mov  ebx,(300-19)*65536+12
  mov  ecx,5*65536+12
  mov  edx,1
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40
   
;B+ Hot buttons
  mov  ebx,220 shl 16 + 70
  mov  ecx,25 shl 16 + 29
  mov  edx,2 ; compile
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40
   
  mov  ebx,10 shl 16 + 47
  mov  ecx,26 shl 16 + 12
  mov  edx,3 ; path
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40
   
  mov  ebx,10 shl 16 + 47
  mov  ecx,41 shl 16 + 12
  mov  edx,4 ; file name
  mov  esi,0x6688dd
  mov  eax,8
  int  0x40
;E:.
   
;B+ Text in buttons
  mov  ebx,231 shl 16 + 36
  mov  ecx,0x10ffffff
  mov  edx,txt_compile
  mov  esi,txt_compile_end-txt_compile
  mov  eax,4
  int  0x40
   
  mov  ebx,14 shl 16 + 28
  mov  ecx,0xffffff
  mov  edx,txt_path
  mov  esi,txt_path_end-txt_path
  int  0x40
   
  mov  ebx,14 shl 16 + 43
  mov  edx,txt_file
  mov  esi,txt_file_end-txt_file
  int  0x40
;E:.
   
;B+ Draw path / file name
  mov  ebx,61 shl 16 + 28
  mov  ecx,0x00ffff
  mov  edx,inp_path
  mov  esi,[p_len]
  mov  eax,4
  int  0x40
   
  mov  ebx,61 shl 16 + 43
  mov  ecx,0x00ffff
  mov  edx,inp_file
  mov  esi,[f_len]
  mov  eax,4
  int  0x40
;E:.
   
  mov  eax,12
  mov  ebx,2
  int  0x40
   
  ret
;E:.
   
;B+ Data area
   
;B+ Interface
inp_path: times 100 db '/RD/1/',0
p_len dd 6
inp_file: times 100 db 'PROG',0
f_len dd 4
   
txt_compile db 'Compile'
txt_compile_end:
txt_path    db 'Path ->'
txt_path_end:
txt_file    db 'File ->'
txt_file_end:
;E:.
   
;B+ Main arguments
args dd arg_str0,inp_file,arg_str2,arg_str3,arg_str4
   
arg_str0 db 'CC',0
arg_str1 db 'prog',0
arg_str2 db '-m',0
arg_str3 db '-a',0
arg_str4 db '-p',0
;E:.
   
;B+ System parameters
exit_esp dd 0x0
;E:.
   
caption db  'Small C compiler for MenuetOS'
caption_end:
   
times 8-($ mod 8) db 0
;E:.
   
I_END:
   

⌨️ 快捷键说明

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