首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-05-06 
int 21h过程中哪些寄存器是易失的?win32的x86调用约定是:通用寄存器中:eax、ecx和edx是易失的,以后想用的话

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

热点排行