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

📄 1.asm

📁 大型汇编程序管理系统
💻 ASM
📖 第 1 页 / 共 3 页
字号:
              lea       dx,msg02;display prompt
              int       21h
    iloop:    cmp       stustored,29
              ja        i1
              call near ptr       inputname  ;输入学生姓名
              cmp       namelen,0
              je       i2
              call near ptr       inputnum  ;输入学生学号
              call near ptr       inputsco  ;输入成绩
              call near ptr       stor;往内存表中写入一项
              jmp       iloop
              mov   saveflag,0
              jmp       i2 
    i1:       mov       ah,9
              lea       dx,msg20;'There are more than 30 students.'
              int       21h
    i2:       showmsg back;'Press any key to back.'
    i3:       
              mov       saveflag,0    
              pop dx
              pop ax            
              ret
input        endp
;----------------------------------------------------------------------
inputname   proc       near
;void inputname()   输入学生姓名
   push ax
            push dx
            push bx
            push cx
            
            showmsg   03
            mov        ah,0ah
            lea        dx,namepar
            int        21h
            crlfm
            mov        bh,0
            mov        bl,namelen
            mov        cx,7
            sub        cx,bx
    n10:    mov        namefld[bx],20h;空余部分用空格填充
            inc        bx
            loop       n10
            
            pop cx
            pop bx
            pop dx
            pop ax
            ret  
inputname   endp
;-----------------------------------------------------------------------
inputnum   proc        near 
;void inputnum()   输入学生学号
            push ax
            push dx
            push bx 

	
            push cx

            showmsg   04
            mov        ah,0ah
            lea        dx,numpar
            int        21h
            crlfm
            mov        bh,0
            mov        bl,numlen
            mov        cx,9
            sub        cx,bx
    n20:    mov        numfld[bx],20h;空余部分用空格填充
            inc        bx
            loop       n20
            
            pop cx
            pop bx
            pop dx
            pop ax
            ret  
inputnum     endp   
;----------------------------------------------------------------------    
inputsco      proc     near
;void inputsco()  输入学生成绩
   push ax
            push dx
            push bx
            push cx
            
            showmsg 05
            mov        ah,0ah
            lea        dx,scopar
            int        21h
            crlfm
            mov        bh,0
            mov        bl,scolen
            mov        cx,4
            sub        cx,bx
    n21:    mov        scofld[bx],20h;空余部分用空格填充
            inc        bx
            loop       n21
             
            pop cx
            pop bx
            pop dx
            pop ax
            ret  
inputsco    endp
;------------------------------------------------------------------------
print proc near
;void print() 输出整个studentx表
  push si
  push cx
  push dx
  push ax
  
  cmp stustored,0
  je qprint
  
        crlfm               ;回车、换行
        crlfm              ;
        
  showmsg printtitle
  showmsg sepln;打印表头
        lea si,studentx
        mov cx,stustored
pline:  call near ptr  printline
        loop pline              ;没输完则循环输出

  pop ax
        pop dx
        pop cx
        pop si
qprint: ret
print endp
;------------------------------------------------------------------------
printline proc near
;void printline() 打印一行,需要预先设置si
  push di
  push cx
  push dx
  push ax
  
  lea di,studisp;stutemp=studentx[i]
        mov cx,6 ;每一次loop si会自动修正
        rep movsb              ;
        mov [studisp+6],9
        add di,1
        
        mov cx,8
        rep movsb
        mov [studisp+15],9
        add di,1
        
        mov cx,3
        rep movsb
        
        mov ah,9
        lea dx,studisp
        int 21h
        crlfm
        showmsg sepln
        
        pop ax
        pop dx
        pop cx
        pop di
        ret
printline endp         
;------------------------------------------------------------------------
deciasc proc near
;把10进制数转换成相应的ASCII码,digit in bl
 mov ch,100d
 mov cl,10d
 ;mov dh,3d;
re:
 ;判断退出条件
 cmp ch,0
 je qdeci

 ;取每一10进制位上的数字
 mov al,bl;
 cbw
 div ch;
 mov bl,ah;余数继续除相应权,取相应位的10进制数字

 call near ptr  printit

 ;除数ch=ch/10
 mov al,ch
 cbw
 div cl
 mov ch,al
 ;dec dh
 jmp re
qdeci:
 ret
deciasc endp
;--------------------------------------------------------------------
printit  proc near;输出1位数字对应的ASCII码,binary number in bl
 add al,30h
 mov dl,al
 mov ah,2
 int 21h
 ret;ret不能少!
printit  endp
;--------------------------------------------------------------------
stor2       proc        near
;void stor2() 从stutemp临时变量中往内存studentx表中写入一条item
   push si
   push di
   push ax
   push bx
   push cx
   
            cmp         stutemp,0;写入item不为空
            je          exitt
            lea         si,stutemp
            lea         di,studentx
            mov         ax,stustored
            mov         bl,17
            mul         bl
            add         di,ax
            mov         cx,17;
            rep         movsb
            inc         stustored
            
            pop cx
            pop bx
            pop ax
            pop di
            pop si
  exitt:    ret
stor2       endp
;------------------------------------------------------------------------
get_path      proc     near   
;void get_path() 从输入端获取文件路径
 push ax
 push bx
 push dx
 
 showmsg   22;'Please input the file you want to operate:'
 ;crlfm   
 mov      ah,0ah
 lea      dx,pathpar
 int      21h
 ;crlfm
 mov      bl,pathlen
 mov      bh,0
 mov      pathnam[bx],0
 
 pop dx
 pop bx
 pop ax
 ret
get_path     endp
;--------------------------------------------------------------------
openh         proc      near
;void openh()   打开一个磁盘文件,取得文件句柄并保存
   push ax
   push cx
   push dx
    
              call near ptr       get_path
              mov       ah,3dh
              mov       cx,0;0=读
              lea       dx,pathnam
              int       21h
              jc        o1
              mov       filehandle,ax
             pop dx
             pop cx
             pop ax
             ret
o1:        mov    endcde,01;打开文件出错处理,置endcde为1
              lea       dx,opnmsg
              call near ptr       errm
              
             pop dx
             pop cx
             pop ax
              ret    
openh endp
;--------------------------------------------------------------------
readall        proc       near   
;void readall() 从磁盘文件中读取全部item信息到内存中
   push ax
   
            mov        endcde,0
            call near ptr        openh
            cmp        endcde,0
            jne        rexit;endcde=1,结束
            mov        stustored,0
   contin:  call near ptr        readh
            cmp        endcde,0
            jne        r20;endcde=1,结束            
            call near ptr        stor2
            cmp        stustored,30
            ja         oexit
            jmp        contin         
   r20:     call near ptr        clseh
      call clear
      call cursor
            showmsg    23
            jmp        rexit
   oexit:   call near ptr clseh
            mov        saveflag,0
            showmsg    09;  
   rexit:   showmsg    back;
            ;mov        ah,1
            ;int        21h
            
            pop ax              

	
            ret
readall        endp
;-----------------------------------------------------------------------
readh       proc       near
;void readh()  从文件中读出一条项目到临时变量stutemp中
   push ax
   push bx
   push cx
   push dx
   
            mov        ah,3fh;read file
            mov        bx,filehandle
            mov        cx,17
            lea        dx,stutemp
            int        21h
            jc         c1;如果出错输出信息
            cmp        ax,0
            je         c2;ax=0,end of file,quit
            cmp        stutemp,1ah;EOF Marker?
            je         c2
            pop dx
     pop cx
     pop bx
     pop ax
            ret
  c1:       lea        dx,readmsg
            call near ptr        errm
  c2:       mov        endcde,1
  
     pop dx
     pop cx
     pop bx
     pop ax
            ret
readh       endp
;-----------------------------------------------------------------------
save        proc       near   ;将内存studnetx表中全部学生信息写入到磁盘文件
;void save()
   push cx
   push ax
   
            mov        errcde,0
            call       near ptr clear
            call       near ptr cursor
            call       near ptr creath
            cmp        errcde,0
            jne        s2
   sloop:   mov        cx,stustored;一次循环写入一条学生信息
            cmp        stusaved,cx
            je         sexit;注意!这里是je而不是ja(调试发现)! ??
            call near ptr        writh
            cmp        errcde,0
            jne        sexit
            jmp        sloop
   sexit:   call near ptr        clseh
            mov        saveflag,1
            showmsg    07
   s2:    showmsg    exit
            anykey
            mov        stusaved,0
         
         pop ax
         pop cx
         ret
save        endp
;------------------------------------------------------------------------
creath        proc     near   ;创建磁盘文件并获得句柄
;void creath()
    push ax
    push cx
    push dx
   
              showmsg  21
              call near ptr     get_path
              crlfm
              mov      ah,3ch;3ch:建立文件
              mov      cx,0
              lea      dx,pathnam
              int      21h ;03-6-10 20:42
              jc       a1
              mov      filehandle,ax
              pop dx
              pop cx
              pop ax
              ret
       a1:    lea      dx,opnmsg
              call     errm
              
              pop dx
              pop cx
              pop ax
              ret
creath       endp
;------------------------------------------------------------------------
clseh         proc      near
;void clseh()  clsoe a file
 push ax
 push bx          
      mov       ah,3eh
      mov       bx,filehandle
      int       21h
      
      pop bx
      pop ax
      ret
clseh         endp
;------------------------------------------------------------------------
writh        proc    near  ;将一条item写入到磁盘文件
             mov     ax,stusaved
             mov     bl,17
             mul     bl
             lea     dx,studentx            
             add     dx,ax;dx指向第一条未保存的item的首地址
             mov     ah,40h
             mov     bx,filehandle
             mov     cx,17;cx:写入的字节数
             int     21h
             inc     stusaved
             jnc     d1
             lea     dx,wrtmsg;出错处理
             call near ptr     errm
       d1:   ret
writh        endp
;------------------------------------------------------------------------
clear      proc       near   
;clear screen  
     push ax
     push bx
     push cx
     push dx
     
           mov    AX,0600H  ;clear screen
       mov    CX,0
       mov    DX,174FH
       mov    BH,07
       int    10H
           
           pop dx
           pop cx
           pop bx
           pop ax
           ret
clear      endp  
;------------------------------------------------------------------------
;SetCursor
cursor     proc       near   
     push ax
     push bx
     push dx
     
           mov        ah,2
           mov        bh,0;bh=页号
           mov        dx,0;dh:row,dl:column
           int        10h
           
           pop dx
           pop bx
           pop ax
           ret
cursor     endp
code ends
end start 

⌨️ 快捷键说明

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