繁体   English   中英

在操作码中汇编段

[英]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 PTRSS: .

第一个告诉我们,我们想在指向的地址存储一个单词。 当汇编器无法从指令的操作数中判断出这一点时,这是必需的。 这里30也可以是一个存储的字节。

SS:是段前缀,表示我们想要使用相对于堆栈段的地址。 在这种情况下,它不是严格需要的,因为这是使用ESPEBP寄存器时的默认值。 所以指令的第二个版本与第一个版本相同。

如果你使用EBX而不是EBP那就会有所不同!

  • SS是Stack Segment
  • DS是数据段
  • PTR - 指针。 这是一个地址。

当你这样做

mov ax, some_variable

你真的替换这个形式“ mov ax, ds:[pointer_to_variable]

在SS的情况下,您访问的值不是来自DS,而是来自堆栈而不是:)。 将段寄存器视为库。 数据来自DS,来自SS的堆栈数据,来自CS的代码数据,额外的段是ES。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM