程序接收信号 SIGSEGV,ASM 中使用 SHRD 的分段错误

Posted

技术标签:

【中文标题】程序接收信号 SIGSEGV,ASM 中使用 SHRD 的分段错误【英文标题】:Program received signal SIGSEGV, Segmentation fault using SHRD in ASM 【发布时间】:2014-05-21 03:00:54 【问题描述】:

我正在尝试将 eax 右移 2,当前为 0x037f,我想将其移至 0x0003。

我使用的是 Cygwin,它编译得很好,但是当我用 gdb 打开它时,一旦我到达第 7 行,就会出现标题错误。

我尝试将语法更改为 (%eax, 2, 0)(我想将其左移 2 并用 0 填充)我也尝试使用 2,它的值为 8,因为我没有'不知道它是按字节还是按位移动。

     asm("   push    %%eax                           \n"
         "   push    %%ebx                           \n" 
         "   push    %[nIn]                          \n"
         "   fstcw   %[trueCWIn]                     \n"     //store FPU CW into trueCW
         "   mov     %[trueCWOut], %%eax             \n"     //store old FPU CW into tempVar
         "   mov     %%eax, %[tempVarIn]             \n"     //store old FPU CW into tempVar
         "   shrd    %%eax,8                         \n"     //shift FPU CW right to bytes
         "   add     %[roundModeOut], %%eax          \n"     //adding rounding modifier
                                                            //shift left 2 bytes
                                                            //add in restore mask (0x007F)
         "   frndint                                 \n"     //do rounding calculation
                                                            //store result into n
         "   fldcw   %[trueCWIn]                     \n"     //restoring the FPU CW to normal
         "   pop     %%ebx                           \n"
         "   pop     %%eax                           \n"

         :   [trueCWOut]     "=m"    (trueCW),
             [tempCWOut]     "=m"    (tempCW),
             [maskOut]       "=m"    (mask),
             [tempVarOut]    "=m"    (tempVar),
             [roundModeOut]  "=m"    (roundMode),
             [nOut]          "=m"    (n)

         :   [trueCWIn]      "m"     (trueCW),
             [tempCWIn]      "m"     (tempCW),
             [maskIn]        "m"     (mask),
             [tempVarIn]     "m"     (tempVar),
             [roundModeIn]   "m"     (roundMode),
             [nIn]           "m"     (n)
         :"eax", "ebx"
    );

【问题讨论】:

也许我记错了,但shrd 不接受 3 个参数吗? shr 不会做你需要的吗? shr 在我给它 eax 时不喜欢它,尝试给它一个我的变量,它说我给它太多的操作数,所以我认为这不起作用。 编辑:尝试了 shr %%eax,它编译了,但是它没有取 0x037f 并给我 0x0003,而是给了我 0x1bf。 你看过这个op的定义了吗?您已经怀疑它可能是位,为什么不检查一下? 【参考方案1】:

我找到了答案,这是一个简单的语法问题。

shr $8, %%eax

之前,eax 是 0x037F。 这将 eax 移动了 8 位,然后变为 0x0003。

【讨论】:

以上是关于程序接收信号 SIGSEGV,ASM 中使用 SHRD 的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

openCV中的KalmanFilter Tracking - 程序接收信号SIGSEGV

QNetworkReply 在发出完成信号时抛出 SIGSEGV

如何使用 SIGSEGV 的信号处理程序调试程序

应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1

致命信号 11 (SIGSEGV) 在 0x00000000 (code=1) - PhoneGap

使用 mixChannels 函数 (opencv) 时的“致命信号 11 (SIGSEGV),代码 1”