aleiluyes 发表于 2012-9-23 19:43:07

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

先直接上代码
***********************************************************************************************
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:,02h                        ;用s,s1,s2循环给字节设置属性
        add di,2
        loop s
        mov cx,16
       
s1:        mov byte ptr ds:,24h
        add di,2
        loop s1
        mov cx,16
       
s2:        mov byte ptr ds:,71h
        add di,2
        loop s2
       
       
       
        mov cx,16
        mov bx,0
        mov di,0
s3:        mov ax,ds:                                        ;用s3,s4,s5循环把设置好的字符写入80x25显存中
        mov es:,ax
        add bx,2
        loop s3
        mov cx,16
        mov bx,0
s4:        mov ax,ds:
        mov es:,ax
        add bx,2
        loop s4
        mov cx,16
        mov bx,0
s5:        mov ax,ds:
        mov es:,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段的属性觉得没问题.问题就是写入显存的时候就变成笑脸了!

求高人点明错处!


lukelqz 发表于 2012-9-23 19:43:08

你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。
你再根据书本的p188仔细算算显存地址。我帮你改了第一行就立马显示对了一行。下面的两行自己改咯。
PS:你的原程序里面int 21h 写成了int 21 真坑爹啊{:5_90:}

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

code segment
start: mov ax,data
mov es,ax
mov ax,0b800h
mov ds,ax
mov di,0
mov si,0
mov cx,16
s: mov ah,02h
mov al,es:
mov 720h,ax
mov ah,24h
mov 7c0h,ax
mov ah,71h
mov 860h,ax
inc di
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start

风中雨 发表于 2012-9-23 20:25:11

路过,,没仔细学过

□为 发表于 2012-9-24 21:07:10

不懂!! 帮顶!!!!

walykyy 发表于 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:,02h      ;用s,s1,s2循环给字节设置属性
      add di,2
      loop s                               
      mov cx,16
      mov bx,0
      ; mov di,0                                        ;di没用别设
s3:   mov ax,ds:            ;用s3,s4,s5循环把设置好的字符写入80x25显存中
      mov es:,ax
      add bx,2
      loop s3
      mov cx,16
                mov di,0
s1:   mov byte ptr ds:,24h
      add di,2
      loop s1
               
      mov cx,16
      mov bx,0
s4:   mov ax,ds:
      mov es:,ax
      add bx,2
      loop s4
      mov cx,16
                mov di,0
s2:   mov byte ptr ds:,71h
      add di,2
      loop s2               
      mov cx,16
      mov bx,0
s5:   mov ax,ds:
      mov es:,ax
      add bx,2
      loop s5      
      mov ax,4c00h
      int 21h                                                ;抄都抄错了,太不认真了      
codesg ends
end start

aleiluyes 发表于 2012-9-25 03:31:49

lukelqz 发表于 2012-9-23 19:43 static/image/common/back.gif
你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。
你再根据 ...

一目了然,赞个.不过还是有问题,

aleiluyes 发表于 2012-9-25 03:34:26

lukelqz 发表于 2012-9-23 19:43 static/image/common/back.gif
你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。
你再根据 ...

不管显存地址是哪里,只要把welcome to masm!的字节高位都设置属性不就可以改变属性了嘛? 为什么非要偏移是720h才行?

walykyy 发表于 2012-9-25 07:53:08

本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。

lukelqz 发表于 2012-9-25 12:13:45

aleiluya 发表于 2012-9-25 03:34 static/image/common/back.gif
不管显存地址是哪里,只要把welcome to masm!的字节高位都设置属性不就可以改变属性了嘛? 为什么非要偏移 ...

对的,可以不用移到720h,只是为了符合题意,当然你只要把你的6ffh+1就可以了,你的问题是奇偶地址错位,字符放偶地址,颜色放奇地址就可以了。

lukelqz 发表于 2012-9-25 12:22:34

walykyy 发表于 2012-9-24 22:45 static/image/common/back.gif
assume cs:codesg,ds:datasg
datasg segment
      db 3 dup ('w e l c o m e   t o   m a s m ! ')    ...

帅哥你知道楼主加空格的用意吗

橙子 发表于 2012-9-25 12:24:53

来逛逛我从第一课从新开始学啦。以后发帖你们要帮我详细解答哦{:5_92:}

walykyy 发表于 2012-9-25 20:38:20

本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。。

lukelqz 发表于 2012-9-25 20:40:47

walykyy 发表于 2012-9-25 20:38 static/image/common/back.gif
我知道他的意图,但是不符合实验9的题意,我已经在上面说过了'welcome to masm!'是连续的,中间是没有空格 ...

题意只是要求显示连续即可,存放数据的方式没有要求的。楼主的可以做到显示连续。

walykyy 发表于 2012-9-25 22:36:23

本帖最后由 walykyy 于 2012-9-26 07:05 编辑

。。。。。。。。。。。

lukelqz 发表于 2012-9-25 22:44:30

本帖最后由 lukelqz 于 2012-9-25 22:53 编辑

walykyy 发表于 2012-9-25 22:36 http://bbs.fishc.com/static/image/common/back.gif
那我只能说楼主真是神才,第一次见过这样写的,OK了吧??随便改一句把鱼币拿走了,还在这里得瑟,你看看 ...

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

walykyy 发表于 2012-9-25 22:51:39

本帖最后由 walykyy 于 2012-9-26 07:06 编辑

。。。。。。。。。

aleiluyes 发表于 2012-9-26 04:04:19

walykyy 发表于 2012-9-25 22:51 static/image/common/back.gif
我说那里说错了,这位仁兄指出来???我又何来闹事之举呢???

程序是调试出来的,没有人能做到一下子就写出完美的程序!况且我还是在学习中,做不到那些高效率的. 我写成这样就是想把原理弄明白,基础打结实了再把它调试成高效率的.要一步一步来嘛.   

aleiluyes 发表于 2012-9-26 04:09:20

lukelqz 发表于 2012-9-25 12:13 static/image/common/back.gif
对的,可以不用移到720h,只是为了符合题意,当然你只要把你的6ffh+1就可以了,你的问题是奇偶地址错位, ...

= =失策,想来想去也没想到是这里!太感谢为我解答了.

walykyy 发表于 2012-9-26 06:48:00

本帖最后由 walykyy 于 2012-9-26 07:07 编辑

。。。。。。。。。。

walykyy 发表于 2012-9-26 06:50:53

本帖最后由 walykyy 于 2012-9-26 07:09 编辑

你们俩人的代码都有压缩性,此事到此为止!!!听不听你们随便
页: [1] 2
查看完整版本: 不知道哪错了(汇编实验九)