use*_*914 6 x86 assembly segments opcodes
我注意到在程序段中使用了代码段.
例:
MOV DWORD PTR SS:[EBP-30],30
Run Code Online (Sandbox Code Playgroud)
我认为"PTR SS:"用于指定EBP-30来自堆栈?(SS:堆栈段)我是对还是我完全错了?:)那么,请你告诉我上面的例子与之间的区别
MOV DWORD PTR[EBP-30],30
Run Code Online (Sandbox Code Playgroud)
那么在操作码中使用的DS(数据段)呢?
Bo *_*son 17
MOV DWORD PTR SS:[EBP-30],30
Run Code Online (Sandbox Code Playgroud)
这里有两个独立的修饰符,DWORD PTR和SS:.
第一个告诉我们,我们想在指向的地址存储一个单词.当汇编器无法从指令的操作数中判断出这一点时,这是必需的.这里30也可以是一个存储的字节.
这SS:是一个段前缀,表示我们想要使用相对于堆栈段的地址.在这种情况下,它不是严格需要的,因为这是使用ESP或EBP寄存器时的默认值.所以指令的第二个版本与第一个版本相同.
如果你使用EBX而不是EBP那里会有所不同!
luk*_*nis 11
当你这样做
mov ax, some_variable
Run Code Online (Sandbox Code Playgroud)
你真的替换这个表格" mov ax, ds:[pointer_to_variable]"
在SS的情况下,您访问的值不是来自DS,而是来自堆栈而不是:).将段寄存器视为库.数据来自DS,来自SS的堆栈数据,来自CS的代码数据,额外的段是ES.