【问题标题】:When Will the Code Under DATA SEGMENT execute in this code?DATA SEGMENT 下的代码什么时候会在这段代码中执行?
【发布时间】:2011-03-16 18:55:23
【问题描述】:

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

移动轴,数据

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

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

【问题讨论】:

    标签: assembly x86-16


    【解决方案1】:

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

    【讨论】:

    • Phillips:那我可以给 MOV DS,@DATA 吗?合法吗?并且 MOV AX,[5000h] 在我的汇编程序中不起作用请也谈谈这个......
    • 我相信MOV DS,@DATA 是合法的,但我不确定。我认为这取决于您使用的汇编程序。我相信您正在使用我不熟悉的 Intel 语法。我真的看不出MOV AX,[5000h] 有什么问题,但你可以试试MOV AX,5000h
    • Phillips:先生,如果我执行 MOV AX,[5000h] 将复制 [5000] 中的值。但如果我做 MOV AX,5000h 5000 将被复制。这里有很多不同。先生,我说得对吗?
    • 是的,你是对的。我相信你好奇的是一种叫做“寻址模式”的东西。有不同的种类。同样,我来自摩托罗拉背景,所以我对英特尔寻址模式的工作原理知之甚少。谷歌上有大量信息:)
    • @data 将导致链接器在 DOS EXE 标头中发出重定位条目。 @datadata 部分的段值。链接器将发出一个相对于其在可执行文件中的位置的段值作为占位符,但 DOS 加载器将通过添加 DOS 可执行文件物理加载到的段来修改(通过 EXE 标头中的重定位表)带有链接器发出的段值的内存。实际上,@data 只有在运行时才完全知道。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2015-02-05
      • 2013-06-26
      • 1970-01-01
      • 2019-02-18
      • 2016-05-16
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多