我注意到在程序段中使用的是操作码。
示例:
MOV DWORD PTR SS:[EBP-30],30
我认为“PTR SS:”用于指定EBP-30来自堆栈? (SS:堆栈段) 我是对的还是我完全错了? :)那么,请你告诉我上面的例子和
之间的区别MOV DWORD PTR[EBP-30],30
那么在操作码中使用的DS(数据段)呢?
答案 0 :(得分:15)
MOV DWORD PTR SS:[EBP-30],30
此处有两个单独的修饰符,DWORD PTR
和SS:
。
第一个告诉我们,我们想在指向的地址存储一个单词。当汇编器无法从指令的操作数中判断出这一点时,这是必需的。这里30
也可以是一个要存储的字节。
SS:
是一个段前缀,表示我们想要使用相对于堆栈段的地址。在这种情况下,并不严格需要,因为这是使用ESP
或EBP
寄存器时的默认值。所以指令的第二个版本与第一个版本相同。
如果您使用EBX
代替EBP
,则会有所不同!
答案 1 :(得分:10)
当你这样做时
mov ax, some_variable
您真的用“mov ax, ds:[pointer_to_variable]
”
对于SS,您访问的值不是来自DS,而是来自堆栈而不是:)。 将段寄存器视为库。数据来自DS,来自SS的堆栈数据,来自CS的代码数据,额外的数据段是ES。