| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
原题是用DS:[BX]的方式来获取内容  但是我想的是 如果我把SS设置为0 SP也设置为0  那么当我直接POP的时候 就取出来了一个 然后SP也自动加2 这样的话 来个循环就可以取出来了 
 
但是DEBUG调试的时候 到了mov cs:[bx],ax 这句的时候就出错了 请问下错在哪里了。。 
 
assume cs:abc 
abc segment 
      dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 
start: 
      mov ax,0 
          mov ss,ax 
          mov sp,0h 
      mov cx,8h 
          mov bx,0h 
s:          pop ax 
      mov cs:[bx],ax 
          add bx,2 
          loop s 
           
          mov ax,4c00h 
          int 21h 
abc ends 
end start
首先,不要把SS设置为0,这样做语法上没有问题,但是相当危险。。 
因为从0开始的256*4 = 1024个字节保存着系统的中断向量表。中断向量表指向系统的中断服务程序。 
这里是不能去修改的,一旦修改,就不知道会出什么问题。 
 
你的程序从中断向量表里取值是想干什么? 
 
另外,程序单独运行是没有问题的,因为你只是对中断向量表进行读操作。没有写,不会破坏。 
但是不要用调试器去调试。调试器会用到你程序的栈,调试器会认为程序的SP之前的数据是没有 
用的,调试器会使用SP之前的内存,当执行pop ax 后,sp 指向 0000:0002 , 
而0000:0000 - 0000:0004 保存的是 int 1 的服务程序,int 1也就是单步中断。 
单步中断的服务例程被修改了,调试器还能工作吗? 
 
很多东西不要想当然,中断向量表、栈这些东西不要轻易去改动。 
DOS系统没有内存保护,意味着你可以读写内存里的任意位置,但一旦 
操作不慎,很容易就造成系统崩溃。 
 
 
 
 |   
 
 
 
 |