assembly 内联汇编中的string_cmp

nkhmeac6  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

我尝试在assembly中编写string_cmp函数,您可以尝试比较两个字符串是否相同。
public int findDuplicate(int findDuplicate,int findDuplicate,int findDuplicate){

// Your inline assembly code goes here. Note that volatile keyword ensure that the assembly code will not be moved around by the compiler
asm volatile (
    "loop1:"
        "mov (%[s1]), %%rsi\n"   // Move the source address to rsi
        "mov (%[s2]), %%rdx\n" //I wanted a name register but i couldnt initialsied rdx for some reason and %0 cannot be tested
        "inc %[s1]\n"
        "inc %[s2]\n" //check for end of a string then comp last char
        "test %%rsi, %%rdx\n"
        "jl neg\n"
        "jg pos\n"
        "cmp $0, %%rsi\n"
        "jne loop1\n"
        "je zero\n"

    "pos:"
        "mov $1, %%eax\n"
        "jmp fin\n"

    "zero:"
        "mov $0, %%eax\n"
        "jmp fin\n"

    "neg:"
        "mov $0xFFFFFFFF, %%eax\n"
        "jmp fin\n"

    "fin:"



    // Continue with the string copy using appropriate instructions
: "=a" (res)
: [s1] "r" (str1), [s2] "r" (str1) //need to initiate variables somewhere
: "%rsi"  // Use these as needed //clobbbered
);
return res;

字符串
}
这是到目前为止我的实现,所以我将字符串的指针移动到寄存器中,检查它们是否不同,使用test then循环,直到我到达其中一个字符串的空字符。
然而,即使字符串相等,它也总是返回1,这是因为jg总是看到大部分时间的零和符号位吗?
是否有一个不同的条件,我可以使用,使比较工作正常,所以它跳转到1时,左参数的值更大?
下面的行是我试图把结果放在一个寄存器中并返回那些.我也在条件分支后添加了一个jmp,然而这并没有阻止字符串总是值1,尽管将一个单词与空字符串进行比较,并将一个字符串与空单词进行比较(这些应该是不同的).非常感谢.

e5nszbig

e5nszbig1#

如果你转到zero:,没有什么可以阻止CPU执行接下来的两个mov。所以你总是以1结束。在结尾添加一个额外的标签,并在设置res值后无条件跳转到该标签。
类似于:

"zero:"
        "mov $0, %1\n"
        "jmp finish\n"
    "neg:"
        "mov $0xFFFFFFFF, %1\n"
        "jmp finish\n"
    "pos:"
        "mov $1, %1\n"
    "finish:"

字符串

相关问题