标签: inline-assembly

获取GCC以在使用内联asm的函数中保留SSE寄存器

我正在用C语言编写一个需要进行快速数学计算的程序.我正在使用内联SSE汇编指令来获取一些SIMD操作(使用压缩的双精度浮点数).我在Linux上使用GCC进行编译.

我处在需要循环某些数据的情况下,我在计算中使用了一个常数因子.我想在循环期间将这个因素隐藏在一个安全的寄存器中,所以我不必每次都重新加载它.

用一些代码澄清:

struct vect2 {
    fltpt x;
    fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;


void function()
{
    /* get a specific value set up in xmm1, and keep it there for the 
     * rest of the loop. */
    for( int i = 0, i<N; i++ ){
        asm(
            "Some calculations;"
            "on an element of;"
            "a data set.;"
            "The value in xmm1;"
            "is needed;"
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过使用"register"关键字做一些事情.但是,如果我没有弄错,看起来我只能保留指向该结构的指针(在通用寄存器中).这需要每次迭代都要尊重,浪费宝贵的时间. …

c assembly gcc sse inline-assembly

7
推荐指数
1
解决办法
1951
查看次数

C/C++中的简单"Hello World"内联汇编语言程序

我用devcpp和borland c编译器....

asm {
    mov ax,4       // (I/O Func.)
    mov bx,1       // (Output func)  
    mov cx,&name   // (address of the string)
    mov dx,6       // (length of the string)
    int 0x21       // system call
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,我想在汇编语言的帮助下打印一个字符串...但是如何将字符串的地址放在寄存器cx ....

代码中有什么问题???

c x86 assembly inline-assembly

7
推荐指数
1
解决办法
8721
查看次数

与SSE进行128位哈希比较


在我目前的项目中,我必须比较128位值(实际上是md5哈希),我认为可以通过使用SSE指令来加速比较.我的问题是我无法找到关于SSE指令的好文档; 我正在寻找一个128位整数比较指令,让我知道一个散列是大于,小于或等于另一个.这样的指令是否存在?

PS:目标计算机是带有SSE2指令的x86_64服务器; 我也对同一工作的NEON指令感兴趣.

c assembly sse inline-assembly neon

7
推荐指数
2
解决办法
3408
查看次数

x64的"自定义内在"功能可以代替内联汇编吗?

我目前正在尝试为我的图书馆创建高度优化,可重复使用的功能.例如,我通过以下方式编写函数"is power of 2":

template<class IntType>  
inline bool is_power_of_two( const IntType x )
{
    return (x != 0) && ((x & (x - 1)) == 0);
}
Run Code Online (Sandbox Code Playgroud)

这是一个可移植,低维护的实现,作为内联C++模板.此代码由VC++ 2008编译为具有分支的以下代码:

is_power_of_two PROC
    test    rcx, rcx
    je  SHORT $LN3@is_power_o
    lea rax, QWORD PTR [rcx-1]
    test    rax, rcx
    jne SHORT $LN3@is_power_o
    mov al, 1
    ret 0
$LN3@is_power_o:
    xor al, al
    ret 0
is_power_of_two ENDP
Run Code Online (Sandbox Code Playgroud)

我从这里找到了实现:"bit twiddler",它将在x64的程序集中编码,如下所示:

is_power_of_two_fast PROC
    test rcx, rcx
    je  SHORT NotAPowerOfTwo
    lea rax, [rcx-1]
    and rax, …
Run Code Online (Sandbox Code Playgroud)

c++ 64-bit assembly inline-assembly intrinsics

7
推荐指数
1
解决办法
2169
查看次数

如何在Xcode LLVM中编写关于LOOP的内联汇编代码?

我正在研究内联装配.我想在Xcode 4 LLVM 3.0 Compiler下用iPhone编写一个简单的例程.我成功编写了基本的内联汇编代码.

例如:

int sub(int a, int b)
{
    int c;
    asm ("sub %0, %1, %2" : "=r" (c) : "r" (a), "r" (b));
    return c;
}
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow.com找到它并且它工作得很好.但是,我不知道如何编写有关LOOP的代码.

我需要汇编代码

void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity)
{
    for(int i=0; i<numPixels; i++)
    {
        dst[i] = src[i] + intensity;
    }
}
Run Code Online (Sandbox Code Playgroud)

c iphone assembly arm inline-assembly

7
推荐指数
1
解决办法
2925
查看次数

Metro Windows 8 C++应用程序可以包含内联汇编程序吗?

Metro Windows 8应用程序可以包含内联汇编程序吗?也是Metro C++ Native,或托管,或者你可以像C++/CLI一样混合它们吗?

c++ inline-assembly microsoft-metro windows-8 windows-runtime

7
推荐指数
1
解决办法
1841
查看次数

这个带输入=输出的gcc样式asm是否需要早期的破坏?

Gcc内联asm早期clobber约束在这里的gcc文档中描述:

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

我们有128位add的amd64实现:

#define ADD128(rh, rl, ah, al, bh, bl)                                     \
    __asm__("addq %2, %0; adcq %3, %1"                                     \
            /* outputs */ : "=r"(rl),  /* %0 */                            \
                            "=r"(rh)   /* %1 */                            \
            /* inputs */  : "emr"(bl), /* %2 */                            \
                            "emr"(bh), /* %3 */                            \
                            "0"(al),   /* %4 == %0 */                      \
                            "1"(ah)    /* %5 == %1 */                      \
            /* clobbers */: "cc"       /* condition registers (CF, ...) */ \
           )
Run Code Online (Sandbox Code Playgroud)

我想知道这是否必须使用%0的早期clobber(&):

#define ADD128(rh, rl, ah, al, bh, bl) …
Run Code Online (Sandbox Code Playgroud)

gcc inline-assembly

7
推荐指数
1
解决办法
970
查看次数

gcc内在vs内联汇编:哪个更好?

如果我想向程序员公开一个特定于机器的指令,我有两种方法可以这样做:

  1. 定义一个新的内置/内在
  2. 暴露与内联汇编asm()相同[由于它是一个算术类型的指令,我相信不需要asm volatile()]

我已经读过内置函数允许编译器处理类型检查,寄存器分配和"其他优化"等.但是即使在asm()的情况下,编译器也需要这样做,对吧?那么对于单个指令使用asm()内在的性能优势究竟是什么呢?

如果涉及多个机器指令,方程式如何变化?

支持内在的"可移植性"论证是可以理解的,但我很想知道其中一个的性能优势(如果有的话).

c compiler-construction assembly gcc inline-assembly

7
推荐指数
1
解决办法
1464
查看次数

Bootloader - 显示字符串运行时错误

我将编写我的第一个"hello world"bootloader程序.我在CodeProject网站上找到了一篇文章.这里是它的链接. http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part Up-to assembly level编程很顺利,但是当我用c编写程序时,与本文中给出的相同,我遇到了运行时错误.我的.c文件中写的代码如下.

__asm__(".code16\n");
__asm__("jmpl $0x0000,$main\n");

void printstring(const char* pstr)
{
        while(*pstr)
        {
              __asm__ __volatile__("int $0x10": :"a"(0x0e00|*pstr),"b"(0x0007));
              ++pstr;
        }
}

void main()
{
        printstring("Akatsuki9");
}
Run Code Online (Sandbox Code Playgroud)

我使用创建了图像文件floppy.img并检查输出bochs.它显示的是这样的东西

Booting from floppy...
S
Run Code Online (Sandbox Code Playgroud)

它应该是Akatsuki9.我不知道我在哪里弄错了?任何人都可以帮我找到为什么我会遇到这个运行时错误?

c linux inline-assembly bootloader

7
推荐指数
1
解决办法
402
查看次数

提供使用Rust的内联汇编查询Intel CPU功能的示例

我想在Rust中使用内联汇编.我所包含的代码应该用于查询Intel CPU功能,现在我只想ebx在系统调用后获取寄存器状态.

使用每晚构建的Rust编译器(需要使用asm!宏)代码编译.当我运行程序时,我得到ebx寄存器的随机值和分段错误.我很确定我的asm!宏语法是错误的但是这个功能的文档非常弱.有没有人对我可以改进的内容有任何指示?

#![feature(asm)]
fn main() {
    let result: u32;
    unsafe {
        asm!("mov eax, 07H;
              mov ecx, 0;
              cpuid;"
              : "={ebx}"(result)
              :
              : "eax, ebx, ecx, edx"
              : "intel"
        )
    }
    println!("ebx from cpuid is {}", result);
}
Run Code Online (Sandbox Code Playgroud)

x86 assembly inline-assembly rust

7
推荐指数
1
解决办法
242
查看次数