我是汇编编程的初学者...... 我在谷歌浏览了很多。有很多信息,但我仍然不理解以下代码。如果有人能解释,我将不胜感激
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
答案 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汇编程序。