我刚刚进入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
答案 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)
这可能不正确。
EAX
和EBX
开始包含内存位置。然后取消引用内存,将实际值移动到同名的寄存器中:
MOVL (%EAX), EAX
MOVL (%EBX), EBX
EAX
和EBX
不再包含内存地址;它们现在包含这些地址的内容。当你接下来这样做:
MOVL EBX, (%EAX)
MOVL EAX, (%EBX)
您正在将这些内存位置的值存储到任何内存位置,这些位置恰好等于那些几乎肯定不是您想要的值,并且几乎保证不会交换值。
如果内存位置本身存储了内存位置的值, 的唯一方法就是
。