|
主题 : : 试验9遇到的问题,望大虾赐教!(急!) [已解决] |
回复[ 6次 ]
点击[ 397次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-05-08 13:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2009-03-13 16:19 |
这是本人写的实验9的程序
assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800H
mov es,ax
mov bx,3c3dH
mov si,0
mov cx,16
s:mov dh,0caH
mov dl,[si]
mov es:[bx+0110H],dx
inc si
add bx,2
loop s
code ends
end start
本人理解的在屏幕中间显示是在第13行的第33列至地48列显示(用0110H定位第13行,bx定位列)
这个程序本人编译和连接都通过,生成了EXE文件。
当我运行时却出现了 NTVDM CPU遇到无效指令的对话框,这说明我的程序已经修改了一段存有重要数据的内存地址空间;但是当我用debug进行跟踪时,却每条指令都能用T命令执行。
而且当执行 mov es:[bx+0110H],dx指令后,用D命令查看修改的内存空间时,其值不是DX中的值。
小弟实在想不明白,请各位大虾指点一下,谢谢! | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-05-08 15:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-12-21 10:26 |
我觉得,第一点,楼主的内存寻址方式并不合理,我不关心你所定的位置是不是中间的位置,但是从程序中可以看出,你没有按题意要求显示三种不同格式的字符串,如果程序运行顺利,你在屏幕上也只能看到一种字符串,这样的话,我觉得 mov es:[bx+0110H],dx这条指令完全可以写成mov es:[bx],dx这种格式。第二点,至于运行出的的无效指令,及没有看到DX中的值,我觉得会不会与数据段没有在声明中指出有关,我没有测试这个程序只是感觉上的一个疑点,楼主可以自己再测试一下看看 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-05-09 10:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
程序返回dos的mov ax,4c00h int 21h跑哪去了啊 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-05-09 10:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
而且当执行 mov es:[bx+0110H],dx指令后,用D命令查看修改的内存空间时,其值不是DX中的值。
-----------------
这条指令是往“显存”写数据吧,这条指令的位置也就是我们当前屏幕上显示的字符等内容,屏幕在变化当然es:[bx+0110H],中的数据也是变化的了。
所以这个程序最好的运行方法是debug下g命令或是dos下直接运行exe文件.(如果屏幕显示滚屏了是会对现实结果有所影响的~) | | |
|
|
|
|
[第4楼]
[ 回复时间:2009-05-09 10:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2009-03-13 16:19 |
不好意思
mov ax,4c00H
int 21H
忘写了
mov es:[bx+0110H],dx 我是用0110定位到第13行,而用bx来定位列;
我这个程序只是用了一下caH这种表示字符的属性来试探一下该程序能否正常运行。
而且,我把我的这个试探程序改简单了一些
assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0b800H
mov es,ax
mov cx,16
mov bx,0
mov si,0
mov dh,0caH
s:mov dl,[si] (把属性caH放到DH中,把字符的ASCII码放到DL中)
mov es:[bx],dx (把DX中的内容,高位字节caH,低位字节ASCII码放入B800:0000开始的内存空间 中)
inc si
add bx,2
loop s
mov ax,4c00H
int 21H
code ends
end start
改成这样后还是不能正常运行,如果在DOS下直接运行EXE文件,则DOS会被直接关闭掉,也不会弹出“NTVDM CPU遇到无效指令的对话框”,用DEBUG进行跟踪,同样会看不到DX中的值被送入到B800:0000开始的内存空间中。
这可能与三楼说的屏幕在变化有关吧,但是我觉得这个程序应该是没问题,咋就不能运行呢? | | |
|
|
|
|
[第5楼]
[ 回复时间:2009-05-09 11:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2009-03-13 16:19 |
我觉得我和那个
“[置顶] 实验9自已编完后有调试中有一些不明白的地方”的程序写的思路是一样的啊,
不过我只是试探一下能否正常运行! | | |
|
|
|
|
[第6楼]
[ 回复时间:2009-06-22 02:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:3
注册日期:2009-03-13 16:19 |
此贴由 贴主 于 [ 2009-06-22 02:33 ] 结贴。 结贴原因:问题已解决 | | |