5

我是汇编编程的初学者......我在谷歌上冲浪了很多。资料很多,但还是看不懂下面的代码。如果有人可以解释,我将不胜感激

移动轴,数据

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

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

4

2 回答 2

6

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

于 2011-03-16T19:21:09.430 回答
3

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

于 2012-05-02T03:06:49.830 回答