Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 数据段下的代码何时在此代码中执行?_Assembly_X86 16 - Fatal编程技术网

Assembly 数据段下的代码何时在此代码中执行?

Assembly 数据段下的代码何时在此代码中执行?,assembly,x86-16,Assembly,X86 16,我是汇编编程的初学者。。。 我经常在谷歌上冲浪。有很多信息,但我仍然不理解下面的代码。如果有人能解释一下,我将不胜感激 MOV-AX,数据 我也不明白数据段中的代码何时会在这个程序中执行 ASSUME CS:CODE,DS:DATA CODE SEGMENT MOV AX,@DATA mov DS,AX ... ... CODE ENDS DATA SEGMENT ... ... ... //SOMECODE DATA ENDS 另外,有人能给我解释一下以下说

我是汇编编程的初学者。。。 我经常在谷歌上冲浪。有很多信息,但我仍然不理解下面的代码。如果有人能解释一下,我将不胜感激

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(?可以用09,4c等填充)。

MOV-DS,AX


MOV-ES,AX
警告:我一生中从未编写过8086汇编,但这就是我对它的理解

MOV AX,@DATA
是运行的第一行代码。我相信@DATA是一个变量,它保存数据段所在的内存位置的值。它将@DATA的内存位置移动到AX寄存器(16位寄存器)中。这里需要注意的一点是单词DATA前面的@。我相信这是因为@DATA是在链接过程中评估的,它将被它的实际值所取代。请注意,其他示例的前面没有@,因为它们首先引用的是实际的内存位置

MOV-DS,AX
然后将该内存位置设置为变量
DS
,这是8086组件的标准变量(本例中为寄存器)。它应该始终指向存储在你想要保存值的位置(如果你熟悉C++术语),那么, AX寄存器只是一个临时的占位符,您可以对其加载值并执行命令

移动AH,?H
首先,AH指AX寄存器的“高”侧。它的兄弟是AL,它指的是AX寄存器的“低端”。当您希望对8位而不是16位执行命令时,可以使用此选项。第二部分,您所指的??H是要存储在AH寄存器中的值。末尾的H表示“十六进制”。所以如果你有00H,那就意味着零(十六进制)。如果你输入FFH,这将与十进制中的255相同


回到您最初的问题“数据段下的代码何时在此代码中执行?”——我相信您是在问数据段何时执行。这通常不应该执行,因为它应该存储数据(变量),以便在代码段中使用。我相信,在某些操作系统上,您可以绕过这一点,只需跳转或分支到该代码段,并将其视为常规代码段。有时堆栈溢出、堆溢出(黑客攻击)等都是这样工作的。

Mov-ax,@data
是在ax中加载数据段起始地址的方法。然后通过使用
movds,ax
数据段被初始化。这条指令在tasm汇编程序中使用。

Phillips:那么我可以给出MOV DS、@DATA吗?这合法吗?MOV-AX,[5000h]在我的汇编程序中不起作用,请再说一遍……我相信,
MOV-DS,@DATA
是合法的,但我不确定。我想这取决于你使用的汇编程序。我相信你使用的是我不熟悉的英特尔语法。我看不出MOV AX,[5000h]有什么问题,但你可以试试
MOV AX,5000h
。菲利普斯:先生,如果我做MOV AX,[5000h]的话,[5000]中的值会被复制。但是如果我做MOV AX,5000h,5000将被复制。这里有很多不同之处。我说得对吗,先生?是的,你说得对。我相信你所好奇的是一种叫做“寻址模式”的东西。有不同的种类。同样,我来自摩托罗拉,所以我对英特尔寻址模式的工作原理知之甚少。google上有大量信息:)该
@data
将导致链接器在DOS EXE头中发出重新定位项
@data
数据
部分的段值。链接器将相对于其在可执行文件中的位置发出一个段值作为占位符,但DOS加载器将通过将DOS可执行文件物理加载到内存中的段添加到链接器发出的段值来修改(通过EXE头中的重新定位表)。实际上,
@data
只有在运行时才能完全了解。