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

Mut*_*han 5 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 
Run Code Online (Sandbox Code Playgroud)

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

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

MOV DS,AX

MOV ES,AX

Joe*_*ips 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代码段并将其视为常规代码段.有时堆栈溢出,堆溢出,(黑客)等都可以工作.

  • @data将使链接器在DOS EXE标头中发出一个重定位条目。@data是data部分的段值。链接器将发出一个与它在可执行文件中的位置有关的段值(作为占位符),但将由DOS加载程序通过添加DOS可执行文件实际加载到的段进行修改(通过EXE头中的重定位表)。具有链接器发出的段值的内存。实际上,仅在运行时才完全知道@data。 (3认同)