11

我注意到在程序集段中使用了操作码。

例子:

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

我认为“PTR SS:”用于指定 EBP-30 来自堆栈?(SS:堆栈段)我是对的还是完全错的?:) 而且,你能告诉我上面的例子和

MOV DWORD PTR[EBP-30],30

那么操作码中使用的 DS(数据段)呢?

4

2 回答 2

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

这里有两个单独的修饰符,DWORD PTRSS:.

第一个告诉我们要在指向的地址存储一个单词。当汇编器无法从指令的操作数中分辨出这一点时,这是需要的。这里30也可以是一个要存储的字节。

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

如果你使用EBX而不是EBP会有不同!

于 2012-05-31T17:04:19.517 回答
15
  • SS 是堆栈段
  • DS 是数据段
  • PTR - 指针。这是一个地址。

当你这样做

mov ax, some_variable

你真的是在替换这个表格“ mov ax, ds:[pointer_to_variable]

在 SS 的情况下,您不是从 DS 访问值,而是从堆栈访问值 :)。将段寄存器视为银行。数据来自 DS,Stack 数据来自 SS,Code 数据来自 CS,Extra 段为 ES。

于 2012-05-30T19:01:48.183 回答