程序接收信号 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
应用程序崩溃(有时),致命信号 11 (SIGSEGV),代码 1