philly_fei 发表于 2020-11-17 15:14:26

SS SP的用法 实验6-1

原题是用DS:的方式来获取内容但是我想的是 如果我把SS设置为0 SP也设置为0那么当我直接POP的时候 就取出来了一个 然后SP也自动加2 这样的话 来个循环就可以取出来了

但是DEBUG调试的时候 到了mov cs:,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:,ax
          add bx,2
          loop s
          
          mov ax,4c00h
          int 21h
abc ends
end start

xieglt 发表于 2020-11-17 17:50:10

首先,不要把SS设置为0,这样做语法上没有问题,但是相当危险。。
因为从0开始的256*4 = 1024个字节保存着系统的中断向量表。中断向量表指向系统的中断服务程序。
这里是不能去修改的,一旦修改,就不知道会出什么问题。

你的程序从中断向量表里取值是想干什么?

另外,程序单独运行是没有问题的,因为你只是对中断向量表进行读操作。没有写,不会破坏。
但是不要用调试器去调试。调试器会用到你程序的栈,调试器会认为程序的SP之前的数据是没有
用的,调试器会使用SP之前的内存,当执行pop ax 后,sp 指向 0000:0002 ,
而0000:0000 - 0000:0004 保存的是 int 1 的服务程序,int 1也就是单步中断。
单步中断的服务例程被修改了,调试器还能工作吗?

很多东西不要想当然,中断向量表、栈这些东西不要轻易去改动。
DOS系统没有内存保护,意味着你可以读写内存里的任意位置,但一旦
操作不慎,很容易就造成系统崩溃。

philly_fei 发表于 2020-11-18 18:33:05

xieglt 发表于 2020-11-17 17:50
首先,不要把SS设置为0,这样做语法上没有问题,但是相当危险。。
因为从0开始的256*4 = 1024个字节保存着 ...

大神的回答让我五体投地 那我以后不这样写了~哈哈 我只是偷个懒 程序说拷那段数据 我就想的干脆用栈POP出来~~~
页: [1]
查看完整版本: SS SP的用法 实验6-1