我尝试在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,尽管将一个单词与空字符串进行比较,并将一个字符串与空单词进行比较(这些应该是不同的).非常感谢.
1条答案
按热度按时间e5nszbig1#
如果你转到
zero:
,没有什么可以阻止CPU执行接下来的两个mov
。所以你总是以1结束。在结尾添加一个额外的标签,并在设置res值后无条件跳转到该标签。类似于:
字符串