汇编语言王爽第九部分(使用LIB分文件编写课题设计1)

微笑、不失礼 提交于 2020-02-14 22:38:38

课题设计1

在这里插入图片描述
需要编写3个函数,分别用三个asm保存,使用分文件的好处是
lib文件里面包括了一些常用的库函数,常用的操作等等,这样在需要这些东西时,就不需要重复一直打这些代码。

编写show.asm

public show
assume cs:code


code segment
show proc far
 
   push ax
   push bx
   push cx
   push dx
   push si
   push di
   push es

   mov ax,0b800h
   mov es,ax
   mov ax,0a0h
   mul dh
   mov bx,ax

   mov ax,2
   mul dl
   add bx,ax
    
   mov dl,cl 
s:
   mov cl,[si]
   mov ch,0
   jcxz s_ok
   mov al,cl
   mov ah,dl
   mov es:[bx],ax
   inc si
   add bx,2
   jmp short s
s_ok:
   pop es
   pop di
   pop si
   pop dx
   pop cx
   pop bx
   pop ax

   retf

show endp
code ends
end
 










第二个是解决除法溢出divdw.asm

public divdw
assume cs:code

code segment

divdw proc far
 
 push si
 push bx
 mov bx,ax
 mov ax,dx
 mov dx,0
 div cx
 mov si,ax
 mov ax,bx
 div cx
 mov cx,dx
 mov dx,si
 pop bx
 pop si


retf
divdw endp
code ends
end 

第三个是数值转化dtoc.asm

extrn divdw:far
public dtoc
assume cs:code

code segment

dtoc proc far
   push ax
   ;push bx
   push cx
   push dx
   push si
   push di
  
   mov di,0
s: 
   mov cx,10
   call divdw
   add cx,30h
   push cx
   inc di
   mov cx,ax
   jcxz s1
   mov cx,0
   jcxz s2
 s1:mov cx,dx
   jcxz ok
 s2:
   jmp short s

ok:
   mov cx,di
s4:pop [si]
   inc si
   loop s4
   mov byte ptr [si],' '
   pop di
   pop si
   pop dx
   pop cx
   ;pop bx
   pop ax
retf

dtoc endp
code ends
end 

最后一个是main.asm

extrn dtoc:far,show:far

assume cs:codeseg,ss:stacksg,ds:datasg,es:table

stacksg segment
  db 272 dup(0)
stacksg ends

datasg segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  db '1993','1994','1995'


  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000
  dd 5937000


  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

  dw 11542,14430,15257,17800
 showdata db 256 dup(' ')
datasg ends

table segment
  db 21 dup('year summ ne ?? ')
table ends

codeseg segment
start: 
   mov ax,datasg
   mov ds,ax
   mov ax,table
   mov es,ax
   mov ax,stacksg
   mov ss,ax
   mov sp,256
   mov si,0
   mov di,0
   mov bx,0

   mov cx,21
   s:
     push cx
     mov cx,4
   
     s0:
       mov al,[si]  
       mov es:[bx+di],al
       mov al,[si+54h]
       mov es:[bx+di+5],al
       inc si
       inc di
     loop s0
     mov di,0
     add bx,10h
   pop cx
   loop s



   mov si,0
   mov bx,0
   mov di,0
   mov cx,21
   s2:
     push cx
     mov cx,2
   
     s22:
       mov al,[si+0A8h]
       mov es:[bx+di+0AH],al
       inc si
       inc di
     loop s22
     mov di,0
     add bx,10h
   pop cx
   loop s2
 
   mov cx,21
   mov bx,0
   s3:
    mov ax,es:[bx+5h]
    mov dx,es:[bx+7h]
    div word ptr es:[bx+0ah]
    mov es:[bx+0dh],ax	
    add bx,10h	
   loop s3
;;;;;;;;;;;;;;;;;;;
;以下为显示处理
   mov bx,0
   mov di,0
   mov cx,21
hand:

   call handle
   add bx,10h
   inc di
   
  loop hand
   mov ax,4c00h
   int 21h


handle:
 push si
 push di
 push ax
 push bx
 push cx
 push dx

 mov si,offset showdata
 mov ax,es:[bx+2]
 mov dx,es:[bx+0]
 ;call dtoc
 mov [si],dx
 mov [si+2],ax
 add si,10

 mov ax,es:[bx+5]
 mov dx,es:[bx+7]
 call dtoc
 add si,10
 
 mov ax,es:[bx+10]
 mov dx,0
 call dtoc
 add si,10

 mov ax,es:[bx+0dh]
 mov dx,0
 call dtoc
 add si,10
 mov byte ptr [si],0

 mov ax,di

 mov dh,al
 mov dl,0
 mov cl,3
 mov si,offset showdata
 call show


 pop dx
 pop cx
 pop bx
 pop ax
 pop di
 pop si

ret
codeseg ends

end start

main.asm的思路就是把数据存到table段里,然后用21个循环,逐行显示

在这里插入图片描述

代码

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!