鱼C论坛

 找回密码
 立即注册
查看: 3797|回复: 23

不知道哪错了(汇编实验九)

[复制链接]
发表于 2012-9-23 19:43:07 | 显示全部楼层 |阅读模式
50鱼币
先直接上代码
***********************************************************************************************
assume cs:codesg,ds:datasg

datasg segment
        db 3 dup ('w e l c o n e   t o   m a s m ! ')        ;16个+16个空白
       
datasg ends

codesg segment

start:
        mov ax,datasg                                        ;跟ds挂钩
        mov ds,ax
        mov ax,0b800h                                        ;es跟80x25显存挂钩
        mov es,ax
       
        mov cx,16                                                ;16个字符,循环16次
        mov di,0
        mov bx,0
s:        mov        byte ptr ds:[di+1],02h                        ;用s,s1,s2循环给字节设置属性
        add di,2
        loop s
        mov cx,16
       
s1:        mov byte ptr ds:[di+1],24h
        add di,2
        loop s1
        mov cx,16
       
s2:        mov byte ptr ds:[di+1],71h
        add di,2
        loop s2
       
       
       
        mov cx,16
        mov bx,0
        mov di,0
s3:        mov ax,ds:[bx]                                        ;用s3,s4,s5循环把设置好的字符写入80x25显存中
        mov es:[bx+6ffh],ax
        add bx,2
        loop s3
        mov cx,16
        mov bx,0
s4:        mov ax,ds:[bx]
        mov es:[bx+79fh],ax
        add bx,2
        loop s4
        mov cx,16
        mov bx,0
s5:        mov ax,ds:[bx]
        mov es:[bx+83fh],ax
        add bx,2
        loop s5
       
       
        mov ax,4c00h
        int 21
       
codesg ends

end start

;段地址b800开始
;行从偏移6e0h-77fh开始        字绿色 02
;                780h-81fh                绿地红色24
;                820h-8bfh                白底蓝字71
;列从+1f开始
*****************************************************************************************************
求错处,思路是这样的:
先把字节属性给设置了,然后再把设置好的字符写入80x25的显存中.可不是为什么出来的是小脸,想看debug看原因显存时时变动看不了,去看ds段的属性觉得没问题.问题就是写入显存的时候就变成笑脸了!

求高人点明错处!


最佳答案

查看完整内容

你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。 你再根据书本的p188仔细算算显存地址。我帮你改了第一行就立马显示对了一行。下面的两行自己改咯。 PS:你的原程序里面int 21h 写成了int 21 真坑爹啊 再附上我以前写的这个题的原程序,你参考参考咯。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-23 19:43:08 | 显示全部楼层
你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。 9.24调试.png
你再根据书本的p188仔细算算显存地址。我帮你改了第一行就立马显示对了一行。下面的两行自己改咯。
PS:你的原程序里面int 21h 写成了int 21 真坑爹啊

再附上我以前写的这个题的原程序,你参考参考咯。
  1. assume cs:code
  2. data segment
  3. db 'welcome to masm!'
  4. data ends

  5. code segment
  6. start: mov ax,data
  7. mov es,ax
  8. mov ax,0b800h
  9. mov ds,ax
  10. mov di,0
  11. mov si,0
  12. mov cx,16
  13. s: mov ah,02h
  14. mov al,es:[di]
  15. mov 720h[si],ax
  16. mov ah,24h
  17. mov 7c0h[si],ax
  18. mov ah,71h
  19. mov 860h[si],ax
  20. inc di
  21. add si,2
  22. loop s
  23. mov ax,4c00h
  24. int 21h
  25. code ends
  26. end start
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-23 20:25:11 | 显示全部楼层
路过,,没仔细学过
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-24 21:07:10 | 显示全部楼层
不懂!! 帮顶!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-24 22:45:24 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 18:58 编辑

assume cs:codesg,ds:datasg
datasg segment
        db 3 dup ('w e l c o m e   t o   m a s m ! ')        ;16个+16个空白,以后注意点抄都抄错了
datasg ends
codesg segment
start:
        mov ax,datasg                   ;跟ds挂钩
        mov ds,ax
        mov ax,0b800h                   ;es跟80x25显存挂钩
        mov es,ax

        mov cx,16                       ;16个字符,循环16次
        mov di,0
        ; mov bx,0                                                ;bx没用别设               
s:      mov byte ptr ds:[di+1],02h      ;用s,s1,s2循环给字节设置属性
        add di,2
        loop s                               
        mov cx,16
        mov bx,0
        ; mov di,0                                        ;di没用别设
s3:     mov ax,ds:[bx]              ;用s3,s4,s5循环把设置好的字符写入80x25显存中
        mov es:[bx+720h],ax
        add bx,2
        loop s3
        mov cx,16
                mov di,0
s1:     mov byte ptr ds:[di+1],24h
        add di,2
        loop s1
               
        mov cx,16
        mov bx,0
s4:     mov ax,ds:[bx]
        mov es:[bx+7c0h],ax
        add bx,2
        loop s4
        mov cx,16  
                mov di,0
s2:     mov byte ptr ds:[di+1],71h
        add di,2
        loop s2               
        mov cx,16
        mov bx,0
s5:     mov ax,ds:[bx]
        mov es:[bx+860h],ax
        add bx,2
        loop s5        
        mov ax,4c00h
        int 21h                                                ;抄都抄错了,太不认真了      
codesg ends
end start

评分

参与人数 1荣誉 +10 鱼币 +20 收起 理由
小甲鱼 + 10 + 20 嘻嘻,我是来调解的^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-25 03:31:49 | 显示全部楼层

一目了然,赞个.不过还是有问题,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-25 03:34:26 | 显示全部楼层
lukelqz 发表于 2012-9-23 19:43
你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。
你再根据 ...

不管显存地址是哪里,只要把welcome to masm!的字节高位都设置属性不就可以改变属性了嘛? 为什么非要偏移是720h才行?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 07:53:08 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 12:13:45 | 显示全部楼层
aleiluya 发表于 2012-9-25 03:34
不管显存地址是哪里,只要把welcome to masm!的字节高位都设置属性不就可以改变属性了嘛? 为什么非要偏移 ...

对的,可以不用移到720h,只是为了符合题意,当然你只要把你的6ffh+1就可以了,你的问题是奇偶地址错位字符放偶地址,颜色放奇地址就可以了 9.25调试.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 12:22:34 | 显示全部楼层
walykyy 发表于 2012-9-24 22:45
assume cs:codesg,ds:datasg
datasg segment
        db 3 dup ('w e l c o m e   t o   m a s m ! ')    ...

9.25.jpg 帅哥你知道楼主加空格的用意吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 12:24:53 | 显示全部楼层
来逛逛我从第一课从新开始学啦。以后发帖你们要帮我详细解答哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 20:38:20 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 20:40:47 | 显示全部楼层
walykyy 发表于 2012-9-25 20:38
我知道他的意图,但是不符合实验9的题意,我已经在上面说过了'welcome to masm!'是连续的,中间是没有空格 ...

题意只是要求显示连续即可,存放数据的方式没有要求的。楼主的可以做到显示连续。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 22:36:23 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 22:44:30 | 显示全部楼层
本帖最后由 lukelqz 于 2012-9-25 22:53 编辑
walykyy 发表于 2012-9-25 22:36
那我只能说楼主真是神才,第一次见过这样写的,OK了吧??随便改一句把鱼币拿走了,还在这里得瑟,你看看 ...


你故意闹事是不是?什么叫我写的代码能不能运行,我把关键问题找出来了,而且调试截图正常运行,什么叫随便改一句剩下的能不能运行?有本事把不能运行的图上上来,我调试了一个小时,什么叫得瑟?做个文明人行吗?我很赞成楼主的想法,楼主写的确实复杂了一点,但是完全符合题意就可以,而且楼主自己用了功夫自己想的,不行吗?怎么了?你第一次见的东西多了,大家都是新手,看你搞的像个老师一样。一点素质都没有

点评

和气生财哈~  发表于 2012-9-26 19:50
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-25 22:51:39 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:06 编辑

。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-26 04:04:19 | 显示全部楼层
walykyy 发表于 2012-9-25 22:51
我说那里说错了,这位仁兄指出来???我又何来闹事之举呢???

程序是调试出来的,没有人能做到一下子就写出完美的程序!况且我还是在学习中,做不到那些高效率的. 我写成这样就是想把原理弄明白,基础打结实了再把它调试成高效率的.要一步一步来嘛.   
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-26 04:09:20 | 显示全部楼层
lukelqz 发表于 2012-9-25 12:13
对的,可以不用移到720h,只是为了符合题意,当然你只要把你的6ffh+1就可以了,你的问题是奇偶地址错位, ...

= =失策,想来想去也没想到是这里!  太感谢为我解答了.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-26 06:48:00 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:07 编辑

。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-26 06:50:53 | 显示全部楼层
本帖最后由 walykyy 于 2012-9-26 07:09 编辑

你们俩人的代码都有压缩性,此事到此为止!!!听不听你们随便
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-15 12:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表