【发布时间】:2017-11-07 07:29:52
【问题描述】:
我一直在关注一个教程系列,我已经来到了我们写入文件的部分。这是写入文件的部分代码,如教程中所示:
mov ah, 3d
mov al, 1
mov dx, 150
int 21
mov si, ax
mov ah, 40
mov bx, si
mov cx, 0d
mov dx, 175
int 21
int 20
作者确实是一步一步解释的,只是他没有以同样可以理解的方式解释每一行。我了解初始部分,啊,3d & al, 1 打开文件并设置写入阶段,而 dx, 150 针对特定文件,但我不确定以下内容
例如,为什么我们将 ax 移动到 si,为什么值不能保留在 ax 中?为什么我们进一步将 si 移动到 bx - 为什么值不能保留在 si 中?感谢您的澄清......我知道这是一个菜鸟问题,但澄清这个问题对我有很大帮助。谢谢。
【问题讨论】:
-
因为
int 21h调用的函数会在那里寻找它。这称为“调用约定”或 ABI:调用者和被调用者之间的协议,其中 arg 去哪里。请参阅ctyme.com/rbrown.htm 了解 16 位 BIOS / DOS 系统调用接口。 -
另外,您省略了
h后缀以使中断号为十六进制常量。现在是 21 小时。 -
int 21h并不神奇,它只是让 CPU 开始执行不同代码的“跳转/调用”指令之一。该代码是由您的 DOS 供应商编写的。该供应商决定,他的代码将检查ah的某个值,例如40h,如果它在那里找到它,它会将数据写入文件句柄bx,长度为cx,地址为@987654330 @。si包含文件句柄的副本,可能用于教程的后面部分,此特定调用不需要。你也不能在不修改ax的情况下做ah=40h,它是同一个寄存器,只是位范围不同。其他操作系统可能[/将] 采取不同的行动。 -
谢谢 Peter Cordes / Ped7g,这是我需要了解发生了什么的解释
-
@PeterCordes - 没有
h后缀,也许这本书使用 debug.com 作为粗略的汇编程序?偏移量是硬编码的,而不是符号。
标签: assembly x86 computer-science