Assembly 测试位是0还是1 x86
所以我正在测试,看看是否有一点是“设置”或没有。bv(ebx)是我的位向量,位(ecx)是我的索引0,1,2。。。返回值(eax)应该是0或1。我的逻辑有问题吗?c函数看起来像Assembly 测试位是0还是1 x86,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,所以我正在测试,看看是否有一点是“设置”或没有。bv(ebx)是我的位向量,位(ecx)是我的索引0,1,2。。。返回值(eax)应该是0或1。我的逻辑有问题吗?c函数看起来像 int bitIsSet(unsigned int *bv, unsigned int bit) 在大会上执行: #define return %eax #define bv %ebx #define bit %ecx #define FSIZE 8 .text .global bitIsSetBV
int bitIsSet(unsigned int *bv, unsigned int bit)
在大会上执行:
#define return %eax
#define bv %ebx
#define bit %ecx
#define FSIZE 8
.text
.global bitIsSetBV
bitIsSetBV:
//Prologue
subl $FSIZE, %esp //Frame space
//Load Params
movl FSIZE+4(%esp), %ebx //loads *bv
movl FSIZE+8(%esp), %ecx //loads bit
//Func Body
bt bit, bv //check if 0/1
jc END //if 1 jump to END
xor return, return //return = 0 if bv @ bit is 0
jmp EPILOGUE //Skip END
END:
movl $1, return //return = 1 if bv @ bit is 1
//Epilogue
EPILOGUE:
add $FSIZE, %esp //restore stack ptr
ret //return = 0/1
我使用的是GAS语法您的代码(因此您的问题)不完整,因为您省略了入口代码和出口代码。您的问题可以用一个操作码来解决,但除非您提供完整的代码,否则任何解决方案都将是次优的。它甚至是错误的吗?你有一个失败的测试用例吗?我的测试人员声称它失败了。不管你使用什么寄存器来返回,比如说eax,你可以简单地使用进位标志:
sbbl%eax,%eax代码>(-1如果设置,0如果清除)后跟negl%eax
(1如果设置,0如果清除),以避免跳转。但除此之外,到底出了什么问题?你用你的索引做什么?它的值将始终使用模32。如果这是32位ELF,则需要保留%ebx
。我建议使用%edx
代替它。这样,就不需要本地堆栈空间(反正也不用)。去掉序言和尾声%esp
调整,并将FSIZE
视为(0)。您需要取消对指针的引用:bt%ecx,(%edx)
。