在操作码中汇编段

时间:2012-05-30 16:59:13

标签: assembly x86 segments opcodes

我注意到在程序段中使用的是操作码。

示例:

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

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

之间的区别
MOV DWORD PTR[EBP-30],30

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

2 个答案:

答案 0 :(得分:15)

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

此处有两个单独的修饰符,DWORD PTRSS:

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

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

如果您使用EBX代替EBP,则会有所不同!

答案 1 :(得分:10)

  • SS是Stack Segment
  • DS是数据段
  • PTR - 指针。这是一个地址。

当你这样做时

mov ax, some_variable

您真的用“mov ax, ds:[pointer_to_variable]

替换此表单

对于SS,您访问的值不是来自DS,而是来自堆栈而不是:)。 将段寄存器视为库。数据来自DS,来自SS的堆栈数据,来自CS的代码数据,额外的数据段是ES。