在操作码中汇编段

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 PTRSS:.

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

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

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


luk*_*nis 11

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

当你这样做

mov ax, some_variable
Run Code Online (Sandbox Code Playgroud)

你真的替换这个表格" mov ax, ds:[pointer_to_variable]"

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