wdl7770016 发表于 2011-6-26 22:17:16

实验9的问题 谁来帮我看看代码。。老是出错 无法编译 郁闷

我的字符属性是单一的没有弄成三种颜色   我想先试试单一颜色的 再改进可是就是无法编译 。。。求助
assume cs:code,ds:data,ss:stack
data segment ;数据段
db 'welcome !'
data ends

stack segment ;堆栈段
db 0,0,0,0,0,0
stack ends

code segment ;代码段
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,code
mov cs,ax
mov sp,0
mov si,0
mov ax,0b800h
mov es,ax
mov di,0
mov bx,0
mov cx,3
yes:push cx ?外循环 外循环的cx入栈
s1:mov cx,9 ;内循环
mov al,ds: ;字符字节
mov ah,0cah ;颜色字节
mov es:,ax ;把ax传给目标字内存
add si,1
add di,2
loop s1
add bx,0a0h
pop cx ;外循环的cx出照栈
loop yes
code ends
end start

king嗜血法师 发表于 2011-6-27 06:33:27

本帖最后由 king嗜血法师 于 2011-6-27 06:37 编辑

yes:push cx ?外循环 外循环的cx入栈
注释符打错了。而且di和si在外循环没初始化。
mov di,0
mov si,0
应该放到yes:push cx的后面。

loop yes后面加入正常结束指令。
mov ax,4c00H
int 21H
虽然我现在还不是很了解这个指令,不过最好是习惯性的加上。

陌路狂奔 发表于 2011-6-27 10:37:05

本帖最后由 陌路狂奔 于 2011-6-27 10:38 编辑

mov ax,code

mov cs,ax改成mov ax,DATA

mov Ds,ax。yes:push cx ?外循环 外循环的cx入栈
应该是分号吧。
yes:push cx ;外循环 外循环的cx入栈
另外加个mov ax,4c00H
int 21H
s1:mov cx,9 ;内循环。你确定这样不会进入死循环么?
add bx,0a0h,你的DI已经加了18上去了,所以你第二行会错位,解决方法是前面将DI入栈,后面再出栈。
表达的不是很清楚,希望你能看明白。
忘了说了,你的栈顶指针指向0你觉得会不会有问题呢,没试过,自己试一下吧{:5_109:}

陌路狂奔 发表于 2011-6-27 10:43:18

本帖最后由 陌路狂奔 于 2011-6-27 10:47 编辑

[/
assume cs:code,ds:data,ss:stack

data segment ;数据段

db 'welcome !'

data ends



stack segment ;堆栈段

dw 0,0,0,0,0,0

stack ends



code segment ;代码段

start:mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

mov ax,data

mov ds,ax

mov sp,10

mov si,0

mov ax,0b800h

mov es,ax

mov di,0

mov bx,0

mov cx,3

yes:push cx ;外循环 外循环的cx入栈
push si
push di
mov cx,9 ;内循环
s1:

mov al,ds: ;字符字节

mov ah,0cah ;颜色字节

mov es:,ax ;把ax传给目标字内存

add si,1

add di,2

loop s1

add bx,0a0h
pop di
POP si

pop cx ;外循环的cx出照栈

loop yes
mov ax,4c00h
int 21h

code ends

end start 没编译,我觉得这样应该可行,试一下吧

wdl7770016 发表于 2011-6-27 12:35:03

king嗜血法师 发表于 2011-6-27 06:33 static/image/common/back.gif
yes:push cx ?外循环 外循环的cx入栈
注释符打错了。而且di和si在外循环没初始化。
mov di,0


我按你的说法加了mov di,0
                            mov si,0
                            还加了mov ax,4c00h
                                    int 21h
mov ax,codemov cs,ax改为mov ax,datamov ds,ax我觉得没必要把我下边不是也写了这个吗
如果没mov ax,codemov cs,ax   怎么能找得到start这标号呢
还有那个?号我的代码里没有啊我再贴一次、、奇怪 一贴上来就变成问号为什么我这显示的是分号。。。
assume cs:code,ds:data,ss:stack
data segment            ;数据段
db 'welcome !'
data ends
stack segment         ;堆栈段
db 0,0,0,0,0,0
stack ends
code segment             ;代码段
start:mov ax,data
   mov ds,ax
   mov ax,stack
   mov ss,ax
   mov ax,code
   mov cs,ax
   mov sp,0
   mov si,0
   mov ax,0b800h
   mov es,ax
   mov di,0
   mov bx,0
   mov cx,3
yes:push cx?外循环    外循环的cx入栈
   mov di,0
   mov si,0
s1:mov cx,9   ;内循环
   mov al,ds:    ;字符字节
   mov ah,0cah   ;颜色字节
   mov es:,ax;把ax传给目标字内存
   add si,1
   add di,2
   loop s1
   add bx,0a0h
   pop cx       ;外循环的cx出照栈
   loop yes
   mov ax,4c00h
   int 21h
code ends
end start   

wdl7770016 发表于 2011-6-27 12:42:48

我把yes:push cx那行的注释给删除了然后就可以编译为什么啊 郁闷 我明明写的是;号   莫名其妙 撞鬼了。。。
but还有那个我明明都定义了堆栈段为什么编译完却警告没有堆栈段。。。。assume我也assume了要mov ax,stackmov ss,ax我也做了 为什么却。。。
我有运行了下程序   还是发生错误。。。。郁闷继续纠结。。。。
网上又要考概率郁闷啊。。。。。都没时间学计算机。。。。

wdl7770016 发表于 2011-6-27 12:45:39

陌路狂奔 发表于 2011-6-27 10:43 static/image/common/back.gif
没编译,我觉得这样应该可行,试一下吧

我运行了 你的代码ok的哈我在比较中。。。。。。{:5_107:}

wdl7770016 发表于 2011-6-27 12:52:14

额你多了个mov ax,data

mov ds,ax

wdl7770016 发表于 2011-6-27 13:06:10

陌路狂奔 发表于 2011-6-27 10:43 static/image/common/back.gif
没编译,我觉得这样应该可行,试一下吧

比较结果:
1。你多了个mov ax,data
             mov ds,ax
2.我sp设置成了0现在改为了6      【?】    想问个问题:如果我定义了个堆栈段sp又设为0   有影响吗 是不是会影响到上边的数据段吗
3。貌似在循环内mov cx,9会导致无限循环。。。。我错了。。
现在试了试   额还是错误
继续比较:
1.你用的是push di和push si   而我是外循环开头mov di,0mov si,0    为什么我就不行呢。。。。

wdl7770016 发表于 2011-6-27 13:12:54

奇怪 改成这样还不行。。。老是跑出个什么16位子系统的错。。assume cs:code,ds:data,ss:stack
data segment            ;数据段
db 'welcome !'
data ends

stack segment         ;堆栈段
db 0,0,0,0,0,0
stack ends

code segment             ;代码段
start:mov ax,data
   mov ds,ax
   mov ax,stack
   mov ss,ax
   mov ax,code
   mov cs,ax
   mov sp,6
   mov si,0
   mov ax,0b800h
   mov es,ax
   mov di,0
   mov bx,0
   mov cx,3
yes:push cx      
   push di
   push si
   mov cx,9
s1:   ;内循环
   mov al,ds:    ;字符字节
   mov ah,0cah   ;颜色字节
   mov es:,ax;把ax传给目标字内存
   add si,1
   add di,2
   loop s1
   add bx,0a0h
   pop si
   pop di
   pop cx       ;外循环的cx出照栈
   loop yes
   mov ax,4c00h
   int 21h
code ends
end start   

wdl7770016 发表于 2011-6-27 13:16:15

陌路狂奔 发表于 2011-6-27 10:43 static/image/common/back.gif
没编译,我觉得这样应该可行,试一下吧

我说这个16位子系统的错误到底是什么啊为什么我一忽略一下就可以了说明代码没问题   
但为什么你的代码都却没有这个错误呢。。

陌路狂奔 发表于 2011-6-27 13:41:18

wdl7770016 发表于 2011-6-27 13:12 static/image/common/back.gif
奇怪 改成这样还不行。。。老是跑出个什么16位子系统的错。。

不知道你有没单步T一下呢,如果有应该知道在哪跳出那个16位子系统错误的。MOV AX,CODE   MOV CS,AX。这里你DEBUG看看会不会报错,还有那个栈顶指针指向0也就是栈底吧,如果你入栈PUSH SI
SP=(SP-2),这里会不会有问题呢

king嗜血法师 发表于 2011-6-27 13:52:22

你完全不用去定义CS,因为end start会默认程序的第一条指令是从start:开始的。

wdl7770016 发表于 2011-6-28 15:58:39

郁闷了我debug了一下   果然是mov ax,code mov cs,ax这有问题   我发现这两句在debug时居然只有mov cs,ax?    前一条哪里去了 撞鬼 了   谁能解释这现象。。。。
页: [1]
查看完整版本: 实验9的问题 谁来帮我看看代码。。老是出错 无法编译 郁闷