有一道题目:
已知SP=0100H,SS=0300H,PSW(标志寄存器)=0240H,00020H至00023H单元的内容分别是40H,00H,00H,01H.同时还一直INT 8的偏移量00A0H,在段基值为0900H的代码段,试指出在执行INT 8指令并进入该指令相应的中断例程时SP,SS,IP,CS,PSW和堆栈最上面的三个字的内容。用图表示。

上面这道题目,就不需要用图表示了,不过如果你画图的话,会更容易理解。

在执行INT 8这个中断后,应该系统会把PSW和'INT 8'这一句下面的一句的CS与IP压到堆栈中(这称为保存现场),然后按照INT 8指向的中断向量表找到00020H到00023H单元,把其中的数据传给IP和CS,进入中断程序处理,处理完成后再弹出堆栈中的IP和CS数据到IP和CS,继续执行下面一句。

[b]这里我想知道‘INT 8’这个语句到底占多少个字节,转换成机器码是什么,如何存放在内存中的代码段中,我知道8是个8位数据,占一个字节,但是我不知道INT 8这一句转换成机器码具体是什么,以及转换后的机器码如何存放在内存中的代码段中(不知道操作数8是个8位立即数,是否就是表示在高地址内存存储单元独占一个存储单元,如果是这样,INT转换成机器码又占多少个字节,又如何存放呢,是存放在8这个立即数的上面一个低地址存储单元吗?)?[/b]

我为什么想知道'INT 8'这个语句占多少个字节,因为推进堆栈保护的IP和CS数值指示的是'INT 8'这个语句的下一个语句的所在位置,所以推进堆栈IP值必定是[b]'INT 8'的偏移地址[/b]再[b]加上[/b]'INT 8'在代码段所占的[b]存储单元数[/b]

所以必须知道'INT 8'这个语句所占的字节数(再折合成存储单元数,因为在一般的内存中,一个字节8位为一个存储单元),才能计算下一个语句所在位置的IP,从而送入堆栈保护。