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