汇编网首页登录博客注册
qiushuo888的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
文章收藏
友情链接

[2009-02-10 12:05] 课程设计(一)

本人学习王爽老师的汇编原理有一段时间,以下是课程设计1的代码,希望能与各位学友一同探讨,一同进步。


assume cs:code

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 

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



temp segment
db 10 dup(0)
temp ends


code segment
start:
mov ax,data
mov ds,ax
mov ax,temp               ;暂存已分离数字的数据段
mov ss,ax
mov si,0
mov di,0
mov bx,0
mov bp,168
mov cx,21
mov dh,1
mov dl,1
s:
push cx                   ;保存循环次数
push dx                   ;保存屏幕显示的行数和列数
mov ax,ds:[si]            
mov dx,ds:[si+2]          ;开始读取年份的数据,由于是double word,存取年份的内存占4个字节
call ddtoc                ;调用ddtoc子程序   
                          ;该程序能将内存中的dd型数据转变为表示十进制数的字符串
mov cl,2                  ;设定字体的前景和背景色
pop dx                    ;设定显示字体的行数和列数
call show_str             ;调用显示字符串的子程序


add dl,10
push dx
mov ax,ds:[si+84]
mov dx,ds:[si+86]
call ddtoc
mov cl,2
pop dx
call show_str


add dl,12
push dx
mov ax,ds:[bp]
mov dx,0
call ddtoc
mov cl,2
pop dx
call show_str


add dl,10
push dx
mov ax,ds:[si+84]
mov dx,ds:[si+86]
mov cx,ds:[bp]
call divdw
call ddtoc
mov cl,2
pop dx
call show_str




inc dh
mov dl,1
add si,4
add bp,2
pop cx
loop s

mov ax,4c00H
int 21H



ddtoc:                      ;将dword型数据转变为表示十进制数的字符串,
                            ;字符串以0为结尾符

 a:  push si
     push bx
     push ax
     push cx
     push dx
     
     mov si,0               
 b:                          ;算法思想:通过不断除以10,将所得的余数不停入栈,
     mov cx,10               ;就能将该数据的每一数字分离出来
     call divdw 
     add cx,30H
     push cx
     mov bx,ax
     or  ax,dx
     mov cx,ax
     mov ax,bx
     jcxz c
    
     mov cx,0
     inc si
     jmp short b
     
 c:  mov cx,si
     inc cx
     mov si,0
     
     d:pop ax
       mov ss:[si],al
       inc si
       loop d
     mov byte ptr ss:[si],0
     mov si,0
     pop dx
     pop cx
     pop ax
     pop bx
     pop si
     ret




show_str:                              ;该子程序能在指定的位置,用指定的颜色,
         push si                       ;显示一个用0结束的字符串
         push ax                       ;参数:(dh)=行号(取值范围1-25),
         push bx                       ;(dl)=列号(取值范围1-80),(cl)=颜色  
         push dx
         push di

         mov ax,0B800H
         mov es,ax
         mov bx,0
         mov ch,0
         
         
         mov di,0
         sub dh,1
         mov al,0A0H
         mul dh
         mov bx,ax

         sub dl,1
         mov al,2
         mul dl
         mov di,ax
   
         mov al,cl
         mov ch,0
         mov si,0

display: mov cl,ss:[si]               ;从暂存数据段 读取数据,逐一写入显存.
         jcxz ok                      ;如果读取到0,就停止读取数据
         mov es:[bx+di],cl
         mov es:[bx+di+1],al
         inc si          
         add di,2
         jmp short display

ok      :pop di
         pop dx
         pop bx
         pop ax
         pop si
         ret


divdw:  push ax                      ;该程序 能进行不会产生溢出的除法运算,
                                     ;被除数为dword,除数为word,结果为dword
        mov ax,dx                    ;参数(ax)=dword型数据的低16位,
                                     ;参数(dx)=dword型数据的高16位,(cx)=除数
        mov dx,0                     ;返回(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
        div cx                        
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        ret  

mov ax,4c00H
int 21H
code ends
end start
评论次数(0)  |  浏览次数(256)  |  类型(默认类型:汇编原理) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码