DATA SEGMENT下的代码何时在此代码中执行?

时间:2011-03-16 18:55:23

标签: assembly x86-16

我是汇编编程的初学者...... 我在谷歌浏览了很多。有很多信息,但我仍然不理解以下代码。如果有人能解释,我将不胜感激

MOV AX,DATA

我也不明白数据段中存在的代码何时会在此程序中执行。

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

2 个答案:

答案 0 :(得分:5)

警告:我的生活中从未写过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下的代码何时在此代码中执行?” - 我相信你问的是什么时候会执行DATA SEGMENT。这通常不应该执行,因为它应该存储在CODE SEGMENT中使用的数据(变量)。在某些操作系统上,你可以解决这个问题,我只相信JUMP或BRANCH代码段并将其视为常规代码段。有时堆栈溢出,堆溢出,(黑客)等都可以工作。

答案 1 :(得分:2)

Mov ax,@data是在ax中加载数据段的起始地址的方法。然后通过使用mov ds,ax数据段进行初始化。该指令用于tasm汇编程序。