8086标志寄存器设置出错

img

;设置堆栈
MOV AX,1652H;
MOV SS,AX;
MOV AX,2100H;
MOV SP,AX; 堆栈指针初值为2100H

;标志寄存器FR赋值,FLAG=2115H
MOV AX,2115H;
PUSH AX; 入栈AX, SP=2100H-2=20FEH
POPF; 标志寄存器FR赋值2115H, 出栈, SP=20FE+2=2100H
;LAHF;调试用语句,取标志寄存器低8位,检验
PUSHF ;调试用,标志寄存器入栈
POP AX; 调试用,取标志寄存器内容 ,检验
; 此时AX=2115H才对,实际调试值是0017H ,为什么入栈是2115,出栈就变成0017
求指点

以下内容部分参考ChatGPT模型:


你好,关于你的问题,我可以给出一些解决思路。

首先,你需要明确标志寄存器FR的具体格式。在8086中,标志寄存器FR共16位,每一位都代表不同的含义。例如,CF位代表进位标志,ZF位代表零标志等等。因此,如果你想要设置标志寄存器的值,需要知道每一位所代表的含义,然后将需要设置的位的值设置为1,其余位设置为0,最后将结果赋值给标志寄存器即可。

其次,关于你的代码中设置堆栈的部分,需要注意的是,堆栈指针初值应该为1650H,而不是2100H。因为堆栈是从高地址向低地址生长的,所以堆栈指针初值应该先指向堆栈的最后一个地址,即1650H,然后通过向下移动堆栈指针来分配堆栈空间。

最后,关于代码中设置标志寄存器的部分,你可以通过以下代码实现:

MOV AX, 2115H ; 将需要设置的标志位的值赋值给AX寄存器
PUSHF ; 将标志寄存器的值压入堆栈中
POP AX ; 将标志寄存器的值弹出堆栈,并存储到AX寄存器中
OR AX, 0F000H ; 将AX寄存器的高4位设置为1,表示标志寄存器的版本号为8086
PUSH AX ; 将AX寄存器的值压入堆栈中
POPF ; 将堆栈中的值弹出,并存储到标志寄存器中

以上代码将标志寄存器的CF、PF、AF、ZF、SF、TF、IF、DF、OF位设置为需要设置的值,同时将标志寄存器的版本号设置为8086。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快