课题设计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个循环,逐行显示
来源:CSDN
作者:无名至尊
链接:https://blog.csdn.net/qq_41955402/article/details/104317747