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

我的博客

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

[2011-05-03 12:17] 用自己的方法写的课程设计1

图片载入中
这个是我学习王爽汇编至今为止用的时间最久写的一个程序了,它比较综合,运用到了很多方法和语句,所以我坚持用自己的方法去完成它,哪怕写很久也要自己写,但是幸亏我思考了3天写出来了,哈哈 一直在整理自己的思路。也希望大家在写这个程序的时候不要去看别人写的,实在不行了才去看看人家的思路。
  写这个代码给我带来的启示:在写程序的时候写想好要用到哪些子程序,子程序的参数靠哪些寄存器来传递,哪些参数是必须要有的,哪些可以把它在子程序里面定死,必须要有的也就是一些在不同情况下需要改变的参数,需要在主调程序里面进行改变的,比如我写的时候我就把显示缓存中的颜色给定死了,因为这里用不到他,我们的目的是把内存中的数字按格式显示在屏幕上。还有就是遇到困难的时候一定不能浮躁,要静心慢慢的调试,一般逻辑错误找起来比较困难,编译错误的话按masm上提示的行数去找一下就一般可以解决了。还有要注意细节,有可能会因为漏打了一个字母,而调用了另一个子程序,在差错的时候很不容易发现的。我就是这样的,因为这样你在找子程序的时候根本就找不到错的地方。希望大家也能顺利的完成这个设计。一起加油,明天是美好的!


assume cs:code,ds:data
;============================数据段=======================================
;----------------------------DATA--------------------------------------
data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984'         ;0
  db '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994'         ;
  db '1995'
;-------------------------------------------------------------------------
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,345980         ;54h
  dd 590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;-------------------------------------------------------------------------
  dw 3,7,9,13,28,38,130,220,476,770,1001,1442,2258,2793,4037,5635,8226             ;0a8h
  dw 11542,14430,15257,17800
;-------------------------------------------------------------------------
  dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260          ;d2h
  dw 304,333
data ends
;----------------------------DATA--------------------------------------

;----------------------------table--------------------------------------
table segment
db 16 dup (0)
table ends
;----------------------------table--------------------------------------
;============================数据段=======================================
code segment
start:mov ax,data
  mov ds,ax        ;设定要读取的数据在data段
  mov si,0         ;设定数据的位置
  mov dl,0         ;设定行
  mov dh,0         ;设定列
  mov cx,21
  mov bl,4          ;设定字符数
s1:call show_word
  add si,4
  inc dl
  loop s1

  mov si,54h     ;设置好将要读入数据的首地址
  mov dl,0        ;设置行
  mov dh,19       ;设置列
  mov cx,21       ;设置循环
s2:call dword1
  mov bx,di       ;设置字符个数
  mov ax,table
  mov ds,ax       ;设定需要读取数据的段
  push si
  mov si,0
  call show_word
  pop si
  add si,4
  inc dl
  loop s2

  mov si,0a8h     ;设置好将要读入数据的首地址
  mov dl,0        ;设置行
  mov dh,49       ;设置列
  mov cx,21       ;设置循环
s3:call word1
  mov bx,di       ;设置字符个数
  mov ax,table
  mov ds,ax       ;设定需要读取数据的段
  push si
  mov si,0
  call show_word
  pop si
  add si,2
  inc dl
  loop s3


  mov si,0d2h     ;设置好将要读入数据的首地址
  mov dl,0        ;设置行
  mov dh,69       ;设置列
  mov cx,21       ;设置循环
s4:call word1
  mov bx,di       ;设置字符个数
  mov ax,table
  mov ds,ax       ;设定需要读取数据的段
  push si
  mov si,0
  call show_word
  pop si
  add si,2
  inc dl
  loop s4
  
  mov ax,4c00h
  int 21h


;---------------------------show_word-----------------------------------
;需读取的数据段地址为DS段寄存器,在调用的时候设置
;显示缓存的段地址用ES来设置
;si指向需读取数据的偏移地址,在调用的时候设置
;dl:传送行信息
;dh:传送列信息  下面用BX保存计算好的显示的首地址
;bl字符个数
;颜色默认绿色
show_word:push ax
  push bx
  push cx
  push dx
  push di
  push si           ;寄存器入栈

  mov ax,0b800h
  mov es,ax         ;设置显存段地址

  mov ch,0          ;这里设置循环次数
  mov cl,bl         ;
  
  mov al,0a0h
  mul dl
  mov bx,ax         ;计算出行坐标,用BX保存
  mov al,2
  mul dh
  add bx,ax         ;计算出列坐标,并用BX来存放显示的首坐标


show_word_s1:mov al,ds:[si]  ;读取数据
  mov es:[bx],al      ;将数据传入显存
  mov byte ptr es:[bx+1],2    ;设置颜色
  inc si
  add bx,2
  loop show_word_s1

  pop si
  pop di
  pop dx
  pop cx
  pop bx
  pop ax
  ret
;---------------------------show_word-----------------------------------

;----------------------------word1---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
word1:push ax
  push bx
  push cx
  push dx
  push si           ;寄存器入栈

  mov ax,data
  mov ds,ax
  mov ax,table
  mov es,ax         ;这里设置读取与写入的内存的段

  mov bx,10         ;设置除数
  mov di,0          ;设定写入的位置


  mov ax,ds:[si]    ;用ax读入字

word_s1:mov dx,0
  div bx            ;AX中存着商,dx中存放余数,dl中放着余数
  add dl,30h              ;转换成对应的字符
  mov es:[di],dl        ;将字符写入内存
  inc di                ;指向下一个内存单元
  mov cx,ax             ;商为了则跳出
  jcxz word_ok
  jmp short word_s1

word_ok:mov ax,di
  mov bl,2
  div bl                       ;al中存放着需要循环的次数
  mov ch,0
  mov cl,al                      ;设置循环
  jcxz word_end                 ;判断cx中的循环次数是否为0,为0就不转换了
  mov si,0
  mov bx,di
  dec bx
word_s2:mov al,es:[bx]
  mov ah,es:[si]
  mov es:[bx],ah
  mov es:[si],al
  inc si
  dec bx
  loop word_s2


word_end:pop si
  pop dx
  pop cx
  pop bx
  pop ax
  ret
;----------------------------word---------------------------------------

;----------------------------Dword---------------------------------------
;si:指向需要读入的数据
;执行完后di存放着字符个数
dword1:push ax
  push bx
  push cx
  push dx
  push si           ;寄存器入栈

  mov ax,data
  mov ds,ax
  mov ax,table
  mov es,ax         ;这里设置读取与写入的内存的段

  mov bx,10         ;设置除数
  mov di,0          ;设定写入的位置
  
  mov dx,0
  mov ax,ds:[si+2]  ;读入高位被除数
  div bx            ;高位商在ax中,余数在DX中
  mov cx,ax         ;将高位商传到cx中 
  mov ax,ds:[si]    ;读入低位被除数,高位被除数在DX中
  div bx            ;ax中是低位商,DX中是余数
dword_s1:add dl,30h
  mov es:[di],dl   ;将余数存数内存
  inc di                ;指向下一个内存单元
  mov dx,0
  
  push cx
  add cx,ax
  jcxz dword_ok
  pop cx

  push ax                 ;将低位商入栈
  mov ax,cx               ;读入高位商
  div bx                 ;高位商在AX中,余数在DX中
  mov cx,ax             ;将高位商传到cx中 
  pop ax                 ;读入低位被除数,高位在DX中
  div bx
  jmp short dword_s1
  
  
  
dword_ok:pop cx
  mov ax,di
  mov bl,2
  div bl                       ;al中存放着需要循环的次数
  mov ch,0
  mov cl,al                      ;设置循环
  jcxz dword_end                 ;判断cx中的循环次数是否为0,为0就不转换了
  mov si,0
  mov bx,di
  dec bx
dword_s2:mov al,es:[bx]
  mov ah,es:[si]
  mov es:[bx],ah
  mov es:[si],al
  inc si
  dec bx
  loop dword_s2


dword_end:pop si
  pop dx
  pop cx
  pop bx
  pop ax
  ret
;----------------------------Dword---------------------------------------
code ends
end start
评论次数(0)  |  浏览次数(578)  |  类型(我的代码) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码