sh11va 发表于 2013-2-28 17:35:05

9章 实验9 问题

本帖最后由 sh11va 于 2013-3-10 11:09 编辑

题目要求:编程显示绿色黑底字符串"welcome to masm!"
这是我编的代码,编译没错,运行起来什么都没出现。

assume cs:code,ds:data
data segment
db 77,02,65,02,6c,02,63,02,6f,02,6d,02,65,02,20,02,74,02,6f,02,6d,02,61,02,73,02,6d,02,21,02
data ends

code segment
               
start:mov ax,data
          mov ds,ax
          mov ax,0b800h
          mov es,ax
         
          mov bx,0
         
s:       mov al,
         mov es:,al
         inc bx
loop s

         mov ax,4c00h
         int 21h
code ends
end start


syjsu 发表于 2013-2-28 18:14:12

你第3行有问题啊

77,02,65,02,6c…… 一下2进制、一下16进制,你想表达什么?

L]V[G 发表于 2013-2-28 18:25:55

本帖最后由 L]V

这个程序存在很多逻辑上的错误,
1定义data段的时候,出错了,我不明白你想定义的是什么?不是“welcome to masm!”的ascll码,还有,在定义16进制的数
    据的时候,如果是字母开头,要在前面加上零,如 0f7H

2 s循环没有设置循环的次数,即cx的值

3 没有把颜色设置到指定的内存空间里

4 不是我吹毛求疵,写的代码看起来别扭,建议你多看看书本的例子,多模仿牛人的代码风格

下面奉上我修改过的程序:

assume cs:code,ds:data

data segment
db "Welcome to masm!"
data ends

code segment
start:
                mov ax,data
                mov ds,ax
               
                mov ax,0b800h
                mov es,ax
               
                mov si,0
                mov di,0
                mov cx,16
               
      s:mov al,ds:
            mov es:,al
               
                mov al,2
                mov es:,al
               
                inc si
                add di,2
                loop s

                mov ax,4c00h
                int 21h
code ends

end start

PS:在编译和链接后,即masm 和obj之后,要在黑窗口输入指令cls ,这是清屏的指令,然后在执行程序,不然的话,程序显示的字符串会被刷掉

有错不要怕,开始的时候错得越多越好,要耐心修改,以后就不会错了!!不要气馁,加油!!!没耐心的人学不好编程

L]V[G 发表于 2013-2-28 18:34:39

再给你2个我做实验九的程序答案,一共花了 5天,做完以后,很有成就
第一个:

assume cs:code,ds:data ;2013年2月8日 21:30:37
                     ;目的:实验9,一列一列的赋值
data segment
    db'welcome to masm!'
data ends

code segment
start:
       mov ax,data
         mov es,ax
         
         mov ax,0b800h
         mov ds,ax
         
         mov bx,720h
         mov si,0
         mov di,0
         mov cx,16
      s0:mov ax,es:
         mov .0h,ax    ;赋值到第12行
         mov .0a0h,ax;赋值到第13行
         mov .140h,ax;赋值到第14行
         
         mov ax,2h
         mov .1h,ax    ;12行颜色为绿色
         
         mov ax,24h
         mov .0a1h,ax;13行颜色为绿底红色
         
         mov ax,71h
         mov .141h,ax;14行颜色为白底蓝色
         
         inc si
         add di,2
         loop s0
         
         mov ax,4c00h
         int 21h
code ends

end start

;总结:80*25,本程序中间位置(第一页)为 第12,13,14行,第64列到95列
;   行内存分别为:6e0h,780h,820h,列内存为40h-5fh,
;   这样就可以的出第一个内存单元地址:720h




第二个:
assume cs:code,ds:data,ss:stack   ;2013年2月9日 21:40:26
                                  ;目的:实验9,使用外循环和内循环,压栈cx的方法
                                  ; 一行一行地赋值
data segment
    db 'welcome to masm!'
      db 02h,024h,071h
data ends


stack segment
    db 15 dup (0)
stack ends


code segment
start:
                mov ax,data
                mov ds,ax

                mov ax,stack
                mov ss,ax
                mov sp,16

                mov ax,0872h ;算出屏幕第12行中间的显存的段起始位置放入ax中
               
                mov si,0
                mov di,0   
                mov bx,0
                mov cx,0
s0:                push cx
                push ax
                push bx

                mov es,ax
s1:                mov al,   ;此循环实现偶地址中存放字符
                mov es:,al
                inc si
                add di,2
                loop s1

                mov si,0
                mov di,0
s2:                mov al,16   ;此循环实现奇地址中存放字符的颜色属性
                mov es:1,al
                inc si
                add di,2
                loop s2

                pop cx
                pop ax
                add ax,0a0h       ;相加后,ax变为下一行的地址
                loop s0
      
      mov ax,4c00h
      int 21h
code ends

end start               

杰Leo_J 发表于 2013-2-28 19:14:09

我也想知道为什么我的程序什么都显示不了...
assume cs:code,ds:data,ss:stack
data segment
        db 'welcome to masm!'
        db 2h,24h,71h
data ends

stack segment
        db 16 dup(0)
stack ends

code segment
        start:        mov ax,data
                        mov ds,ax
                        mov ax,stack
                        mov ss,ax
                        mov sp,10h
                       
                        mov ax,0b72h
                        mov bx,0
                        mov cx,3
                       
                s:        push cx
                        push ax
                        push bx
                       
                        mov si,0
                        mov di,0
                        mov es,ax
                        pop bx
                       
                        mov cx,10h
                s1:        mov al,ds:
                        mov es:,al
                        inc si
                        inc di
                        mov al,ds:10h
                        mov es:,al
                        inc di
                        loop s1
                       
                        inc bx
                       
                        pop ax
                        add ax,0ah
                        pop cx
                        loop s
                       
                        mov ax,4c00h
                        int 21h
                       
code ends
end start

sh11va 发表于 2013-3-7 11:28:58

syjsu 发表于 2013-2-28 18:14 static/image/common/back.gif
你第3行有问题啊

77,02,65,02,6c…… 一下2进制、一下16进制,你想表达什么?

想写ascii,现在懂了,错大发了。。。

sh11va 发表于 2013-3-7 11:29:35

L]V static/image/common/back.gif
再给你2个我做实验九的程序答案,一共花了 5天,做完以后,很有成就
第一个:



多谢大神解答,我也准备深入的重写一下。

sh11va 发表于 2013-3-7 11:59:47

L]V static/image/common/back.gif
这个程序存在很多逻辑上的错误,
1定义data段的时候,出错了,我不明白你想定义的是什么?不是“welcome ...

我改过之后还是不行,然后复制了你的程序,惊悚的发现我的电脑运行你的程序也没反应,我打了cls了。

L]V[G 发表于 2013-3-7 13:16:42

sh11va 发表于 2013-3-7 11:59 static/image/common/back.gif
我改过之后还是不行,然后复制了你的程序,惊悚的发现我的电脑运行你的程序也没反应,我打了cls了。

我执行之后是这个结果啊!!有问题?

L]V[G 发表于 2013-3-7 13:21:59

用这个实验一下,是在屏幕中间显示的,不用cls也不会刷掉。
assume cs:code,ds:data

data segment
db "Welcome to masm!"
data ends

code segment
start:
                mov ax,data
                mov ds,ax
               
                mov ax,0b800h
                mov es,ax
               
                mov si,0
                mov di,160*12 + 30*2
                mov cx,16
               
      s:mov al,ds:
            mov es:,al
               
                mov al,2
                mov es:,al
               
                inc si
                add di,2
                loop s

                mov ax,4c00h
                int 21h
code ends

end start

这个是结果

五柳 发表于 2013-3-7 14:17:04

L]V static/image/common/back.gif
用这个实验一下,是在屏幕中间显示的,不用cls也不会刷掉。




我也是显示不了,复制的你的代码也不行

sh11va 发表于 2013-3-7 18:48:19

L]V static/image/common/back.gif
用这个实验一下,是在屏幕中间显示的,不用cls也不会刷掉。




还是不行。。。

L]V[G 发表于 2013-3-7 19:17:07

sh11va 发表于 2013-3-7 18:48 static/image/common/back.gif
还是不行。。。

亲,你win7的,下个dbox试一下!!http://bbs.fishc.com/forum.php?mod=viewthread&tid=3581&extra=page%3D1%26filter%3Dtypeid%26typeid%3D11%26typeid%3D11

小小小小鱼 发表于 2013-3-8 01:59:51

你这个 根本不和要求啊~哥们   

小小小小鱼 发表于 2013-3-8 02:13:13

题目是 在屏幕’ 中间‘ 显示 3行~每行一个颜色~你可到好 给人家简化成1行不说~还没在中间

小小小小鱼 发表于 2013-3-8 02:16:56

L]V static/image/common/back.gif
用这个实验一下,是在屏幕中间显示的,不用cls也不会刷掉。




分别用 3中颜色显示3行~你简化成1行了~~那这题就没意义了吧

wxhnr 发表于 2013-3-8 06:25:37

本帖最后由 wxhnr 于 2013-3-8 06:26 编辑

纯新手想知道这些程序在什么系统中编写和运行?WIN7行不行?编辑和编译分别用的哪一个?多谢

sh11va 发表于 2013-3-10 09:39:24

小小小小鱼 发表于 2013-3-8 02:16 static/image/common/back.gif
分别用 3中颜色显示3行~你简化成1行了~~那这题就没意义了吧

我是想先运行一行成功再写三行的。
页: [1]
查看完整版本: 9章 实验9 问题