wdl7770016 发表于 2011-6-28 16:07:05

为什么我输出的是两行 理论上应该是三行啊

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 sp,6
mov si,0
mov ax,0b800h
mov es,ax
mov di,0
mov bx,0
mov cx,3
yes:push cx
mov si,0
mov di,0
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 cx ;外循环的cx出照栈
loop yes
mov ax,4c00h
int 21h
code ends
end start 我写的只有一种颜色的实验9代码在网友的帮助下终于消除了bug可是 为什么只有显示两行不是应该三行吗郁闷呢。。。难道机子问题?你们机子会这样吗 。。。

wdl7770016 发表于 2011-6-28 16:17:08

奇怪不知道怎么搞的又不显示了真是莫名其妙啊 。。。。我好纠结、、、、、、、、:Q

怒剑 发表于 2011-6-28 22:48:47

帮你顶顶。

king嗜血法师 发表于 2011-6-30 01:33:51

我编写这代码的时候也有没反映的情况,然后debug -g到mov ax,4c00H的时候又能正常显示,然后q回车
在运行程序的时候又好了,不知道你是不是也是这情况。

liuhui88126 发表于 2011-6-30 15:05:48

你把mov es:,ax   改为mov es:0a0h,ax   就可以了

wdl7770016 发表于 2011-7-1 12:01:23

king嗜血法师 发表于 2011-6-30 01:33 static/image/common/back.gif
我编写这代码的时候也有没反映的情况,然后debug -g到mov ax,4c00H的时候又能正常显示,然后q回车
在运行程 ...

嗯。。。类似搞的我的神经都大条了郁闷。。。真是打击啊   好不容易写完了却无法执行 真郁闷。。。怀疑这编译器是不是太老了

wdl7770016 发表于 2011-7-1 12:03:17

liuhui88126 发表于 2011-6-30 15:05 static/image/common/back.gif
你把mov es:,ax   改为mov es:0a0h,ax   就可以了

请问为什么要改为mov es:0a0h,ax不是很明白啊。。。特别是中间那个0a0h。。。。

wx_dohko 发表于 2011-7-1 15:34:54

表示没有出现错误,我这里是显示了三行吖~~{:5_94:}

liuhui88126 发表于 2011-7-1 16:46:43

wdl7770016 发表于 2011-7-1 12:01 static/image/common/back.gif
嗯。。。类似搞的我的神经都大条了郁闷。。。真是打击啊   好不容易写完了却无法执行 真郁闷。。 ...

我也不知道啊,我随便猜的,难道猜对了?

king嗜血法师 发表于 2011-7-4 02:11:31

本帖最后由 king嗜血法师 于 2011-7-4 02:34 编辑

0a0H=160你用计算器转换下就知道,代表DIOS窗口(就是你CMD的那段,我是这么理解的- -!),每行有160列。
es:0a0h等价es:0a0h。
+0a0H就等于换行了,但你的错误并不是出在这。
你写入显存地址是从0b800h:0开始的,意思是从第一行第一列开始显示,其实是显示了3行,有一行被字给挡了,你把0b800h改成0b872H就行了,转换下720H=1824=160*11+64,就是说从第11行的第64列开始写入,这样就能显示在中间了。
页: [1]
查看完整版本: 为什么我输出的是两行 理论上应该是三行啊