题
我是组装编程的初学者...我在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组装程序。