Программа получила сигнал SIGSEGV, ошибка сегментации с использованием SHRD в ASM

Я пытаюсь сдвинуть eax вправо на 2, в настоящее время это 0x037f, и я хочу получить его до 0x0003.

Я использую Cygwin, он компилируется нормально, но когда я открываю его с помощью gdb, как только я перехожу к строке 7, я получаю ошибку заголовка.

Я пробовал изменить синтаксис на (% eax, 2, 0) (я хочу сдвинуть его влево на 2 и заполнить нулями) Я также пробовал использовать только 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"
    );

person Ranger Skip    schedule 21.05.2014    source источник
comment
Возможно, я неправильно запомнил, но разве shrd не принимает 3 аргумента? не стал бы shr делать то, что вам нужно?   -  person Joe    schedule 21.05.2014
comment
shr не нравится, когда я даю ему eax, попытался дать ему одну из моих переменных, и он сказал, что я дал ему слишком много операндов, поэтому я не думаю, что это сработает.   -  person Ranger Skip    schedule 21.05.2014
comment
edit: попробовал shr %% eax, который скомпилирован, однако вместо того, чтобы взять 0x037f и дать мне 0x0003, он дал мне 0x1bf.   -  person Ranger Skip    schedule 21.05.2014
comment
Вы смотрели определение этой операции? Вы уже подозревали, что это может быть бит, почему бы не проверить?   -  person Leeor    schedule 21.05.2014


Ответы (1)


Я нашел ответ, это была простая синтаксическая проблема.

shr $8, %%eax

Раньше eax был 0x037F. Это сдвинуло eax на 8 бит, что сделало его 0x0003.

person Ranger Skip    schedule 23.05.2014