我是组装编程的初学者...我在Google中浏览了很多。有很多信息,但我仍然不了解以下代码。如果有人可以解释,我会很感激

MOV AX,数据

我也不了解该程序中数据段中存在的代码何时执行。

ASSUME CS:CODE,DS:DATA

CODE SEGMENT
 MOV AX,@DATA
 mov DS,AX
 ...
 ...
CODE ENDS


DATA SEGMENT
   ...
   ...
   ... //SOMECODE
DATA ENDS 

另外,有人可以向我解释以下说明是什么?

MOV AH , ??H ( ?? can be filled with 09,4c etc).

MOV DS,AX

MOV ES,AX

有帮助吗?

解决方案

警告:我一生中从未写过8086集会,但这就是我所做的。

MOV AX,@DATA 是运行的第一行代码。我相信@Data是一个变量,它具有数据段寿命的内存中位置的值。它将@data的内存位置移至斧头寄存器(16位寄存器)中。这里要注意的一件事是单词数据前面的 @。我相信这是因为在链接过程中对@Data进行了评估,它将被其实际值所取代。请注意,其他示例如何在前面没有 @,因为它们是指从开始的实际存储位置。

MOV DS,AX 然后将将该内存位置设置为变量 DS 这是8086组件的标准变量(或在这种情况下注册)。它应始终指向您要保留值的存储位置(如果您熟悉C ++术语,则堆)。

斧头寄存器只是一个临时的持有人,您可以加载值并执行执行命令。

MOVE AH, ??H 首先,AH是指斧头寄存器的“高”侧。它的兄弟将是指斧头寄存器的“低”一侧。当您要使用8位而不是16位执行命令时,使用此方法。第二部分,您所指的是您要存储在AH寄存器中的值。最后的H表示“十六进制”。因此,如果您有00H,则表示为零(在十六进制中)。如果您放入小数号系统中的FFH与255相同。

回到您的最初问题“数据段下的代码在此代码中何时执行?” - 我相信您会问何时执行数据段。通常不应该执行此操作,因为它应该存储在代码段中使用的数据(变量)。在某些操作系统上,我相信您可以解决这个问题,只需跳或分支到该代码部分,然后将其视为常规代码段。有时,这就是堆叠溢出,堆溢出,(黑客)等的方式。

其他提示

Mov ax,@data 是在AX中加载数据段的起始地址的方式。然后使用 mov ds,ax 数据段初始化。该指令用于TASM组装程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top