大会 - 交换功能 - 为什么它不会工作? [英] Assembly - Swap function - Why it will not work?
问题描述
在有下一个功能,即交换的&安培值; X具有的价值和放大器; Y(指掉期*(&安培; Y)和*(&安培; X)
In have the next function, that swap the value of &x with the value of &y (meaning swap *(&y) and *(&x).
交换:
push EBP
mov EBP,ESP
mov EBX, [EBP+12] ; ebx = *x
mov EAX, DWORD [EBX] ;eax = ebx = *x
mov DWORD [EBP-4], EAX ; [ebp-4] = eax =*x
mov EDX, [EBP+8] ; edx = *y
mov EAX, DWORD [EDX] ; eax = *edx = *y
mov DWORD [EBX], EAX ; ebx = eax = *y
mov EAX, DWORD [EBP-4] ; eax = *x
mov DWORD [EDX], EAX ; edx = *x
pop EBP ; ebx = *y and edx = *x
ret
// call Swap
push x
push y
call swap
我不明白为什么它不工作。
我补充说,解释我是如何理解它的痕迹。请告诉我拨错?谢谢。 (我不需要的正确实施的)
推荐答案
您当您访问在[EBP-4]的DWORD实际上并不保留您所使用的堆栈内存。它可以通过类似的事情中断服务程序,信号处理,异步调用的程序,无论适用于您的操作系统被覆盖。
You don't actually reserve memory on the stack that you use when you access a dword at [EBP-4]. It can get overwritten by things like interrupt routines, signal handlers, asynchronously called procedures, whatever applies in your OS.
在code应该是这样的,而不是:
The code should be like this instead:
swap:
push EBP
mov EBP,ESP
sub ESP, 4 ; reserve memory for a local variable at [EBP-4]
mov EBX, [EBP+12] ; ebx = &x
mov EAX, DWORD [EBX] ; eax = x
mov DWORD [EBP-4], EAX ; [ebp-4] = eax = x
mov EDX, [EBP+8] ; edx = &y
mov EAX, DWORD [EDX] ; eax = y
mov DWORD [EBX], EAX ; *&x = y
mov EAX, DWORD [EBP-4] ; eax = x
mov DWORD [EDX], EAX ; *&y = x
leave ; remove locals, restore EBP
ret
此外,请确保您传递作为参数变量 X
和是
的地址,而不是该变量的值。 推X
+ 推是
将通过 X
的地址和是
在NASM,但他们会通过的值x
和是
在TASM和MASM。
Also, make sure that you're passing as parameters the addresses of the variables x
and y
, not the values of the variables. push x
+push y
will pass the addresses of x
and y
in NASM but they will pass values of x
and y
in TASM and MASM.
这篇关于大会 - 交换功能 - 为什么它不会工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!