|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- assume cs:code,ss:stack,ds:data
- data segment
- dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
- dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
- dd 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,5937000
- dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
- dd 11542,14430,15257,17800
- dd 32 dup (0)
- data ends
- stack segment
- dw 32 dup(0)
- stack ends
- code segment
- start:
- mov ax,data
- mov ds,ax
- mov ax,stack
- mov ss,ax
- mov sp,64
-
-
- mov bx,0
- mov si,84
-
-
-
-
-
- mov cx,21 ;13
-
- kaa:
- push cx ;
-
-
-
- mov ax,[bx]
- push ax
- mov ax,[bx+2] ; 1a
- push ax
-
- pop dx
- pop ax ;
- call dtoc ;20
-
-
-
- mov byte ptr ds:[256],2 ;23
-
- mov dh,ds:[256] ;显示年份
- mov dl,2
- mov cx,2
-
- call sss ;31
- ;显示年份
-
-
-
- ;收入
-
-
-
- mov ax,[bx+si] ;34
- push ax
- mov ax,[bx+si+2]
- push ax
- pop dx
- pop ax
- call dtoc ;3d
-
-
-
-
-
- mov dh,ds:[256] ;40 ;显示收入
- mov dl,7
- mov cx,2
-
-
-
- call sss ;49
-
- ;显示收入
-
-
-
-
- ;人数
-
-
- mov ax,[bx+si+84] ;4c
- push ax
- mov ax,[bx+si+86]
- push ax
- pop dx
- pop ax
- call dtoc ;56
-
-
-
-
- mov dh,ds:[256] ;59 ;显示人数
- mov dl,15
- mov cx,2
-
-
- call sss ;62
-
- ;显示人数
-
-
-
-
-
- mov ax,[bx+si] ;68 ;准备收入(被除数);69
- push ax ;高16位
- mov ax,[bx+si+2] ;68
- push ax ; 低16位
-
-
- mov ax,[bx+si+84] ;6c ;准备除数(人数)
- push ax
-
- pop cx ; ;准备除平均
- pop dx
- pop ax ;6a
-
-
- call divdw ;73 ;作除法
-
-
-
-
-
- call dtoc ;76
-
-
- mov dh,2 ;显示平均数
- mov dl,20
- mov cx,2
-
-
- call sss ;80
-
-
-
-
-
-
- inc dh
- add bx,4 ;85
-
-
- mov cl,ds:[256] ;88
- inc cl
- mov ds:[256],cl
-
-
- pop cx
-
-
-
-
- loop kaa ;93
-
-
-
-
-
-
-
-
-
-
- jx: mov ax,4c00h ;95
- int 21h ;86
-
-
-
-
-
-
-
-
-
-
-
- dtoc: ;抽取数字,并转化为SACII码
- push dx
- push cx
- push ax
- push si
- push bx
-
-
- mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
-
- s1: mov cx,10
-
-
- call divdw ;a6
- mov di,cx ;把余数给di临时保存
- mov cx,ax ;商给CX,用来判断商是否为零; a4
-
-
- jcxz s2 ;如果CX=0则跳到S1
-
- mov cx,di ;恢复CX内值
-
-
- add cx,30h ;余数加30H,得到相应的ASCII码 ,b1
- push cx ;保存到栈
- inc bx ;
-
-
-
- jmp short s1
-
-
- s2:
- mov cx,di ;b8
- add cx,30h ;商为0时,余数为个位,ba
- push cx ;b6
-
- inc bx ;be ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
-
- mov cx,bx ;用CX出栈,把总进栈次数给CX
- mov di,cx ;本程序中,用来保存长度
- mov si,257 ;c3
- mov ds:[si],cl
-
- s3:
- pop ax ;
-
- mov ds:[si+1],al
- inc si ;
-
- loop s3 ;cd
-
-
-
-
-
- ;s3实现将栈中的数据依次出栈,放到指定内存
-
-
- pop bx ;cf ;bx压进去对,取出来就不对了??
- pop si ;
- pop ax
- pop cx
- pop dx
- ret ; d4
-
-
-
- sss: ;子程序 用来显示
- push bx
- push si
- push dx
-
-
- mov ax,cx ;颜色给ax
- mov cl,ds:[257] ;d9 ds:{256]中的1怎么变成了4????
-
- ss1a: push cx ;dd ;这里显示位置有问题!!!!
-
-
- mov si,257 ;d2
-
- call show_str ;在指定位置显示 ,d5
- inc si ;e4
- inc dl
-
- pop cx ;e7
-
-
-
- loop ss1a ;e8
-
- pop dx
- pop si
- pop bx
-
-
- ret ;e2
-
-
-
- divdw: ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数 ,b6
- ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
- push si ;e4
- push bx
-
-
- push ax ;低16位先保存
- mov ax,dx ;ax这时候的值是高16位了
- mov dx,0 ;dx置零是为了不影响下边余数位,使得高16位为0
-
- div cx ;H/N(16位除法)
- mov bx,ax ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
-
-
- pop ax ;ax的值现在是L(低16位)
- div cx ;L/N(16除法),ax被除数低16位,dx被除数高16位
-
- mov cx,dx
- mov dx,bx
-
- pop bx
- pop si
- ret ;107
-
-
-
-
-
-
- show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
- ; ds:si指向字符串首地址
-
- push cx ;cc
- push si
-
-
-
- mov cx,ax ;颜色给cx
-
- mov ax,0b800h ;显存的开始地址
- mov es,ax ;10b ;ES中存放是显存的第0页(共0-7页)的起始段地址
-
- mov al,160 ;每行80字符即160字节
- dec dh ;第八行
- mul dh ;111
- mov bx,ax
-
- mov al,2 ;一个字符占二字节
- dec dl ;列从零开始,第三列,所以减一
- mul dl
-
- add bx,ax ;此时BX中放的是行与列的偏移地址
- mov di,0 ;di 指向显存的偏移地址
- mov al,cl ;把颜色参数,放到al;e6
-
- mov si,257
- mov cx,0
- mov cl,[si] ;128
-
- mov si,258
-
- str:
- mov ah,ds:[si] ;ds:[si]指向‘Wlcome to masm!',0,,,,e8
-
-
-
- mov es:[bx+si],ah ;偶字节放字符
- mov es:[bx+si+1],al ;奇字节放,颜色属性
-
- inc si
- loop str ;137
-
-
-
-
- ok: pop si
- pop cx
-
- ret ;显示字符串的子程序【定义结束】 ;13b
-
-
-
- code ends
- end start
-
-
复制代码
课程设计一完成了,但运行没有显示,不知道做的对不对;
谁帮我运行下,看这个完成没有 :handshake
|
|