gpt4 book ai didi

assembly - MASM SEG 运营商

转载 作者:行者123 更新时间:2023-12-02 19:10:56 28 4
gpt4 key购买 nike

假设我们正在使用 MASM 6.1/16 位/大数据模型编写汇编代码,并且我们有一个名为 MY_VAR 的变量(标签)、一个名为 MY_SEG 的段和一个名为 MY_GROUP 的段组。假设 MY_VAR 放置在 MY_SEG 中,并且 MY_SEG 属于 MY_GROUP。

那么,下面两条语句有什么区别:

1) MOV AX, MY_SEG
2) MOV AX, SEG MY_SEG:MY_VAR

此外,以下两种说法有什么区别:

1) MOV AX, MY_GROUP
2) MOV AX, SEG MY_GROUP:MY_VAR

注意:MASM 愉快地处理所有这些语句。正如预期的那样(就我而言),1) 和 2) 的结果是相同的。但我想确切地知道......

非常感谢,

比纳鲁斯

最佳答案

在 MASM 中,标签 MY_VAR 转换为 MY_VAR 地址相对于其声明的段的偏移部分(如果您像 mov ax, MY_VAR 那样使用它) )或相对于您为用于访问它的段寄存器假设的 to 段(如果您像 mov ax, WORD PTR [MY_VAR] 使用它)。

正如您所知,给定变量(通常是线性地址)具有多个逻辑地址,例如 8000h 线性地址的变量可以通过 0800h:0000h0700h:1000h 依此类推。
MY_SEG:MY_VAR 形式告诉汇编器计算相对于段 MY_SEG 的偏移量。因此,如果 MY_SEG 从 7000h 线性开始,MY_SEG26000h 线性开始,那么对于 var MY_VAR 在 8000h 线性 MY_SEG:MY_VAR 为 1000h,MY_SEG2:MY_VAR 为 2000h。

SEG指令计算逻辑地址的段部分而不是偏移量,它是用来计算偏移量的段MASM(再次按照上面给出的规则)。

在第一个指令中,您告诉 MASM 将段 MY_SEG 的地址(让我们把重定位放在后面)放入 AX 中(因此,如果该段从 5000h 开始,则 AX 中的值为 500h)。
在第二条指令中,您明确告诉 MASM 在计算 MY_VAR 的偏移量时使用段 MY_SEG,然后通过 SEG 指令告诉它返回段部分,即 MY_SEG

所以它们是相同的,但第二个是多余的。

关于assembly - MASM SEG 运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800744/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com