我注意到在汇编语言中,操作码中使用了段标识符。
例如:
MOV DWORD PTR SS:[EBP-30],30
我认为“PTR SS:”用于指定EBP-30来自堆栈?(SS:堆栈段) 我是对还是完全错误? :) 另外,请问上面的示例与以下示例之间有什么区别?
MOV DWORD PTR[EBP-30],30
那么在操作码中使用的数据段 (DS) 又是怎样的呢?
例如:
MOV DWORD PTR SS:[EBP-30],30
我认为“PTR SS:”用于指定EBP-30来自堆栈?(SS:堆栈段) 我是对还是完全错误? :) 另外,请问上面的示例与以下示例之间有什么区别?
MOV DWORD PTR[EBP-30],30
那么在操作码中使用的数据段 (DS) 又是怎样的呢?
MOV DWORD PTR SS:[EBP-30],30
这里有两个不同的修饰符,DWORD PTR
和 SS:
。
第一个告诉我们要在指向的地址存储一个字。这是必需的,因为汇编器无法从指令的操作数中确定这一点。在这里,30
也可以是要存储的字节。
SS:
是一个段前缀,表示我们要使用相对于堆栈段的地址。在这种情况下,它并不是严格需要的,因为当使用 ESP
或 EBP
寄存器时,它们是默认值。因此,指令的第二个版本与第一个版本相同。
如果你用 EBX
代替 EBP
,那么就会有所不同!
当你执行
mov ax, some_variable
你真正替换的是这个形式 "mov ax, ds:[pointer_to_variable]
"
在SS的情况下,你不是从DS访问值,而是从堆栈中访问值 :). 把段寄存器看作银行。数据来自DS,堆栈数据来自SS,代码数据来自CS,额外段是ES。
EBX
会有什么不同吗? - MightyInSpirit