我注意到在程序集段中使用了操作码。
例子:
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
orEBP
寄存器时的默认设置。所以该指令的第二个版本与第一个版本相同。
如果你使用EBX
而不是EBP
会有不同!
当你这样做
mov ax, some_variable
你真的是在替换这个表格“ mov ax, ds:[pointer_to_variable]
”
在 SS 的情况下,您不是从 DS 访问值,而是从堆栈访问值 :)。将段寄存器视为银行。数据来自 DS,Stack 数据来自 SS,Code 数据来自 CS,Extra 段为 ES。