我正在查看 DOS 的规范int 21h
在这里打断http://spike.scu.edu.au/~barry/interrupts.html
我对汇编不太了解,但似乎 AL 寄存器是存储中断返回值的标准。例如,服务01h(读取字符)存储读取的字符。服务 02h(将字符写入标准输出)将最后一个字符输出存储在那里。
但是当 AH=09h(将字符串写入标准输出)时,返回值始终是 24h。这是为什么?
首先,我认为出于某些技术原因必须设置某些值,但情况似乎并非如此。有许多 DOS 服务根本不指定返回值。有些将返回值存储在其他寄存器中,例如 2Ch(获取系统时间)它将结果存储在 CH、CL、DH 和 DL 寄存器中,而不是 AL。
那么为什么中断服务AH=09h要在AL中存储一个值呢?为什么是24小时?
只是为了更多细节:
你可以看到hereMS-DOS v1.25 中该系统调用的源代码:
PRTBUF: ;System call 9
MOV SI,DX
OUTSTR:
LODSB
CMP AL,"$"
JZ RET20
CALL OUT
JMP SHORT OUTSTR
它使用LODSB
循环中的指令从字符串加载字节,并将它们进行比较$
,并将它们写出来。自从LODSB
是硬连线加载到AL
,循环终止于$
被看到,这就是剩下的AL
.
DOS API 指定 AX 不需要由系统调用保留(请参阅MS-DOS 程序员参考手册,1.10.4,“寄存器的处理”),并且服务09h的返回值仅被描述为“无”。因此,对于 AL 在退出时应包含的内容,没有任何书面保证;它的内容只是未指定。其他版本的 DOS 可能有不同的行为,因此您显然不应该依赖这种行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)