当前位置: 代码迷 >> 汇编语言 >> 很小的汇编小程序运行后死机,why?解决方案
  详细解决方案

很小的汇编小程序运行后死机,why?解决方案

热度:9038   发布时间:2013-02-26 00:00:00.0
很小的汇编小程序运行后死机,why?

 ;===============================
  assume cs:code
  code segment
  GoRun:
  mov ax,0b800h
  mov es,ax
  xor bx,bx
  mov al,'A'
  mov ah,07h
  s:mov word ptr es:[bx],ax
  add bx,2
  jmp s
  code ends
  end GoRun
  ;===============================
功能:在屏幕上显示不断地显示A字符

编译链接运行,正常
可是一会儿电脑就要死不死的了(卡)!再次运行这个小程序提示ntvdm错误!
等一会就完全死了,就是关机都关不了,只有cut电源重启才行.
重启之后再运行一次,又这样了......

在xp下dos程序都是ntvdm虚拟运行的,dos程序应该不会直接把xp搞死机才是呀!?ES,DS不可能真被它改了吧.....

开始我以为是我的系统问题,或者系统补丁的问题.因为我同学的电脑没有这样的情况,前几天我重装了系统,打补丁也没有用呀(不同的三个系统光盘都试过了)
今天我才来提问!难道是我的CPU的问题!?

电脑:HP4416s(笔记本):
CPU AMD
x86 Family 16 Model 6 Stepping 2 AuthenticAMD ~1994 Mhz


------解决方案--------------------------------------------------------
s:mov word ptr es:[bx],ax
add bx,2
jmp s

死循环,不死才怪
------解决方案--------------------------------------------------------
把cx做计数器,用loop来构成循环,就可以啦。
------解决方案--------------------------------------------------------
1楼正解!程序为死循环,jmp改用条件转移指令或循环指令完成,
mov cx,15 ;cx记数,用来控制输出字符'a'的次数
s:mov word ptr es:[bx],ax
add bx,2
dec cx
jnz s
程序后面最好加上
mov ah,4ch
int 21h
返回dos操作系统,让程序正确结束
------解决方案--------------------------------------------------------
lz威武写个程序出问题居然怀疑os
------解决方案--------------------------------------------------------
s:mov word ptr es:[bx],ax
add bx,2
jmp s

S标签设置在add bx,2前面
后面有个jmp s的动作
有跳回s 中间也没有条件跳出
自然会死掉
cpu占满了就
------解决方案--------------------------------------------------------
jmp s,无条件转移,这是个死循环,2楼的改好了
------解决方案--------------------------------------------------------
是不应该将 xp 整趴窝了,也就是运行这个程序的命令行窗口失去相应,对于的 cpu 核满载。叉掉了命令行窗口,xp 应该恢复正常。再次运行,也只能是在新的命令行窗口下,反应也该是一样的。
刚才在虚拟机的 xp 里试了下,没有发现 xp 完蛋的迹象。
------解决方案--------------------------------------------------------
assume cs:code
code segment
这两句调换一下位置
------解决方案--------------------------------------------------------
实机和虚拟机中运行都没出现楼主描述的现象.
最多只改下XP下的虚拟器中的中断,保护模式下的,怎么那么大反应?!
------解决方案--------------------------------------------------------
死循环不至于整个系统over吧?楼主换系统试试。
------解决方案--------------------------------------------------------
内存0b8000000是显存,这个是直接写显存来显示字符,在DOS下很常见,但是在Windows下很少用。
若只有你的机器出现问题,我怀疑应该和显卡有关系。
和死循环没有关系,即使是死循环,bx也会回绕的(即加到了FFFF会到0重新开始)。
  相关解决方案