. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课设一,我也来发一个,出来了,开心。。  [已解决] 回复[ 4次 ]   点击[ 503次 ]  
jhszcn
[帖 主]   [ 发表时间:2008-03-31 19:19 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
assume cs:codesg,ds:datasg,ss:stacksg

;=================================================================================================================================
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' 
                
        ;以上是表示21年的21个字符串 ,4*21=84个字符
  

        dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 

        dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 

        ;以上是表示21年公司总收的21个dword型数据 ,4*21=84个字符

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

        dw 11542,14430,45257,17800 
                ;2*21=42个字符
                dd 32 dup (0)

        ;以上是表示21年公司雇员人数的21个word型数据 

datasg ends 

;========================================================================================================================
;数据段

stacksg segment

        dd 16 dup(0)
        
stacksg ends

;===============================================================================================================================
;栈段

codesg segment 

start:                 
                               
                        mov ax,datasg
                   mov ds,ax
                        mov ax,stacksg
                        mov ss,ax
                        mov sp,64
                        mov cx,21                ;输入21行
                        mov ax,0b81eh
                        mov es,ax
                        
;=======================================================================================================================
                        sub di,di                ;人数起始地址
                        sub bx,bx                ;ds起始地址
                        mov si,10                ;es起始地址
;========================================================================================================================

        main:        call far ptr showrow        ;调showrow子程序(参数:si,bx,di)
                        add bx,4
                        add si,160
                        add di,2
                        loop main
                        mov ax,4c00h
                        int 21h
                        
        showrow:        
                                        push cx                        ;主程序循环变量
;============================================================================================================
;输出年份                        
                                        mov cx,4                ;年份4字节,占4位
                                        push bx                        ;ds:bx压栈
                                        push si                        ;es:si压栈
                                        
                        year:        mov al,[bx]                                        
                                        mov es:0[si],al
                                        mov byte ptr es:1[si],2
                                        inc bx
                                        add si,2
                                        loop year                ;年份输出到屏幕
                                        pop si                        ;si出栈
                                        pop bx                        ;bx出栈
;======================================================================================================================
;输出公司年份总收入                                        
                                        
                                        push si
                                        push bx
;======================================================================================================
                                        mov ax,84[bx]                
                                        mov dx,86[bx]                ;总收入传到ax,dx中
                                        call far ptr dtoc        ;调dtoc子程序
                                        sub bx,bx
                        souru:        mov cx,210[bx]                ;dtoc传入ds:210[bx]的内容传给cx
                                        jcxz next                        ;是零就跳
                                        mov es:40[si],cx        ;不是零传到es:40[si]的位置屏幕
                                        add bx,2
                                        add si,2                        ;定位下一个字符
                                        loop souru
;========================================================================================================
                        next:        pop bx
                                        pop si
;=========================================================================================================================
;输出人数                                        
                                        push si
                                        push di
;===========================================================================================================
                                        mov ax,168[di]                ;人数传给ax
                                        mov dx,0
                                        call far ptr dtoc        ;调dtoc子程序
                                        sub di,di
                          renshu:        mov cx,210[di]                ;传好后的ds:210[di]传给cx
                                        jcxz next1                        ;是零就跳
                                        mov es:80[si],cx        ;不是零传到es:80[si]屏幕位置
                                        add di,2
                                        add si,2
                                        loop renshu
;===========================================================================================================
                        next1:        pop di
                                        pop si
;==============================================================================================================================
;输出人均收入                                        
                                        push si
                                        push di
;===========================================================================================================
                                        mov ax,84[bx]
                                        mov dx,86[bx]                ;总收入传到ax,dx
                                        mov cx,168[di]                ;人数传到cx
                                        call far ptr divdw        ;计算个人收入(结果在ax,dx)
                                        call far ptr dtoc        ;调用dtoc(参数ax,dx)
                                        sub di,di
                        money:        mov cx,210[di]        
                                        jcxz next3
                                        mov es:120[si],cx
                                        add di,2
                                        add si,2
                                        loop money
;============================================================================================================
                        next3:        pop di
                                        pop si
;=================================================================================================================================
;进入下一次循环的准备                                        
                                        
                                        pop cx
                                        retf
                                        
;==================================================================================================================================
;数值转字符子程序
        dtoc:        ;双字单元除十取余法(参数ax,dx)
                        push cx
                        push dx
                        push si
                        push di
                        push bp
                        push bx
                        mov cx,10
                        mov si,0
                        push si                        ;零压栈,方便出栈
                s:        call far ptr divdw                ;ax,dx,cx,      divdw子程序参数
                        
                        ;jcxz out1                ;余数是零出loop
                        add cx,30h                ;数字转字符
                        push cx                        ;非零压栈
                        mov cx,ax
                        add cx,dx
                        jcxz out1
                        mov cx,11
                        loop s
                out1:        
                        mov bx,210d                ;(ds)*16+(210)这个位置放临时数据
                s1:        pop cx                        ;cx临时变量
                        jcxz out2                ;pop出来是零退出
                        mov [bx],cl                ;传到[bx]
                        mov byte ptr [bx+1],2        ;输出样式
                        add bx,2                ;定位下个字符
                        loop s1
                out2:        
                        mov word ptr [bx],0
                        pop bx
                        pop bp
                        pop di
                        pop si
                        pop dx
                        pop cx
                        retf
                        
;===========================================================================================================================
;不溢出除法

;公式:X/N=int(H/N)*65536+[rem(H/N)*65536十L]/N
divdw:   ;(参数,ax,bx,cx)
        push bx        ;子程序用到的寄存器入栈 
        push ax        ;被除数的低16位入栈 
          
        mov ax,dx       
        sub dx,dx
        div cx         ;先用被除数的高16位除以除数  
        mov bx,ax      ;将int(H/N)存储到bx中,rem(H/N)自动存储到dx  
          
        pop ax         ;被除数的低16位出栈  
        div cx         ;用被除数的低16位除以除数 
        mov cx,dx      ;将余数存储到cx  
        mov dx,bx      ;将商的高16位存储到dx,商的低16位自动存储到ax  

        pop bx         ;子程序用到的寄存器出栈 
        retf
codesg ends
fishboy
[第1楼]   [ 回复时间:2008-04-01 20:11 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
恭喜,恭喜!
xiaochong
[第2楼]   [ 回复时间:2008-04-01 20:12 ]   [引用]   [回复]   [ top ] 
荣誉值:45
信誉值:0
注册日期:2007-05-05 09:01
楼主加油,继续前行吧!
jhszcn
[第3楼]   [ 回复时间:2008-04-02 14:15 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
谢谢大家的支持,我会更加努力
jhszcn
[第4楼]   [ 回复时间:2008-04-02 14:16 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
此贴由 贴主 于 [ 2008-04-02 14:16 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(fishboy):3分   2楼(xiaochong):3分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved