大会 - 交换功能 - 为什么它不会工作? [英] Assembly - Swap function - Why it will not work?

查看:135
本文介绍了大会 - 交换功能 - 为什么它不会工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在有下一个功能,即交换的&安培值; 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆