警告:我一生中从未编写过 8086 程序集,但这就是我所做的。
MOV AX,@DATA
是运行的第一行代码。我相信@DATA 是一个变量,它保存数据段所在的内存位置的值。它将@DATA 的内存位置移动到AX 寄存器(16 位寄存器)。这里要注意的一件事是 DATA 前面的 @。我相信这是因为 @DATA 在链接过程中被评估,它将被它的实际值取代。请注意其他示例如何在前面没有 @,因为它们指的是实际的内存位置。
MOV DS,AX
然后将该内存位置设置为变量,该变量DS
是 8086 汇编的标准变量(或本例中的寄存器)。它应该始终指向要保存值的存储位置(如果您熟悉 C++ 术语,则为堆)。
AX 寄存器只是一个临时占位符,您可以加载值并对其执行执行命令。
MOVE AH, ??H
首先,AH 指的是 AX 寄存器的“高”端。它的兄弟是 AL,它指的是 AX 寄存器的“低”端。当您想要针对 8 位而不是 16 位执行命令时使用此选项。第二部分,您所指的 ??H 是您要存储在 AH 寄存器中的值。末尾的 H 表示“十六进制”。所以如果你有 00H 这意味着零(十六进制)。如果输入 FFH,则与十进制数字系统中的 255 相同。
回到您最初的问题“DATA SEGMENT 下的代码何时在此代码中执行?” -- 我相信你在问什么时候会执行数据段。这通常不应该被执行,因为它应该存储数据(变量)以在您的代码段中使用。我相信在某些操作系统上,您可以解决这个问题,只需跳转或分支到该代码段并将其视为常规代码段。有时这就是堆栈溢出、堆溢出、(黑客)等所有工作的方式。