我正在用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"关键字做一些事情.但是,如果我没有弄错,看起来我只能保留指向该结构的指针(在通用寄存器中).这需要每次迭代都要尊重,浪费宝贵的时间. …
我用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 ....
代码中有什么问题???
在我目前的项目中,我必须比较128位值(实际上是md5哈希),我认为可以通过使用SSE指令来加速比较.我的问题是我无法找到关于SSE指令的好文档; 我正在寻找一个128位整数比较指令,让我知道一个散列是大于,小于或等于另一个.这样的指令是否存在?
PS:目标计算机是带有SSE2指令的x86_64服务器; 我也对同一工作的NEON指令感兴趣.
我目前正在尝试为我的图书馆创建高度优化,可重复使用的功能.例如,我通过以下方式编写函数"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) 我正在研究内联装配.我想在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) Metro Windows 8应用程序可以包含内联汇编程序吗?也是Metro C++ Native,或托管,或者你可以像C++/CLI一样混合它们吗?
c++ inline-assembly microsoft-metro windows-8 windows-runtime
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) 如果我想向程序员公开一个特定于机器的指令,我有两种方法可以这样做:
我已经读过内置函数允许编译器处理类型检查,寄存器分配和"其他优化"等.但是即使在asm()的情况下,编译器也需要这样做,对吧?那么对于单个指令使用asm()内在的性能优势究竟是什么呢?
如果涉及多个机器指令,方程式如何变化?
支持内在的"可移植性"论证是可以理解的,但我很想知道其中一个的性能优势(如果有的话).
我将编写我的第一个"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.我不知道我在哪里弄错了?任何人都可以帮我找到为什么我会遇到这个运行时错误?
我想在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)