. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  大吼一声,课程设计一完工,爽!请各位点评  [待解决] 回复[ 3次 ]   点击[ 298次 ]  
minghunjason
[帖 主]   [ 发表时间:2009-08-31 17:53 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23
总算可以进军十一章了,在第十章停了将近5天,差点暴走,附上程序,和各位分享,请各位点评!
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 512 dup(0)
stack ends

code segment                  
  start:mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov si,0
        mov di,640
        mov sp,512
        mov bp,0
        mov bx,10
        mov ax,47104
        mov es,ax
        mov cx,21
        push si
        push bx
        push di
        call nian       ;显示年代
        pop di
        pop bx
        mov si,0
        call renjun     ;计算人均
        mov cx,21
        mov ax,0
        mov si,0
        call divdw      ;总收入数据转换ascll码压栈
        call bei        ; 准备数据
        mov bx,16       ;显示位置
        mov si,bx       ;保存位置
        call show_str   ;显示总收入
        mov dx,0        ;dx清零
        mov si,0        ;si清零
        call zifu       ;雇员和人均转换ascll码压栈 
        call bei         
        mov bx,38        
        mov si,bx       
        call show_str   ;显示雇员
        call bei        
        mov bx,56
        mov si,bx
        call show_str   ;显示人均
        mov ax,4c00h
        int 21h

  nian:push cx                        ;显示年的子程序
        mov cx,4
        mov bx,0
      s1:mov al,ds:[si]
        mov ah,2
        mov word ptr es:[di+bx],ax
        inc si
        dec cx
        add bx,2
        jcxz ok
        jmp short s1
      ok:add di,160
        pop cx
        jcxz ot
        loop nian
    ot:ret

    bei:mov di,640                  ; 准备数据子程序
        mov cx,21
        mov bp,0
        mov ax,47104
        mov es,ax
        ret
   
 renjun:pop es                      ;计算人均子程序
        mov cx,21
     s3:mov ax,ds:[si+86]
        mov dx,0
        div word ptr ds:[bp+168] 
        mov bx,ax
        mov ax,ds:[si+84]
        div word ptr ds:[bp+168] 
        mov ds:[bp+212],bx
        mov ds:[bp+210],ax
        add bp,2
        add si,4
        jcxz ok1
        loop s3
    ok1:mov bp,0
        push es
        ret
       
show_str:pop ax                    ;显示子程序
         mov bp,cx
       c:pop cx
         jcxz  d 
         mov ch,2
         mov word ptr es:[di+bx],cx
         add bx,2
         jmp short c
       d:add di,160
         mov bx,si
         dec bp
         mov cx,bp
         jcxz ot2
         jmp short c
     ot2:push ax
          ret
  
   divdw:pop es                  ;总收入转换子程序
      s4:mov bx,10
         mov bp,cx 
         mov ax,ds:[si+166]
         mov dx,0
         div bx
         mov di,ax
         mov ax,ds:[si+164]
         div bx
         add dx,30h
         push dx
         sub si,4
      s5:mov cx,10
         mov bx,ax
         mov ax,di
         mov dx,0
         div cx
         mov di,ax
         mov ax,bx
         div cx
         add dx,30h
         push dx
         mov cx,ax
         jcxz s6
         jmp short s5
      s6:dec bp
         mov cx,bp
         jcxz ok2
         mov bx,0
         push bx
         jmp short s4
     ok2:push es
         ret
  
    zifu:pop es             ;雇员和人均转换子程序
         mov cx,42
         mov bp,cx
      s8:mov ax,ds:[si+250]
         mov bx,10
         sub si,2
      s7:div bx
         add dx,30h
         push dx
         mov dx,0
         mov cx,ax
         jcxz s9
         jmp short s7
      s9:dec bp
         mov cx,bp
         jcxz ok3
         mov bx,0
         push bx
         jmp short s8
     ok3:push es
         ret
code ends
end start
minghunjason
[第1楼]   [ 回复时间:2009-08-31 20:36 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23
发现一重大问题,好像循环出现了问题,再找找看,按g命令显示两次
minghunjason
[第2楼]   [ 回复时间:2009-08-31 21:07 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23
感觉注释添加的太少,自己看了都有点晕,再多写点注释,我的程序还有点问题,还要向大家请教,按两次g命令
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 512 dup(0) 
stack ends 

code segment                   
  start:mov ax,data 
        mov ds,ax 
        mov ax,stack 
        mov ss,ax 
        mov si,0 
        mov di,640     ;确定显示数据的行号起始点
        mov sp,512 
        mov bp,0 
        mov bx,10 
        mov ax,47104   ;显卡地址起始点
        mov es,ax 
        mov cx,21 
        push si 
        push bx 
        push di 
        call nian       ;显示年代 
        pop di 
        pop bx 
        mov si,0 
        call renjun     ;计算人均 
        mov cx,21 
        mov ax,0 
        mov si,0 
        call divdw      ;总收入数据转换ascll码压栈 
        call bei        ; 准备数据,后面show_str里面要用到得常量数据 
        mov bx,16       ;确定显示数据的列位置 
        mov si,bx       ;保存位置 
        call show_str   ;显示总收入 
        mov dx,0        ;dx清零 
        mov si,0        ;si清零 
        call zifu       ;雇员和人均转换ascll码压栈  
        call bei          
        mov bx,38         
        mov si,bx        
        call show_str   ;显示雇员 
        call bei         
        mov bx,56 
        mov si,bx 
        call show_str   ;显示人均 
        mov ax,4c00h 
        int 21h 
;--------------------------------------------------------------下面是子程序
  nian:push cx                                                                            ;显示年的子程序 
        mov cx,4                      ;年份内循环次数
        mov bx,0 
      s1:mov al,ds:[si] 
        mov ah,2                      ;数据颜色
        mov word ptr es:[di+bx],ax    ;将数据放入显视段
        inc si 
        dec cx                        
        add bx,2                      ;列号增加
        jcxz ok                       ;一组数据输入完毕,跳到ok
        jmp short s1   
      ok:add di,160                   ;行号增一
        pop cx                        ;外循环次数出栈
        jcxz ot 
        loop nian 
    ot:ret 

    bei:mov di,640                                                                        ; 准备数据子程序 
        mov cx,21 
        mov bp,0 
        mov ax,47104 
        mov es,ax 
        ret 
    
 renjun:pop es                      ;保存下一条指令地址                                   ;计算人均子程序 
        mov cx,21 
     s3:mov ax,ds:[si+86]           ;
        mov dx,0 
        div word ptr ds:[bp+168]  
        mov bx,ax 
        mov ax,ds:[si+84] 
        div word ptr ds:[bp+168]  
        mov ds:[bp+212],bx 
        mov ds:[bp+210],ax 
        add bp,2 
        add si,4 
        jcxz ok1 
        loop s3 
    ok1:mov bp,0 
        push es 
        ret 
        
show_str:pop ax                                                                             ;显示子程序 
         mov bp,cx                 ;保存循环次数
       c:pop cx                    ;将栈中数据出栈,若为零则一组数据输完,跳至d处
         jcxz  d  
         mov ch,2 
         mov word ptr es:[di+bx],cx 
         add bx,2 
         jmp short c 
       d:add di,160                ;增加行号
         mov bx,si                 ;将调用show_str之前的保存的列地址付给bx,还原列号
         dec bp                    ;循环数自减
         mov cx,bp 
         jcxz ot2                  ;显示结束,跳出
         jmp short c 
     ot2:push ax 
          ret 
   
   divdw:pop es                                                                             ;总收入转换子程序 
      s4:mov bx,10 
         mov bp,cx                ;用divdw进行不会产生溢出的除法运算
         mov ax,ds:[si+166] 
         mov dx,0 
         div bx 
         mov di,ax                ;保存高位的商,为下面子循环准备
         mov ax,ds:[si+164] 
         div bx 
         add dx,30h 
         push dx                  ;字符入栈
         sub si,4 
      s5:mov cx,10                ;一次除法运算后,进行余下字符转换
         mov bx,ax                ;保存低位商
         mov ax,di                ;调出高位商
         mov dx,0 
         div cx 
         mov di,ax 
         mov ax,bx 
         div cx 
         add dx,30h 
         push dx 
         mov cx,ax 
         jcxz s6 
         jmp short s5 
      s6:dec bp 
         mov cx,bp              ;循环自减
         jcxz ok2 
         mov bx,0 
         push bx 
         jmp short s4 
     ok2:push es 
         ret 
   
    zifu:pop es                                                                          ;雇员和人均转换子程序 
         mov cx,42             ;雇员和人均为同类数据一并处理压栈
         mov bp,cx 
      s8:mov ax,ds:[si+250]    ;从后往前压
         mov bx,10 
         sub si,2 
      s7:div bx 
         add dx,30h 
         push dx 
         mov dx,0 
         mov cx,ax 
         jcxz s9 
         jmp short s7 
      s9:dec bp 
         mov cx,bp 
         jcxz ok3 
         mov bx,0 
         push bx 
         jmp short s8 
     ok3:push es 
         ret 
code ends 
end start
minghunjason
[第3楼]   [ 回复时间:2009-08-31 21:11 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2009-08-13 10:23
为什么完了,屏幕翻页还是绿色的
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved