|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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系统没有内存保护,意味着你可以读写内存里的任意位置,但一旦
操作不慎,很容易就造成系统崩溃。
|
|