gpt4 book ai didi

c++ - 将内联 GASM 移植到 x64 MASM 访问冲突问题

转载 作者:可可西里 更新时间:2023-11-01 14:36:05 25 4
gpt4 key购买 nike

我目前正在将一些代码从 https://github.com/mono 移植到 MS Windows x64为 GCC Linux 编写的项目,我遇到了一些挑战。

目前我不确定我从 x64 AT&T inline ASM 到 x64 MASM 的翻译是否正确。它编译正常,但我的测试用例失败,因为 memcpy 在我的 ASM 函数执行后抛出异常/内存访问冲突。 我的翻译正确吗?

我真正遇到的挑战之一是 rip 在 Windows x64 MASM 中无法访问?我真的不知道如何翻译 AT&T 语法的剩余行(见下文)。但我尽力了。 我是否正确处理了缺少 rip 访问权限的问题?

如果我的工作是正确的,那么为什么 memcpy 会失败?

这里是相关的C++:

void mono_context_get_current(MonoContext cnt); //declare the ASM func

//Pass the static struct pointer to the ASM function mono_context_get_current
//The purpose here is to clobber it
#ifdef _MSC_VER
#define MONO_CONTEXT_GET_CURRENT(ctx) do { \
mono_context_get_current(ctx); \
} while (0)
#endif

static MonoContext cur_thread_ctx = {0};

MONO_CONTEXT_GET_CURRENT (cur_thread_ctx);
memcpy (&info->ctx, &cur_thread_ctx, sizeof (MonoContext)); //memcpy throws Exception.

这是当前的 ASM 函数。

mono_context_get_current PROTO
.code
mono_context_get_current PROC
mov rax, rcx ;Assume that rcx contains the pointer being passed
mov [rax+00h], rax
mov [rax+08h], rbx
mov [rax+10h], rcx
mov [rax+18h], rdx ;purpose is to offset from my understanding of the GCC assembly
mov [rax+20h], rbp
mov [rax+28h], rsp
mov [rax+30h], rsi
mov [rax+38h], rdi
mov [rax+40h], r8
mov [rax+48h], r9
mov [rax+50h], r10
mov [rax+58h], r11
mov [rax+60h], r12
mov [rax+68h], r13
mov [rax+70h], r14
mov [rax+78h], r15
call $ + 5
mov rdx, [rax+80h]
pop rdx
mono_context_get_current ENDP
END

根据我的理解,rcx 寄存器应该包含结构指针,我应该使用 rdxpop.

正如我提到的,我有适用于非 Win64 平台的 GCC ASM,它似乎可以在这些平台上运行。这是该代码的样子:

#define MONO_CONTEXT_GET_CURRENT(ctx)        \
__asm__ __volatile__( \
"movq $0x0, 0x00(%0)\n" \
"movq %%rbx, 0x08(%0)\n" \
"movq %%rcx, 0x10(%0)\n" \
"movq %%rdx, 0x18(%0)\n" \
"movq %%rbp, 0x20(%0)\n" \
"movq %%rsp, 0x28(%0)\n" \
"movq %%rsi, 0x30(%0)\n" \
"movq %%rdi, 0x38(%0)\n" \
"movq %%r8, 0x40(%0)\n" \
"movq %%r9, 0x48(%0)\n" \
"movq %%r10, 0x50(%0)\n" \
"movq %%r11, 0x58(%0)\n" \
"movq %%r12, 0x60(%0)\n" \
"movq %%r13, 0x68(%0)\n" \
"movq %%r14, 0x70(%0)\n" \
"movq %%r15, 0x78(%0)\n" \
"leaq (%%rip), %%rdx\n" \
"movq %%rdx, 0x80(%0)\n" \
: \
: "a" (&(ctx)) \
: "rdx", "memory")

感谢您提供的任何帮助!我将是第一个承认我的组件很生锈的人。

最佳答案

您可以让 gcc 为您创建 asm 文件(gcc 也可以生成 MASM 语法):

gcc -S -masm=intel myfile.c

关于c++ - 将内联 GASM 移植到 x64 MASM 访问冲突问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20308484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com