[英]Assembly Segments in opcodes
我注意到在程序段中使用了代码段。
例:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.