Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 测试位是0还是1 x86_Assembly_X86_Gnu Assembler - Fatal编程技术网

Assembly 测试位是0还是1 x86

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

所以我正在测试,看看是否有一点是“设置”或没有。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

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)