相关疑难解决方法(0)

'asm','__ asm'和'__asm__'有什么区别?

据我所知道的,唯一的区别__asm { ... };,并__asm__("...");是第一个使用mov eax, var第二个使用movl %0, %%eax与:"=r" (var)结尾.还有什么其他差异?那又怎么样asm?

c assembly gcc inline-assembly visual-c++

33
推荐指数
4
解决办法
2万
查看次数

如何从内联asm访问C结构/变量?

请考虑以下代码:

    int bn_div(bn_t *bn1, bn_t *bn2, bn_t *bnr)
  {
    uint32 q, m;        /* Division Result */
    uint32 i;           /* Loop Counter */
    uint32 j;           /* Loop Counter */

    /* Check Input */
    if (bn1 == NULL) return(EFAULT);
    if (bn1->dat == NULL) return(EFAULT);
    if (bn2 == NULL) return(EFAULT);
    if (bn2->dat == NULL) return(EFAULT);
    if (bnr == NULL) return(EFAULT);
    if (bnr->dat == NULL) return(EFAULT);


    #if defined(__i386__) || defined(__amd64__)
    __asm__ (".intel_syntax noprefix");
    __asm__ ("pushl %eax");
    __asm__ ("pushl %edx");
    __asm__ ("pushf");
    __asm__ ("movl %eax, …
Run Code Online (Sandbox Code Playgroud)

c x86 freebsd clang inline-assembly

2
推荐指数
1
解决办法
1813
查看次数

执行除法和处理器模数的最佳方法是什么?

如何同时执行除法和模数.处理器有可能吗?

喜欢 :

int a, b = 8 / 3; //a = 2, b = 2
Run Code Online (Sandbox Code Playgroud)

或者是否有比以下更好的操作:

int a = 8 / 3;
int b = 8 % 3;
Run Code Online (Sandbox Code Playgroud)

也许这更好?

int a = 8 / 3;
int b = 8 - a * 3;
Run Code Online (Sandbox Code Playgroud)

谢谢.

c c++ processor division modulo

1
推荐指数
2
解决办法
159
查看次数

GAS程序集片段除以0,不确定原因

我有以下功能,涉及GAS语法中的i386程序集片段:

inline int MulDivRound(
    int nNumber,
    int nNumerator,
    int nDenominator )
{
    int nRet, nMod;

    __asm__ __volatile__ (
        "mov    %2,     %%eax   \n"
        "mull   %3              \n"
        "divl   %4              \n"
        "mov    %%eax,  %0      \n"
        "mov    %%edx,  %1      \n"

        :   "=m"    (nRet),
            "=m"    (nMod)
        :   "m"     (nNumber),
            "m"     (nNumerator),
            "m"     (nDenominator)
        :   "eax", "edx"
    );

    return nRet + nMod*2 / nDenominator;
}
Run Code Online (Sandbox Code Playgroud)

我注意到,在一些情况下,我正在EXC_I386_DIV使用此功能崩溃.以下调用会产生这样的崩溃:

int res = MulDivRound( 4096, -566, 400 );
Run Code Online (Sandbox Code Playgroud)

我无法清楚地看到正在发生的事情导致此函数除以0:当然它只是移动4096 eax,然后乘以-566,然后将其除以400,返回除法运算结果的两个分量.任何人都可以对此有所了解吗?

x86 assembly gnu-assembler divide-by-zero i386

0
推荐指数
1
解决办法
318
查看次数