. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课设1编译成功,思路很清晰啊!  [待解决] 回复[ 1次 ]   点击[ 429次 ]  
michael47
[帖 主]   [ 发表时间:2010-11-07 11:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-13 21:26
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
        dd 5937000

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

        db 10 dup (0)
data ends

stack segment
        dw 20h dup (0)
stack ends

code segment
start:  mov ax,data
        mov ds,ax

        mov ax,stack
        mov ss,ax
        mov sp,40h
          
        mov di,0        ;ds:di年份,收入dword型数据的地址
          mov bx,0        ;ds:bx指向人数word型数据
          mov si,210        ;存放分解数据的地方,也是显示数据的所在地
          mov dh,3        ;显示的行数
        mov cx,21        ;共21组数据
m:          push cx
          push dx
         ;显示年份
          mov ax,[di]        ;低位给ax
          mov [si],ax
          mov dx,[di+2]        ;高位给dx
          mov [si+2],dx
          mov byte ptr [si+4],0 
        
          pop dx
          mov dl,33
          mov cl,2
          call show_str
          ;显示收入
          push dx
            mov ax,[di+84]
          mov dx,[di+84+2]
          call dtoc
        
          pop dx
          mov dl,48
          mov cl,2
          call show_str
         ;显示人数
          push dx
          mov ax,[bx+168]
          mov dx,0 
          call dtoc

          pop dx
          mov dl,60
          mov cl,2
          call show_str
          ;显示人均收入
          push dx
          mov ax,[di+84]
          mov dx,[di+84+2]
             div word ptr [bx+168]
        
          mov dx,0
          call dtoc
        
          pop dx
          mov dl,75
          mov cl,2
          call show_str

          inc dh        ;显示到下一行
          add di,4        ;指向下一组数据
          add bx,2
          pop cx
          loop m
          mov ax,4c00h
          int 21h
;名称:dtoc
;功能:将dword型数转变为表示十进制数的字符串,字符串以0为结尾符
;参数:(ax)=dword型数据的低16位
;(dx)=dword型数据的高16位
;ds:si指向字符串的首地址
;返回:无

dtoc:   push bx        ;寄存器入栈
        push cx
        push dx
        push si

        mov bx,0        ;bx计数
s2:     mov cx,10        ;除数
        call divdw

        add cx,30h        ;十进制数据加30H
        push cx                ;数据入栈
        inc bx        ;计数器加1

        mov cx,dx;判断商的高位是否为0
        jcxz s0        ;为0判断低位
        jmp short s2        ;不为0接着除
s0:     mov cx,ax                ;判断低位是否为0
        jcxz s1        ;为零,数据分解完,放到指定地点,ds:si
        jmp short s2        ;不为0接着除

s1:     mov cx,bx        ;计数值给cx,把在栈中的数据放到指定地点
s3:     pop bx
        mov [si],bl
        inc si
        loop s3
        mov byte ptr [si],0

        pop si
        pop dx
        pop cx
        pop bx
        ret

;名称:divdw
        ;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,        ;结果为dword型
        ;参数:(ax)=dword型数据的低16位
        ;(dx)=dword型数据的高16位
        ;(cx)=除数
        ;返回:(dx)=结果的高16位,(ax)=结果的低16位
        ;(cx)=余数
        ;
divdw:  push bx        ;bx应该入栈
        push ax
        mov ax,dx                ;计算H/N
        mov dx,0
        div cx
                ;此时int(H/N)在ax中,ren(H/N)在dx
        mov bx,ax                ;将int(H/N)存在bx中
        pop ax                ;此时dx=ren(H/N),ax=L
        div cx                ;此时ax=低16位值,dx=余数
        mov cx,dx                ;余数给cx
        mov dx,bx                ;高16位给dx
        pop bx
        ret

 ;名称:show_str
        ;功能:在指定的位置ds:si,用指定的颜色,显示一个用0结束的字符串
        ;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
        ;返回:无
show_str:
        push ax
        push es
        push dx        ;寄存器入栈
        push bx
        push si

        mov ax,0b800h        ;指向显存
        mov es,ax
        mov al,160
          dec dh                ;定位行,因为屏幕行数从0开始,所以减1
        mul dh
        mov bx,ax

        mov al,2
          dec dl                ;定位列,因为屏幕列数从0开始,所以减1
        mul dl
        add bx,ax                ;最后屏幕位置定义在bx中

        mov ah,cl

str:    mov cl,ds:[si]
        mov ch,0
        jcxz ok                ;判断是否为0

        mov es:[bx],cl        ;放入字符
        mov es:[bx+1],ah        ;放入颜色值

        inc si
        add bx,2
        jmp short str

ok:    ;为0返回
          pop si
        pop bx
        pop dx
        pop es
        pop ax
        ret


code ends
end start
michael47
[第1楼]   [ 回复时间:2010-11-07 11:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-13 21:26
经验是:子程序写得好。主程序根本没费什么事嘛
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved