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

📄 lm4.asm

📁 这是汇编课程设计的题目,内含有五个程序:图书管理系统,字符统计等.
💻 ASM
字号:
STACK SEGMENT PARA STACK 'STACK'
        DW 128 DUP(?)
STACK ENDS
;**************************************************************
string	macro	xp			      	               ;宏定义,输出提示字符串
	push	dx
	push	ax
	mov	ah,9
	lea	dx,str&xp
	int	21h
	pop	ax
	pop	dx
	endm

caidan  macro           
      string 0                                                   ;提示菜单
      string 1
      string 2
      string 3
      string 4
      string 5
      string 6
      
      endm 
;**************************************************************
EXTRA SEGMENT PARA 'EXTRA'

EXTRA ENDS
;**************************************************************

DATA SEGMENT PARA 'DATA' 
                        
str0  db 0ah,0dh,0ah,0dh,'* * * *  Choose * * * *','$'            ;数据均在数据段操作
str1  db 0ah,0dh,'* * *   i.insert  * * *','$'
str2  db 0ah,0dh,'* * *   s.search  * * *','$'
str3  db 0ah,0dh,'* * *   m.modify  * * *','$'
str4  db 0ah,0dh,'* * *   d.delete  * * *','$'
str5  db 0ah,0dh,'* * *   l.list    * * *','$'
str6  db 0ah,0dh,'* * *   q.exit    * * *',0ah,0dh,'$'

str8  db 0ah,0dh,0ah,0dh,'* * * * name  :','$'
str9  db 0ah,0dh,'* * * bianhao :','$'
str10 db 0ah,0dh,'* * * author  :','$'
str11 db 0ah,0dh,'* * * Input the delete name:','$'
str12 db 0ah,0dh,'* * * No Match!',0ah,0dh,'$'
str13 db 0ah,0dh,'* * * Delete finished!','$'
str14 db 0ah,0dh,'* * * Input the search name:','$'
str15 db 0ah,0dh,'* * * There no such book!','$'

messg db 30 dup(?)
geshu dw 0
num dw 0
array db 30 dup(30 dup(20h))
namesav db 10 dup(20h)
char db '$'
bianhaosav db 10 dup(20h)
char1 db '$'
authorsav db 10 dup(20h)
char2 db '$'
mshu dw 0
biaozhi dw -1

DATA ENDS


;***************************************************************
CODE SEGMENT PARA 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRA
MAIN PROC FAR
START:
        MOV AX,DATA
        MOV DS,AX  ;Let DS register have data segment address
        MOV AX,EXTRA
        MOV ES,AX  ;Let ES register have extra segment address
;**************************************************************     
lop:  caidan
      mov ah,01
      int 21h
l1:   cmp al,'i'                                           ;通过输入(i,s,m,d,l,q)调用功能模块
      jnz l2
      call insert
l2:   cmp al,'s'
      jnz l3
      call search
l3:   cmp al,'m'
      jnz l4
      call modify
l4:   cmp al,'d'
      jnz l5
      call delete
l5:   cmp al,'l'
      jnz l6
      call list
l6:   cmp al,'q'
      jnz lop                                             ;输入非功能键时跳回菜单
;***************************************************************
        MOV AH,4CH ;DOS function call
        INT 21H ;Return to DOS
MAIN ENDP                                                 ;主程序结束
;---------------------------------------------------------------


insert proc near

        push si                                            ; 先将要使用的寄存器压入栈
        push di
        push dx
        push ax
        push cx

        mov  si,0
        mov  di,si
        mov  bx,30                                           ;记录的长度固定
        mov  ax,geshu                                       
        mul  bx                                              ;插入新的记录时在字符串中的起始地址
        mov  si,ax

        mov  di,si
        mov  cx,10
        string 8                                             ;输入书的名字,名字长度为固定值10
inname:
        mov  ah,01
        int  21h
        cmp  al,13
        jz   innum 
        mov  byte ptr array[si],al    
        inc  si
        loop inname

innum:
        add  di,9                                              ;输入书的编号,有10个字节空间
        mov  si,di    
        mov  cx,10  
        string 9
iloop1:  inc  si
        mov  ah,01
        int  21h
        cmp  al,13
        jz   inauth
        mov  byte ptr array[si],al
        loop iloop1
inauth:
        add  di,10                                          ;输入书的作者,有10个字节空间
        mov  si,di
        mov  cx,10  
        string 10
iloop2:  inc  si
        mov  ah,01
        int  21h
        cmp  al,13
        jz   i_end
        mov  byte ptr array[si],al
        loop iloop2    


i_end:  add  geshu,1                                       ;记录书的个数
             

        pop  cx                                            ;将所有用到的寄存器按顺序出栈
        pop  ax
        pop  dx
        pop  di
        pop  si
      
        ret
insert endp
;-----------------------------------------------------------------
search proc near
       push  dx                                             ; 先将要使用的寄存器压入栈
       push  cx
       push  ax 
       push  bx
       push  si
       push  di

       mov   si,0
       mov   di,si
       mov   bx,si
       mov   ax,geshu                                             
       mov   num,ax
       string 14
s1:
       mov   ah,01                                         ;接收要查找的书本的名字,并将其逐个字符送入缓冲区中
       int   21h
       mov   byte ptr namesav[di],al
       cmp   al,13
       jz    s2
       inc   di
       jmp   s1
s2:    mov   ax,10
       sub   ax,di
       mov   bx,ax
      
s3:    mov   namesav[di],20h                               ;将未满10个字节的名字用20H填满,便于比较
       inc   di
       dec   bx
       jnz   s3
       lea   di,array
       mov   bx,0
s4:    lea   di,array                                      ;用si,di来进行逐字符的比较
       mov   cx,10
       add   di,bx
       lea   si,namesav
       repe  cmpsb
       jz    s_find                                        ;查到记录时,将该书本的所有资料全部输出

s5:    mov   cx,30                                           
       dec   num
       jz    no_match
       mov   ax,geshu                                     ;记录查找中的记录位置
       sub   ax,num
       mul   cx
       mov   bx,ax
       jmp   s4                                           ;用个数当循环控制条件   
s_find: 
       mov   cx,30
       mov   ax,geshu                                       
       sub   ax,num
       mul   cx
       mov   di,ax
       lea   si,array                                       ;查找时记录的书在字符串中的第i个,并将30当乘积因子  
       add   si,di
       mov   biaozhi,si
       string 8
       lea   di,namesav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,namesav
       int   21h
       
       string 9
       lea   di,bianhaosav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,bianhaosav
       int   21h

       string 10
       lea   di,authorsav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,authorsav
       int   21h
       jmp   s_end

no_match:
       string 12
s_end:
       pop   di                                          ;将所有用到的寄存器按顺序出栈
       pop   si
       pop   bx 
       pop   ax 
       pop   cx
       pop   dx
       ret
search endp
;------------------------------------------------------------------------
delete proc near
       push  dx                                             ; 先将要使用的寄存器压入栈
       push  cx
       push  ax 
       push  bx
       push  si
       push  di

       mov   si,0
       mov   di,si
       mov   bx,si
       mov   ax,geshu                                             
       mov   num,ax
       string 14
d1:
       mov   ah,01                                         ;接收要查找的书本的名字,并将其逐个字符送入缓冲区中
       int   21h
       mov   byte ptr namesav[di],al
       cmp   al,13
       jz    d2
       inc   di
       jmp   d1
d2:    mov   ax,10
       sub   ax,di
       mov   bx,ax
      
d3:    mov   namesav[di],20h                               ;将未满10个字节的名字用20H填满,便于比较
       inc   di
       dec   bx
       jnz   d3
       lea   di,array
       mov   bx,0
d4:    lea   di,array                                      ;用si,di来进行逐字符的比较
       mov   cx,10
       add   di,bx
       lea   si,namesav
       repe  cmpsb
       jz    d_find                                        ;查到记录时,将该书本的所有资料全部输出

d5:    mov   cx,30                                           
       dec   num
       jz    d6
       jnz   d7
d6:    jmp   no_be
d7:    mov   ax,geshu                                     ;记录查找中的记录位置
       sub   ax,num
       mul   cx
       mov   bx,ax
       jmp   d4                                           ;用个数当循环控制条件   
d_find: 
       mov   cx,30
       mov   ax,geshu                                       
       sub   ax,num
       mul   cx
       mov   di,ax
       lea   si,array                                       ;查找时记录的书在字符串中的第i个,并将30当乘积因子  
       add   si,di
       mov   biaozhi,si
       string 8
       lea   di,namesav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,namesav
       int   21h
       
       string 9
       lea   di,bianhaosav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,bianhaosav
       int   21h

       string 10
       lea   di,authorsav
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,authorsav
       int   21h

       mov   cx,30
       mov   si,biaozhi 
d_ccel:
       
       mov   byte  ptr [si],20h
       inc   si 
       loop  d_ccel
       jmp   d_end

no_be:
       string 15
d_end:
       pop   di                                          ;将所有用到的寄存器按顺序出栈
       pop   si
       pop   bx 
       pop   ax 
       pop   cx
       pop   dx
       ret
delete endp
;------------------------------------------------------------------------
modify  proc near
       push  dx                                             ; 先将要使用的寄存器压入栈
       push  cx
       push  ax 
       push  bx
       push  si
       push  di

       mov   si,0
       mov   di,si
       mov   bx,si
       mov   ax,geshu                                             
       mov   num,ax
       string 14
m1:
       mov   ah,01                                          ;接收要查找的书名,并将其逐个字符送入缓冲区中
       int   21h
       mov   byte ptr namesav[di],al
       cmp   al,13
       jz    m2
       inc   di
       jmp   m1
m2:    mov   ax,10
       sub   ax,di
       mov   bx,ax
      
m3:    mov   namesav[di],20h                                ;将未满10个字节的名字用20H填满,便于比较
       inc   di
       dec   bx
       jnz   m3
       lea   di,array
       mov   bx,0
m4:    lea   di,array                                         ;用si,di来进行逐字符的比较
       mov   cx,10
       add   di,bx
       lea   si,namesav
       repe  cmpsb
       jz    m_find                                                   

m5:    mov   cx,30                                           
       dec   num
       jz    m6
       jnz   m7
m6:
       jmp   no_modify
      
m7:    mov   ax,geshu                                          ;记录查找中的记录位置
       sub   ax,num
       mul   cx
       mov   bx,ax
       jmp   m4                                                ;用个数当循环控制条件   
m_find: 
       mov   cx,30
       mov   ax,geshu                                       
       sub   ax,num
       mul   cx
       mov  si,ax

       mov  di,si
       mov  cx,10
       mov   biaozhi,si                                        ;查到记录时,将该书的所有资料全部输出
       string 8
mname:
        mov  ah,01                                              ;将查找的书名输出  
        int  21h
        cmp  al,13
        jz   mname1 
        mov  byte ptr array[si],al    
        inc  si
        loop mname
mname1: mov  byte ptr array[si],20h
        inc  si
        loop mname1

mbianhao:
        add  di,9                                                ;将查找的书的编号输出                 
        mov  si,di
        mov  cx,10  
        string 9
mloop1:  inc  si
        mov  ah,01
        int  21h
        cmp  al,13
        jz   mbianhao1
        mov  byte ptr array[si],al
        loop mloop1
mbianhao1:                                                       
        mov  byte ptr array[si],20h
        inc  si
        loop mbianhao1

mauthor:
        add  di,10                                              ;将查找的书的作者输出
        mov  si,di
        mov  cx,10  
        string 10
mloop2:  inc  si
        mov  ah,01
        int  21h
        cmp  al,13
        jz   mauthor1
        mov  byte ptr array[si],al
        loop mloop2 
mauthor1:
        mov  byte ptr array[si],20h
        inc  si
        loop mauthor1 
        jmp  m_end
       
no_modify:
       string 15
m_end:
       pop   di                                               ;将所有用到的寄存器按顺序出栈
       pop   si
       pop   bx 
       pop   ax 
       pop   cx
       pop   dx
       ret

      
modify  endp
;-------------------------------------------------------------------------

list proc near
       push  si
       push  di
       push  bx
       push  ax
       push  cx
     
     
       mov   bx,geshu                                       ;用个数当输出所有记录的循环控制条件
       mov   si,0
       mov   di,si
       cld 
       lea   si,array
       
  
print:  
       
       string 8
       lea   di,namesav                                       ;对书名的输出
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,namesav
       int   21h
       
       string 9
       lea   di,bianhaosav                                     ;对编号的输出  
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,bianhaosav
       int   21h

       string 10
       lea   di,authorsav                                      ;对书的作者的输出
       mov   cx,10
       rep   movsb
       mov   ah,9
       lea   dx,authorsav
       int   21h
        
       dec   bx
       jnz   print
 
       pop   cx
       pop   ax
       pop   bx
       pop   di
       pop   si
       ret
list endp
;*********************************************************************************
CODE ENDS                                              ;子程序结束
        END START





⌨️ 快捷键说明

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