鱼C论坛

 找回密码
 立即注册
查看: 4064|回复: 13

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

[复制链接]
发表于 2011-6-26 22:17:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的字符属性是单一的  没有弄成三种颜色   我想先试试单一颜色的 再改进  可是就是无法编译 。。。求助  
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:[si] ;字符字节
mov ah,0cah ;颜色字节
mov es:[di+bx],ax ;把ax传给目标字内存
add si,1
add di,2
loop s1
add bx,0a0h
pop cx ;外循环的cx出照栈
loop yes
code ends
end start 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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
虽然我现在还不是很了解这个指令,不过最好是习惯性的加上。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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你觉得会不会有问题呢,没试过,自己试一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-27 10:43:18 | 显示全部楼层
本帖最后由 陌路狂奔 于 2011-6-27 10:47 编辑

[code/][/
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:[si] ;字符字节

mov ah,0cah ;颜色字节

mov es:[di+bx],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 
没编译,我觉得这样应该可行,试一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 12:35:03 | 显示全部楼层

我按你的说法加了mov di,0
                            mov si,0
                            还加了mov ax,4c00h
                                      int 21h
mov ax,code  mov cs,ax改为mov ax,data  mov ds,ax  我觉得没必要把  我下边不是也写了这个吗
如果没mov ax,code  mov 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:[si]    ;字符字节
   mov ah,0cah   ;颜色字节
   mov es:[di+bx],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   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 12:42:48 | 显示全部楼层
我把yes:push cx  那行的注释给删除了  然后就可以编译  为什么啊 郁闷 我明明写的是;号   莫名其妙 撞鬼了。。。
but还有那个我明明都定义了堆栈段  为什么编译完却警告没有堆栈段。。。。assume我也assume了  要mov ax,stack  mov ss,ax  我也做了 为什么却。。。
我有运行了下程序   还是发生错误。。。。郁闷  继续纠结。。。。
网上又要考概率  郁闷啊。。。。。都没时间学计算机。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 12:45:39 | 显示全部楼层
陌路狂奔 发表于 2011-6-27 10:43
没编译,我觉得这样应该可行,试一下吧

我运行了 你的代码  ok的哈  我在比较中。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 12:52:14 | 显示全部楼层
额  你多了个mov ax,data

mov ds,ax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 13:06:10 | 显示全部楼层
陌路狂奔 发表于 2011-6-27 10:43
没编译,我觉得这样应该可行,试一下吧

比较结果:
1。你多了个mov ax,data
             mov ds,ax
2.我sp设置成了0  现在改为了6      【?】    想问个问题  :如果我定义了个堆栈段  sp又设为0   有影响吗 是不是会影响到上边的数据段吗
3。貌似在循环内mov cx,9会导致无限循环。。。。我错了。。
现在试了试   额  还是错误
继续比较:
1.你用的是push di  和push si   而我是  外循环开头mov di,0  mov si,0    为什么我就不行呢。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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:[si]    ;字符字节
   mov ah,0cah   ;颜色字节
   mov es:[di+bx],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   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-27 13:16:15 | 显示全部楼层
陌路狂奔 发表于 2011-6-27 10:43
没编译,我觉得这样应该可行,试一下吧

我说这个16位子系统的错误到底是什么啊  为什么我一忽略一下就可以了  说明代码没问题   
但为什么你的代码都却没有这个错误呢。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-27 13:41:18 | 显示全部楼层
wdl7770016 发表于 2011-6-27 13:12
奇怪 改成这样还不行。。。老是跑出个什么16位子系统的错  。。

不知道你有没单步T一下呢,如果有应该知道在哪跳出那个16位子系统错误的。MOV AX,CODE   MOV CS,AX。这里你DEBUG看看会不会报错,还有那个栈顶指针指向0也就是栈底吧,如果你入栈PUSH SI  
SP=(SP-2),这里会不会有问题呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-27 13:52:22 | 显示全部楼层
你完全不用去定义CS,因为end start会默认程序的第一条指令是从start:开始的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-28 15:58:39 | 显示全部楼层
郁闷了  我debug了一下   果然是mov ax,code mov cs,ax  这有问题   我发现这两句在debug时  居然只有mov cs,ax?    前一条哪里去了 撞鬼 了   谁能解释这现象。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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