注册 登录
编程论坛 汇编论坛

大家看看这个程序哪儿有问题!!!!!

闭眼到天黑 发布于 2011-03-01 22:31, 973 次点击
程序代码:
assume cs:code,ds:data,ss:stack
        data segment
                db'welcome to masm!'
                db 00000010b,00100100b,01110001b
        data ends
        stack segment
                dw 0,0,0,0,0,0,0,0
        stack ends
        code segment
       start: mov ax,data
              mov ds,ax
              mov ax,stack
              mov ss,ax
              mov sp,0010h
              mov bx,0000h
              mov ax,0b800h
              mov es,ax
              mov ax,0
              mov di,0010h
              mov cx,3
         s:   push cx
              mov cx,16
              mov si,0
         s0:  mov al,ds:[si]
              mov ah,ds:[di]
              mov es:[bx+07b6h],ax
              inc si
              add bx,2
              loop s0
              inc di
              pop cx
              loop s
              mov ax,4c00h
              int 21h
         code ends
         end start
王爽的汇编语言一书中实验九的程序说是在屏幕上显示不同颜色的字,这是我写的,但是运行后屏幕上没有正确显示!请各位看一下!

[ 本帖最后由 闭眼到天黑 于 2011-3-2 22:07 编辑 ]
16 回复
#2
ansic2011-03-01 23:34
没有dos环境,没法给你测试,这是我以前写的。你参考一下。
 
程序代码:


 assume  cs:code,ds:data

 data    segment
         db      'welcome to masm!'
         db      02h,24h,71h

 data    ends

 code    segment

 start:
         mov ax,data                ;指定数据段DS
         mov ds,ax
         mov ax,0b800h              ;显示区域为附加段ES
         mov es,ax
         mov di,780h                ;ES:DI起始行
         mov bx,10h                 ;颜色属性,地址为:DS:[BX]
         mov cx,3                   ;3个颜色

 a:                                 ;外循环对3中颜色循环, 依次是02,24h,71h
         push cx                    ;由于内循环要用到cx,故保存
         push di                    ;保存初始行
         mov si,0                   :字符首地址ds:si
         mov cx,16                  ;内循环开始,依次遍历16个字符

 b:      mov al,[si]                ;将asacii放入al
         mov ah,[bx]                ;将属性放入ah
         mov es:[di+40h],ax         ;显示
         inc si                     ;指向下一个字符
         add di,2                   ;指向下一个显示位置
         loop b                     ;如cx=0,则内循环结束
         pop di                     ;第一次循环结束,恢复初始行的值
         pop cx                     ;恢复cx
         inc bx                     ;ds:[bx+1],指向下一个属性
         add di,0a0h                ;第二行
         loop a                     ;外循环,如3个属性遍历完毕则跳出循环

 
         mov ah,4ch
         int 21h

 code    ends

 end     start
#3
闭眼到天黑2011-03-02 07:02
回复 2楼 ansic
现在去上课,没办法测试,谢了,不过上完课我会好好看看的,不过哥们儿真是在哪儿都能碰见你啊!
#4
闭眼到天黑2011-03-02 07:03
想问一下是不是不同的CPU你要想输出的内容要写入不同的内存地址,求解!!!
#5
ansic2011-03-02 10:27
以下是引用闭眼到天黑在2011-3-2 07:03:55的发言:

想问一下是不是不同的CPU你要想输出的内容要写入不同的内存地址,求解!!!

别的不知道,基于X86cpu的显存地址基本都一样
#6
ansic2011-03-02 10:28
以下是引用闭眼到天黑在2011-3-2 07:02:17的发言:

现在去上课,没办法测试,谢了,不过上完课我会好好看看的,不过哥们儿真是在哪儿都能碰见你啊!

嘿嘿, 去年学的汇编, 今年开始学C,。。。。
#7
闭眼到天黑2011-03-02 13:27
以下是引用ansic在2011-3-2 10:28:44的发言:

 
嘿嘿, 去年学的汇编, 今年开始学C,。。。。
我是先学的C++然后学的C,现在在学汇编!
#8
zaixuexi2011-03-02 14:32
程序没问题,在DEBUG执行
#9
闭眼到天黑2011-03-02 16:23
以下是引用zaixuexi在2011-3-2 14:32:06的发言:

程序没问题,在DEBUG执行
可是DOS界面上没法儿显示我想要的结果,程序运行后屏幕上什么都没有,是为什么呢!
#10
寒风中的细雨2011-03-02 21:38
只有本站会员才能查看附件,请 登录
#11
闭眼到天黑2011-03-02 21:39
回复 10楼 寒风中的细雨
难道要在纯DOS界面才行么!
#12
闭眼到天黑2011-03-02 21:44
回复 10楼 寒风中的细雨
我用g命令运行了一下,显示正确了!
#13
闭眼到天黑2011-03-02 21:50
可是为什么直接运行可执行文件(exe)的时候无法显示结果呢,我把int 21这个中断指令去除以后也无法显示结果,这是什么原因!
#14
ansic2011-03-02 22:04
以下是引用闭眼到天黑在2011-3-2 21:50:51的发言:

可是为什么直接运行可执行文件(exe)的时候无法显示结果呢,我把int 21这个中断指令去除以后也无法显示结果,这是什么原因!

因为程序使用了直接写屏技术, 所以,最佳效果应该在纯dos(实模式)下!  建议LZ在实模式或者虚拟机下试一试。
#15
ansic2011-03-02 22:05
以下是引用寒风中的细雨在2011-3-2 21:38:03的发言:

这个效果确实有些~~~SB
#16
闭眼到天黑2011-03-02 22:14
以下是引用ansic在2011-3-2 22:04:37的发言:

 
因为程序使用了直接写屏技术, 所以,最佳效果应该在纯dos(实模式)下!  建议LZ在实模式或者虚拟机下试一试。
偶也是这么想的,要是在纯DOS模式下应该效果比较好另附效果图一张!
只有本站会员才能查看附件,请 登录
#17
xiaomarn2011-03-03 13:00
回复 15楼 ansic
你不会就不要笑别人,人家是对的,楼主看不到是他双击了程序,只闪了一下就没了,加个等待就行了
assume cs:code,ds:data,ss:stack
        data segment
                db'welcome to masm!'
                db 00000010b,00100100b,01110001b
        data ends
        stack segment
                dw 0,0,0,0,0,0,0,0
        stack ends
        code segment
       start: mov ax,data
              mov ds,ax
              mov ax,stack
              mov ss,ax
              mov sp,0010h
              mov bx,0000h
              mov ax,0b800h
              mov es,ax
              mov ax,0
              mov di,0010h
              mov cx,3            ;char attribute
         s:   push cx
              mov cx,16            ;string length
              mov si,0            ;string pointer to 0(the first char)
         s0:  mov al,ds:[si]    ;char
              mov ah,ds:[di]    ;color
              mov es:[bx+07b6h],ax        ;move char to video buffer
              inc si        ;next char
              add bx,2        ;video buffer increase
              loop s0
              inc di        ;next color
              pop cx   
              loop s
              mov ah,0        ;key wait
              int 16h
              mov ax,4c00h
              int 21h
         code ends
         end start
1