. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  试验9遇到的问题,望大虾赐教!(急!)  [已解决] 回复[ 6次 ]   点击[ 398次 ]  
abcdwzxy
[帖 主] [ 发表时间:2009-05-08 13:27 ] 
荣誉值: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中的值。

小弟实在想不明白,请各位大虾指点一下,谢谢!
abcdwzxy
[第4楼] [ 回复时间:2009-05-09 10:58 ] 
荣誉值: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开始的内存空间中。
这可能与三楼说的屏幕在变化有关吧,但是我觉得这个程序应该是没问题,咋就不能运行呢?
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved