汇编 - 为什么我们需要在写入操作期间将某些值从寄存器移动到另一个寄存器(f.ex., mov si, ax)?

Assembly - why do we need to move certain values from register to another register (f.ex., mov si, ax) during a write operation?

我一直在学习教程系列,现在我来到了我们写入文件的部分。这是写入文件的代码的一部分,如教程中所示:

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

作者确实是一步步解释的,只是他没有把每一行都解释得同样通俗易懂。我理解了初始部分,即 ah, 3d & al, 1 打开文件并设置写入的阶段,而 dx, 150 针对特定文件,但我不确定以下内容

比如为什么我们要把ax移动到si,为什么不能把值留在ax中?为什么我们进一步将 si 移动到 bx - 为什么值不能保留在 si 中?感谢您的任何澄清...我知道这是一个菜鸟问题,但澄清这一点对我有很大帮助。谢谢

中断21h的调用约定"system calls"在特定的寄存器中有参数和return代码。例如。要进行的调用类型的选择器在寄存器 ah 中。对于打开文件调用 (3dh),al 是共享模式,ds:dx 是指向文件名的指针。它 return 的结果是 ax。但是 axahal 重叠,为了进行写入调用,40h 必须放在 ah 中,因为这是写入调用的选择器。在 ax 中编辑的文件句柄 return 必须保留,这涉及将其写入内存或将其移动到保证在整个调用过程中保留的寄存器。

您可以查看有关 int 21h 调用约定的文档,例如here, or in Ralph Brown's interrupt list. See also other x86 docs in the 标记 wiki。