将一组字符传递给外部汇编函数

时间:2018-04-02 21:14:50

标签: c assembly x86-64

所以我的问题是基本的,但我很难在互联网上找到任何东西。 假设我想在 C 中编写一个函数来调用x86_64程序集中编写的外部nasm函数。

我想将两个char*数字传递给外部函数,对两者进行一些算术运算并返回结果的char*。我的想法是以某种方式迭代[rdi]和[rsi]并将结果保存在rax中(即添加rax,[rdi],[rsi]),但我很难实际这样做。什么是超越每个角色的正确方法?增加[rsi]和[rdi]?而且 - 我只需要移动rax第一个字符的值吧?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您可以发布汇编/ C代码 - 建议更改会更容易。

对于任何程序集,我将从C代码开始(因为我认为在C :))然后使用编译器转换为程序集,然后根据需要在程序集中对其进行优化。假设您需要编写一个函数,该函数接受两个字符串并添加它们并将结果返回为int,如下所示:

int ext_asm_func(unsigned char *arg1, unsigned char *arg2, int len)
{
    int i, result = 0;
    for(i=0; i<len; i++) {
        result += arg1[i] + arg2[i];
    }
    return result;
}

这是程序集(由gcc https://godbolt.org/g/1N6vBT生成):

ext_asm_func(unsigned char*, unsigned char*, int):
        test    edx, edx
        jle     .L4
        lea     r9d, [rdx-1]
        xor     eax, eax
        xor     edx, edx
        add     r9, 1
.L3:
        movzx   ecx, BYTE PTR [rdi+rdx]
        movzx   r8d, BYTE PTR [rsi+rdx]
        add     rdx, 1
        add     ecx, r8d
        add     eax, ecx
        cmp     r9, rdx
        jne     .L3
        rep ret
.L4:
        xor     eax, eax
        ret