为何IRET后JC跳转失效?8086汇编文件打开问题求助
关于DOS int 21h 3Dh功能调用后进位标志判断的问题
你的代码逻辑本身是正确的,不存在**IRET重置进位标志(CF)**导致判断失效的情况,原因如下:
DOS的int 21h中断服务程序在完成功能调用后,会主动修改FLAGS寄存器中的CF位:
- 文件打开成功时,CF被清零
- 打开失败时,CF被置位
而IRET是中断服务程序返回时执行的指令,它会将DOS修改后的FLAGS寄存器值恢复到CPU中,所以int 21h返回后,你直接用JC指令判断CF状态完全有效,不需要额外操作阻止IRET的行为。
你可能误解了INT指令的执行流程:当你执行INT 21H时,CPU会先保存当前FLAGS到栈中,然后调用DOS的服务程序;服务程序处理完后修改CF,再通过IRET将修改后的FLAGS弹回CPU,所以你拿到的CF就是DOS设置的结果。
如果实际运行中你的JC DATAFILENOTFOUND没有正确跳转,大概率是其他环节出了问题,可以排查这几点:
- 确认
SYSFILENAME是以0字节结尾的ASCII字符串(DOS的3Dh功能要求文件名必须是ASCIIZ格式) - 检查DS寄存器是否指向
SYSFILENAME所在的数据段,比如程序开头需要添加:MOV AX, @DATA MOV DS, AX - 可以在
INT 21H后添加测试代码,验证CF状态:INT 21H JNC OPEN_SUCCESS ; 这里处理失败逻辑 OPEN_SUCCESS: MOV FILEHANDLE, AX
内容的提问来源于stack exchange,提问作者KAH CHUN LEE
相关产品推荐
相关产品推荐

