通过实验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
- [lhjoanna] 我大致看了一下,标号s0:后面的第一行: mov byte ptr es:[bx+ 02/17 14:43
- [shuiyeweizhi] assume cs:code,ds:data,es:table,ss:stack data seg 02/17 12:53
- [游客] 我已经搞定了,和模式没有关系。不过还是要谢谢你。你的文章很有启发性啊。呵呵 02/17 11:19
- [游客] 对于实验十五我的源代码和博主的一模一样,可是运行时总出错,我猜着是不是因为不是在实模式下运行而出错呢 02/17 10:40
- [haojiahuo50401] lhjoanna,你好。我16章的实验不会做,思索了好长时间不会。正是你的这篇文章教会了我,谢谢!希 02/16 21:55
- [wsrf] 很不错,支持一下。 02/14 11:05
- [stategrid] <问题1>书上讲的是b800:000~b800:09f是显示器第一行,可是我代码中给es赋值b800 02/11 21:19
- [stategrid] 博主对所学的知识能够灵活应用真的很棒。让人眼前一亮。呵呵 02/11 18:51
- [stategrid] 虽然我写出来了。可是思路没有博主的清晰。博主加油! 02/11 18:47
- [stategrid] 嗯。对,很有必要进行复习。如果用得不熟的话,思考起来会过份担心程序是该如何实现这个功能的。。。如果这 02/11 18:46
- [mouse] 博主学的进度不慢啊,论坛问过的帖子有了答案也可以“结贴”了。 02/05 11:04