【问题标题】:Assembly - why do we need to move certain values from register to another register (f.ex., mov si, ax) during a write operation?汇编 - 为什么我们需要在写操作期间将某些值从寄存器移动到另一个寄存器(f.ex.、mov si、ax)?
【发布时间】: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


【解决方案1】:

中断 21h“系统调用”的调用约定在特定寄存器中具有参数和返回码。例如。要进行哪种类型的调用的选择器在寄存器ah 中。对于 Open File 调用 (3dh),al 是共享模式,ds:dx 是指向文件名的指针。它在ax 中返回结果。但是axahal 重叠,并且为了进行写调用,必须将40h 放入ah,因为这是写调用的选择器。 ax 中返回的文件句柄必须保留,这涉及将其写入内存或将其移动到保证在调用期间保留的寄存器。

您可以查看有关 int 21h 调用约定的文档,例如here,或Ralph Brown's interrupt list。另请参阅 标签 wiki 中的其他 x86 文档。

【讨论】:

  • 谢谢 Zalman,我现在看得更清楚了。我看到这里有很多东西要学习,所以如果我再次遇到问题,我会发布更多内容:)
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2015-11-01
  • 2016-10-28
  • 2016-11-11
  • 2021-11-25
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多