当前位置: 代码迷 >> 汇编语言 >> int 21h过程中哪些寄存器是易失的?解决方案
  详细解决方案

int 21h过程中哪些寄存器是易失的?解决方案

热度:3317   发布时间:2013-02-26 00:00:00.0
int 21h过程中哪些寄存器是易失的?
win32的x86调用约定是:通用寄存器中:eax、ecx和edx是易失的,以后想用的话需要在调用函数前保存;ebx、esp、ebp、esi和esi是非易失的,callee用到这些寄存器的话会给你保存。

现在问题是:DOS功能调用“int 21h”执行过程中哪些寄存器是易失的?

sp和ss肯定不是易失的,其他段寄存器也应该不是易失的。其他的呢??


------解决方案--------------------------------------------------------
自己用DEBUG测试一下就知道了
------解决方案--------------------------------------------------------
本来打算悄悄路过,想了想,还是多几句嘴。
这原本就不能成为一个问题。
MS-DOS虽然过时,也是成熟的操作系统吧。这样的系统,必然会考虑得很周全。进入功能调用后,要用到哪些寄存器,除非用来返回参数,一律都要保护起来,返回时再恢复。
不单单是操作系统了,就是自己写个小小的功能调用,也不能破坏主程序执行的连贯性,决不能做任何违背这种连贯性的假设。
Assembly code
mov cx,0mov ah,0int 21h    ;MS-DOS不能假设cx的值以后不用。inc cx     ;cx还是要用到的。
------解决方案--------------------------------------------------------
探讨
引用:

自己用DEBUG测试一下就知道了

我的老师也是这么说的,但我对这个回答不满意。

汇编程序员是不是普遍都不太考虑兼容性啊?虽然做不到不同指令集兼容,但考虑不同的DOS系统兼容还是有意义的吧?

比如说如果我在FreeDOS上step into “int 21h”发现中断服务程序会首先保存各寄存器,不代表在MS-DOS上寄存器也会被保存。这就需要某种统一的……

------解决方案--------------------------------------------------------
我还是觉得,第一,不管是DOS,还是Windows,不能对主程序做任何假设,也不能让主程序的执行失去连续性。换句话说,不能让主程序在调用了API之后,失去某些寄存器的值。这个原则在DOS下贯彻得很好,这是我的感觉。
第二,主动权在程序员手上。在调用这些API时,必须了解该API会返回什么,用哪些寄存器返回。但可以肯定,不用于返回参数的寄存器,不会被破坏,这是个原则。
是的,MSDN是说要用到EAX\ECX这类寄存器,而且EAX几乎每个API都用,用于返回布尔值什么的。但是,如果没有用于返回值,我想它一定不会被破坏。这是我的观点。
------解决方案--------------------------------------------------------
第四楼喂CSDN

------解决方案--------------------------------------------------------
第四楼喂CSDN

------解决方案--------------------------------------------------------
第四楼喂CSDN

------解决方案--------------------------------------------------------
第四楼喂CSDN
  相关解决方案