assembly 从汇编函数返回一个值到调用c++函数

s3fp2yjn  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在尝试用汇编语言编写collatz问题(只是为了好玩)。我刚看完第一部分。我从另一个文件中的C++函数调用汇编代码:

if (((n / 2) * 2) == n) n = n / 2;
else n = 3 * n + 1;
.code
isCN proc n:dword
mov eax, n
xor edx, edx
mov ecx, 2
mov r8d, eax
div ecx
mov r9d, eax
mul ecx
cmp eax, r8d
je equal
;else
mov eax, 3
mul r8d
add eax, 1
ret

equal:
; if n is even
mov eax, r9d
ret


isCN ENDP
end

我使用这样的代码:

extern "C" int isCN(int n);

while (n > 1) {
    c++;
    n = isCN(n);
}
validNumbers[i] = true;
counters[i] = c;

但是当我尝试使用它时,它返回的值是无意义的。
当我看反汇编时,它似乎从eax正确返回。
错误是在我使用代码的方式中,还是在代码本身中?

gywdnpxw

gywdnpxw1#

你的代码效率很低,但从快速测试来看,它似乎工作正常。更有效的版本可能是:

mov eax, ecx
    shr eax, 1
    jnc done
    lea eax, [2*ecx + ecx + 1]
done:
    ret

(假设您使用的是Windows调用约定。

idfiyjo8

idfiyjo82#

似乎dword n没有正确地赋予函数。
更改线路:

mov eax, n

收件人:

mov eax, ecx

修复了代码。

相关问题