. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计一  [已解决] 回复[ 2次 ]   点击[ 528次 ]  
q470393267
[帖 主]   [ 发表时间:2009-04-15 11:55 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
逃了一天课总算是把课程设计一 完成了,我知道程序还能简化,可你们得知道我大脑都快受不了 我只想让大家知道我已经完成了课程设计一,我过段时间会把程序优化的~ 呵呵,还有谢谢给我留言的那个游客,你应该是在给我做课程设计一提意见吧,不过现在我什么问题都不敢想了,就把作业交了吃饭去~ 我会好好消化你的意见的! 
电脑调试结果: http://www.asmedu.net/blog/user/bigimg.jsp?neighborId=20202&pic=post_1239764898828.jpg
我的学习博客:http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=20202&kindId=30785&postId=34494&readSg=1

assume cs:code,ds:data,ss:stack  
data 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,5937000  
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226  
        dw 11542,14430,15257,17800  
        dw 21 dup (0) 
data ends  
stack segment  
 dw 16 dup (0)  
stack ends 
code segment 
p:        mov  ax,4c00h 
          int  21h 
start:    mov  ax,data 
          mov  ds,ax 
          mov  ax,stack 
          mov  ss,ax 
          mov  sp,20h 
          mov ax,0b800h 
          mov es,ax 
          mov bp,0  ;用为显示时的行指针 
          mov cx,2000h 
          call s    ;清屏 
          mov  dh,4 ;从第4行开始显示   
          mov  si,0 
          mov  di,0 
          mov  bx,0 
          mov al,10 
          mul dh 
          add ax,0b800h 
          mov es,ax 
          mov  cx,21 
          call s2 ;显示年份 
          mov  cx,21 
          call s5 ;显示总收入 
          mov  cx,21 
          call d ;求人均收入 
          mov  cx,21 
          call d2 ;显示公司职员人数 
          mov cx,21 
          call d7 
          jmp p 
           
s:        push bp ;清屏 
s1:       mov ax,0 
          mov es:[bp],ax 
          add bp,2  
          loop s1 
          pop bp 
          ret 
   
       
           
s2:       push di 
          push bp        
s3:       push cx           
          push si  
          mov cx,4  
s4:       mov al,[di] ;取年份的ASCII码 
           mov ah,7 
          mov es:[bp+si].20,ax ;从第10列开始显示年份 
           inc di 
          add si,2 
          loop s4 
          pop si 
          pop cx 
          add bp,160 ;换行 
          loop s3 
          pop bp 
          pop di  
          ret 
s5:       push dx 
          push bx 
          push si 
          push bp 
s6:       mov si,0 
          push cx     
          mov ax,[bx].54h 
          mov dx,[bx].56h 
s7:       push ax 
          mov cx,10 
          mov ax,dx 
          mov dx,0 
          div cx 
          mov di,ax 
          pop ax 
          div cx  
          add dx,30h 
          push dx          
          mov dx,di 
          inc si 
          mov cx,dx 
          jcxz s8 
          jmp short s7 
s8:       mov cx,ax 
          jcxz s9 
          jmp short s7 
s9:       mov cx,si 
          mov si,0 
s0:       pop ax 
          mov ah,7 
          mov es:[bp+si].40,ax 
          add si,2 
          loop s0 
          pop cx 
          add bx,4 
          add bp,160 
          loop s6 
          pop bp 
          pop si  
          pop bx 
          pop dx  
          ret 

d:        push dx 
          push bx 
          push si 
d1:       push cx 
          mov ax,[bx].54h 
          mov dx,[bx].56h 
          div word ptr [si].0a8h 
          mov [si].0d2h,ax 
          add si,2 
          add bx,4 
          pop cx 
          loop d1 
          pop si  
          pop bx 
          pop dx  
          ret 
d2:       push bp 
          push bx 
          push si 
d3:       push cx 
          mov si,0 
          mov ax,[bx].0a8h 
d4:       mov cx,10 
          mov dx,0 
          div cx 
          add dx,30h 
          push dx 
          inc si 
          mov cx,ax 
          jcxz d5 
          jmp short d4 
d5:       mov cx,si 
          mov si,0 
d6:       pop ax 
          mov ah,7 
          mov es:[bp+si].70,ax 
          add si,2 
          loop d6   
          pop cx 
          add bx,2 
          add bp,160 
          loop d3 
          pop si 
          pop bx 
          pop bp 
          ret 
                             
d7:       push bp 
          push bx 
          push si          
d8:       push cx 
          mov si,0 
          mov ax,[bx].0d2h 
d9:       mov cx,10 
          mov dx,0 
          div cx 
          add dx,30h 
          push dx 
          inc si 
          mov cx,ax 
          jcxz d0    
          jmp short d9 
d0:       mov cx,si 
          mov si,0 
q:        pop ax 
          mov ah,7 
          mov es:[bp+si].100,ax 
          add si,2 
          loop q   
          pop cx 
          add bx,2 
          add bp,160 
          loop d8 
          pop si 
          pop bx 
          pop bp 
          ret 
code ends 
end start
q470393267
[第1楼]   [ 回复时间:2009-04-15 22:44 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
优化后的程序~
 呵呵,本人表达能力有限不能完全把我的程序给大家注释,希望大家能耐心的看下,谢谢~ 
assume cs:code,ds:data,ss:stack 
data 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,5937000 
        dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 
        dw 11542,14430,15257,17800 
        dw 23 dup (0) 
data ends 
stack segment 
 dw 16 dup (0) 
stack ends
code segment
p:        mov  ax,4c00h
          int  21h
start:    mov  ax,data
          mov  ds,ax
          mov  ax,stack
          mov  ss,ax
          mov  sp,20h
          mov  ax,0b800h
          mov  es,ax
          mov  bp,0  ;用为显示时的行指针
          mov cx,2000h
          call s    ;清屏
          mov  dh,3 ;从第3行开始显示
          mov  di,0
          mov  bx,0
          mov al,10
          mul dh
          add ax,0b800h
          mov es,ax
          mov  si,20
          mov  cx,21
          call s2 ;显示年份
          mov  cx,21
          call d ;求人均收入
          mov si,70
          mov bx,0a8h
          mov cx,21
          call d2 ;显示人员总数
          mov si,100
          mov cx,21
          mov bx,0d2h
          call d2 ;显示人均收入 
          mov cx,21
          mov bx,0
          mov si,40
          call s5 ;显示总收入
          jmp p

s:        push bp ;清屏
s1:       mov ax,0
          mov es:[bp],ax
          add bp,2 
          loop s1
          pop bp
          ret

s2:       push di
          push bp       
s3:       push cx          
          push si 
          mov cx,4 
s4:       mov al,[di] ;取年份的ASCII码
          mov ah,7
          mov es:[bp+si],ax 
          inc di
          add si,2
          loop s4
          pop si
          pop cx
          add bp,160 ;换行
          loop s3
          pop bp
          pop di 
          ret
      
s5:       push bp
s6:       mov word ptr ds:[0fch],0 
          push si
          push cx    
          mov ax,[bx].54h
          mov dx,[bx].56h
s7:       push ax
          mov cx,10
          mov ax,dx
          mov dx,0
          div cx
          mov word ptr ds:[0feh],ax
          pop ax
          div cx 
          add dx,30h
          push dx         
          mov dx,word ptr ds:[0feh]
          inc word ptr ds:[0fch]
          mov cx,dx
          jcxz s8
          jmp short s7
s8:       mov cx,ax
          jcxz s9
          jmp short s7
s9:       call show
          add bx,4
          add bp,160
          pop cx
          pop si
          loop s6
          pop bp 
          ret      

d:        push dx
          push bx
d1:       push cx
          mov ax,[bx].54h
          mov dx,[bx].56h
          div word ptr [di].0a8h
          mov [di].0d2h,ax
          add di,2
          add bx,4
          pop cx
          loop d1
          pop bx
          pop dx 
          ret

d2:       push bp
d3:       push si
          push cx
          mov word ptr ds:[0fch],0
          mov ax,[bx]
d4:       mov cx,10
          mov dx,0
          div cx
          add dx,30h
          push dx
          inc word ptr ds:[0fch]
          mov cx,ax
          jcxz d5
          jmp short d4
d5:       call show
          pop cx
          pop si
          add bx,2
          add bp,160
          loop d3
          pop bp
          ret

show:     mov cx,word ptr ds:[0fch] ;显示字符的子程序
          pop ax  
          mov word ptr ds:[0feh],ax
q:        pop ax
          mov ah,7
          mov es:[bp+si],ax
          add si,2
          loop q 
          push word ptr ds:[0feh] ;由于在执行call后ip会入栈,在这里我让ip先保存在已定义的一个内存单元中,再入栈就可以正确返回现场
          ret
code ends
end start
q470393267
[第2楼]   [ 回复时间:2009-04-26 19:44 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2009-04-04 22:58
此贴由 贴主 于 [ 2009-04-26 19:44 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved