|
主题 : : 实验9调试通过,但是还是疑惑 [待解决] |
回复[ 7次 ]
点击[ 504次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-04-20 10:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05 |
俺菜鸟初学,实验9写了3个小时,终于成功得到结果。但是调试的时候发现B800显示缓冲区里面的信息没有按照预想中改变的?为什么呢?
assume cs:cod,ds:data
data segment
db 'welcome to masm!'
data ends
cod segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,0
mov cx,16
s1:
mov bp,07c0h
mov al,ds:[di]
mov es:[bp+si],al
mov al,072h
mov es:[bp+si+1],al
add bp,160
mov al,ds:[di]
mov es:[bp+si],al
mov al,024h
mov es:[bp+si+1],al
add bp,160
mov al,ds:[di]
mov es:[bp+si],al
mov al,071h
mov es:[bp+si+1],al
inc di
add si,2
loop s1
mov ax,4c00h
int 21h
cod ends
end start
我把内容写在显示缓冲区13行左右位置(即B800:0780~081F 为第一行,下一行即+160) | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-04-20 11:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
楼主的上述代码已经能正确显示了,这说明显示缓存的内容是按程序的行为改变了,否则不会有正确的显示结果的。不知楼主所说“显示缓冲区里面的信息没有按照预想中改变的”是什么意思? | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-04-21 15:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05 |
谢谢一楼的回答!
我的意思是B8000H~BFFFFH里程序执行前显示
B800:0780 20 F0 20 F0 20 F0-20 F0 20 F0 20 F0 20 F0 20 F0
B800:0790 .......
B800:07A0 .......
按道理,程序执行后,应该是
B800:0780 77 72 65 72 6C 72-63 72 6F 72 6D 72 65 72 20 72 welcome
B800:0790 .......
B800:07A0 .......
吧?但是显示的却是
B800:0780 53 F0 49 F0 2B F0-30 F0 32 F0 20 F0 20 F0 20 F0 S.I.,.+.0.2
B800:0790 .......
B800:07A0 .......
是吗 为什么呢? | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-04-21 20:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
两个问题:
① 代码明确是从0b800:07c0开始的,你文中提到的0780是从哪里来的?
② 我执行了那个程序后在db800:7c0 看到的内容如下:
-g
Program terminated normally
-db800:7c0 7cf
B800:07C0 77 72 65 72 6C 72 63 72-6F 72 6D 72 65 72 20 72 wrerlrcrormrer r
-
welcome to masm!
welcome to masm!
welcome to masm!
请你注意在“welcome"的每个字母之间多了一个"r",下面代码我的注释:
mov es:[bp+si],al ;将要显示的字符填入显示字节单元
mov al,072h ;al装入显示属性072h,这正好是字符"r"的内码
mov es:[bp+si+1],al ;填入属性字节单元
至于什么是显示属性字节,请看我的博文:
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19481&kindId=34937&postId=40493&readSg=1 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-04-23 17:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05 |
对对,我写错了,应该是B800:07C0,但是发现问题还没解决。如下:
-db800:7c0
B800:07C0 42 F0 50 F0 2C F0 30 F0-37 F0 43 F0 30 F0 20 F0 B.P.,.0.7.C.0. .
B800:07D0 20 F0 20 F0 20 F0 20 F0-20 F0 20 F0 20 F0 20 F0 . . . . . . . .
执行后显示
-g
Program terminated normally
-db800:7c0
B800:07C0 30 F0 30 F0 20 F0 20 F0-53 F0 50 F0 3D F0 30 F0 0.0. . .S.P.=.0.
B800:07D0 30 F0 34 F0 30 F0 20 F0-20 F0 20 F0 4E F0 56 F0 0.4.0. . . .N.V.
为什么我跟你的不一样呢?劳烦这位大侠赐教了~ | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-04-23 18:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46 |
我怎么弄都是一样的呀?要不用QQ联系我:28926141 | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-04-24 14:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-03-04 10:05 |
|
|
|
|
|
[第7楼]
[ 回复时间:2010-06-02 15:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-06-01 10:34 |
我也有代码 自己写的分享吧。。。
assume cs:code
data segment
db 'Welcome to masm!',0
data ends
code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show
mov ax,4c00h
int 21h
show : mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov dh,0
add ax,dx
add ax,dx
sub ax,2
mov di,ax
mov bh,cl
change: mov cl,ds:[si]
mov ch,0
jcxz ok
mov bl,cl
mov es:[di],bx
add di,2
inc si
jmp short change
ok: ret
code ends
end start | | |