所以我的问题是基本的,但我很难在互联网上找到任何东西。
假设我想在 C 中编写一个函数来调用x86_64
程序集中编写的外部nasm函数。
我想将两个char*
数字传递给外部函数,对两者进行一些算术运算并返回结果的char*
。我的想法是以某种方式迭代[rdi]和[rsi]并将结果保存在rax中(即添加rax,[rdi],[rsi]),但我很难实际这样做。什么是超越每个角色的正确方法?增加[rsi]和[rdi]?而且 - 我只需要移动rax第一个字符的值吧?
提前致谢!
答案 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