在学到问题7.9(即实验6)时,我曾经提出过一个问题,就是能不能同时处理不同长度的字符串。学到第十章,已经可以解决这个遗留问题。可以处理两种情况:
<1>即课本上的情况,每行都为16个字节,但每行的单词字母个数不相等。
<2>单词字母个数不同,且单词为一个挨着一个,以0分隔。
现以情况<2>为例说明:
思路:共四个单词,外循环4次。每次对每个单词执行小写转大写。用jcxz结束当前单词,内存地址依次增加即可。情况<1>与此类似,不同在于内存地址第二次从第二行开始,以此类推。
【代码】
assume cs:code
data segment
db 'display',0
db 'brows',0
db 'replace',0
db 'modify',0
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov cx,4
s:call capital
inc si
loop s
mov ax,4c00h
int 21h
capital:push cx
change:mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short change
ok:pop cx
ret
code ends
end start
做为一个对实验6的补充吧,实验6地址http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=18153&kindLevel=1&kindId=28009&postId=30069&readSg=1
- [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
[ 游客 发表于 2009-02-05 16:18 ]
嗯。博主行为很值得俺学习。呵呵
这样前后衔接,想必理解肯定不一般。