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

我的博客

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

[2009-02-06 23:18] 推荐博文 【课程设计1的拓展】打印九九乘法表

通过实验10以及课程设计一的实践,发现了不少问题,也收获了不少经验。我想学习本就是一个不断发现问题以及增长经验的过程。为了巩固一下之前的学习,加深对学过知识的理解,我想了一道题目,做为给自己的一个测试。之所以选这个九九乘法表,是因为它类似于课程设计一,之前写的几个子程序show_str、dtoc、divdw都能派上用场,且输出也有格式限制,我想用它来做一个课设一的补充题目是很合适的。
     这次写就轻松多了,我的思路是先把类似于1x1=输入到屏幕上,然后再集中解决相乘以后的十六进制数转化为字符串的问题。程序过程中我出现的几个错误及解决:
[1]写好运行第一遍时又出现了死循环,满屏幕的1,调试了一遍发现只是一个很小的笔误,使得程序每次都结束不了。再次提醒自己以后要细心!
[2]问题1解决后,第二遍出现了一个显示问题,就是相乘以后的结果显示不对。不是完全不对,而是每当结果是个位数,其十位上总会出现一些不相干的数字。我就想到了是每次循环data段中有残留数据的影响,后来每次循环前加了一句置0的代码,问题解决。
[3]第三遍调试没问题了,最后把清空缓存第一页的space子程序加上,在总循环前调用,先把显存全部用空格覆盖。这样程序执行后就只有九九乘法表在上面了,没有一些其他不相干的字符了。
    我想大家也可以自己做一些类似的小题目,就是大家刚开始学c的时候做的一些关于显示各种格式的图形的题目我觉得都比较合适。

【九九乘法表】

assume cs:code
data segment
   db 10 dup (0)
data ends
code segment
  start:   mov ax,0b80ah
           mov ds,ax
           mov ax,data
           mov es,ax
           mov ax,1
           mov cx,25
           mov si,0
           call space
           mov cx,9
           mov si,0
      s:   push si
           push cx
           push ax
           mov cx,ax
           mov bx,1
      s0:  push si
           push ax
           push bx
           add si,4
           mov dh,30h
           add dh,al
           mov [si],dh
           inc si
           mov byte ptr [si],0ah
           inc si
           mov word ptr [si],0a78h
           add si,2
           mov dh,30h
           add dh,bl
           mov [si],dh
           inc si
           mov byte ptr [si],0ah
           inc si
           mov word ptr [si],0a3dh
           add si,2
           mul bx
           mov word ptr es:[0],0
           call change
           push cx
           mov di,0
      ok:  mov cl,es:[di]
           mov ch,0
           jcxz ok2
           mov [si],cl
           inc si
           mov byte ptr [si],0ah
           inc si
           inc di
           jmp short ok
     ok2:  add si,4
           pop cx
           pop bx
           pop ax
           inc bx
           pop si
           add si,16
           loop s0
           pop ax
           inc ax
           pop cx
           pop si
           add si,160
           loop s

           mov ax,4c00h
           int 21h

  change:  push si
           push ax
           push bx
           push cx
           push dx

           mov si,0
           call dtoc
           mov si,0
           mov di,8
           mov bx,0

     s1:   mov cl,es:[bx]
           mov ch,0
           jcxz s2
           mov es:[di],cl
           dec di
           inc bx
           jmp short s1
         
     s2:   mov cl,es:[di+1]
           mov ch,0
           jcxz s3
           mov es:[si],cl
           inc di
           inc si
           jmp short s2

     s3:   pop dx
           pop cx
           pop bx
           pop ax
           pop si
           ret  

  dtoc:    mov dx,0000h
           mov cx,0ah
           call divdw
           mov dx,cx
           mov cx,ax
           add dl,30h
           mov es:[si],dl
           inc si
           jcxz ok1
           jmp short dtoc
           
 ok1:      ret


 divdw:    mov di,ax
           mov ax,dx
           mov dx,0
           div cx
           mov bx,ax
           mov ax,di
           div cx
           mov cx,dx
           mov dx,bx
           ret

 space:    push si
           push cx
           mov cx,80
space2:    mov word ptr [si],0a20h
           add si,2
           loop space2
           pop cx
           pop si
           add si,160
           loop space
           ret

code ends
end start
评论次数(1)  |  浏览次数(1691)  |  类型(汇编作业) |  收藏此文  | 

[  tomato   发表于  2009-02-09 15:51  ]

博主厉害!我想大部分人都缺乏这种灵活运用自己所学知识的这种能力,学到知识,并且能够灵活运用它,这才是我们学习知识的真正目的。博主的这种思维方式真的很重要,希望博主以后能够更深入的挖掘这方面的能力。博主加油!向博主学习!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码