汇编指令中的段落

14
我注意到在汇编语言中,操作码中使用了段标识符。

例如:

MOV DWORD PTR SS:[EBP-30],30

我认为“PTR SS:”用于指定EBP-30来自堆栈?(SS:堆栈段) 我是对还是完全错误? :) 另外,请问上面的示例与以下示例之间有什么区别?

MOV DWORD PTR[EBP-30],30

那么在操作码中使用的数据段 (DS) 又是怎样的呢?

2个回答

25
MOV DWORD PTR SS:[EBP-30],30

这里有两个不同的修饰符,DWORD PTRSS:

第一个告诉我们要在指向的地址存储一个字。这是必需的,因为汇编器无法从指令的操作数中确定这一点。在这里,30 也可以是要存储的字节。

SS: 是一个段前缀,表示我们要使用相对于堆栈段的地址。在这种情况下,它并不是严格需要的,因为当使用 ESPEBP 寄存器时,它们是默认值。因此,指令的第二个版本与第一个版本相同。

如果你用 EBX 代替 EBP,那么就会有所不同!


有人能够详细解释一下Bo在最后一句中提到的EBX会有什么不同吗? - MightyInSpirit

17
  • SS是堆栈段
  • DS是数据段
  • PTR - 指针。它是一个地址。

当你执行

mov ax, some_variable

你真正替换的是这个形式 "mov ax, ds:[pointer_to_variable]"

在SS的情况下,你不是从DS访问值,而是从堆栈中访问值 :). 把段寄存器看作银行。数据来自DS,堆栈数据来自SS,代码数据来自CS,额外段是ES。


谢谢,有什么链接/关键词可以搜索以获取更多相关信息吗? - user1365914
我不知道有哪些资源,我只是在谷歌上读了所有能找到的东西,直到我理解为止 :) - lukas.pukenis
@user1365914:下载英特尔或 AMD 的 CPU 手册。它们解释了所有指令、段、前缀等等。当然,除了你正在使用的汇编器的语法(MASM、TASM 等)。为此,您需要查阅您的汇编器文档。 - Alexey Frunze
谢谢您的建议,我会尽快下载这两份手册。 - user1365914
据我所记得,英特尔曾经免费寄送他们的纸质书籍。每次我都会收到5本书(3本指令手册、基础结构和优化指南)。所有的书总高度只有17厘米! - lukas.pukenis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接