x86:使用内存/交换值?

时间:2015-05-28 01:50:04

标签: assembly x86

我刚刚进入x86系统类,并有几个问题:

1)说我用以下内容引用一块内存:

%eax

括号表示我正在访问内存,%eax表示我想访问内存中的特定地址。因此,如果寄存器0x104存储(%eax)(%eax)将返回存储在内存位置0x104的任何内容。这是对的吗?

2)说我想交换存储在(%ebx)//store values in registers movl (%eax) eax movl (%ebx) ebx //store values in opposite registers from where they came originally movl ebx (%eax) movl eax (%ebx) 的值。这是我的 尝试:

close()

这看起来不错吗?

感谢您的帮助, bclayman

2 个答案:

答案 0 :(得分:3)

1)是的,如果你正在阅读一个值。如果你正在写一个值,那么在0x104的位置并不重要,它会被覆盖。

2)否。您的代码首先破坏目标内存位置的值,    通过将内存位置的地址存储在内存位置。

[我在阅读你的汇编符号时有一些困惑:在许多汇编程序中,一个只写“eax”,而不是“%eax”;这些不是不同的寄存器。我不知道你是不是在写那个,因为你的汇编程序要求你这样做[[汇编器你在使用哪个?]]或者这只是一个错字。在下文中,我总是使用裸注册名称 MASM汇编语法]

要交换两个位置,你几乎需要原来的两个和 某处暂时存储原始值:

  mov   ecx, [eax]    ; fetch memory specified by address in eax
  mov   edx, [ebx]    ; fetch memory specified by address in ebx
  mov   [eax], edx    ; put 2nd value where 1st used to be
  mov   [ebx], ecx    ; put 1st value where 2nd used to be

如果你正在“交换”寄存器(例如,eax和ebx),你可以只使用一个临时寄存器:

  mov   ecx, eax      ; save 1st value in temp location ecx
  mov   eax, ebx      ; set 1st value to 2nd location
  mov   ebx, ecx      ; set 2nd value to copy of 1st value

x86有一个特殊的“xchg”指令,这很容易:

  xchg  eax, ebx      ; exchange  eax with ebx

你可以在内存位置上使用它:

  mov   ecx, [eax]    ; save 1st value in temporary ecx
  xchg  ecx, [ebx]    ; swap with 2nd value
  mov   [eax], ecx    ; set 2nd value to swapped temp

不幸的是,与内存位置一起使用的xchg包含一个自由的隐式LOCK,用于多处理器同步,并且这使得代码成为可能 比上面的第一个解决方案慢很多。

答案 1 :(得分:2)

这可能不正确。

EAXEBX开始包含内存位置。然后取消引用内存,将实际值移动到同名的寄存器中:

 MOVL (%EAX), EAX
 MOVL (%EBX), EBX

EAXEBX不再包含内存地址;它们现在包含这些地址的内容。当你接下来这样做:

 MOVL EBX, (%EAX)
 MOVL EAX, (%EBX)

您正在将这些内存位置的值存储到任何内存位置,这些位置恰好等于那些几乎肯定不是您想要的值,并且几乎保证不会交换值。

如果内存位置本身存储了内存位置的值, 的唯一方法就是