如果我在Windows VC++中有以下代码:
DWORD somevar = 0x12345678;
_asm call dword ptr [somevar]
Run Code Online (Sandbox Code Playgroud)
如何使用AT&T语法在GCC内联汇编中做同样的事情?
__asm__ __volatile__ (
"call dword ptr [%%edx]" : :
"d" (somevar)
);
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西,但它会产生"垃圾"错误......
然后我试图通过somevar一些寄存器,然后将其转换到dword,ptr等,但我无法得到它的工作.
更新:我找到了一些有用的东西,就好像在这种情况下我们必须使用括号而不是括号,我找到了一些lcall可以调用的东西far.但我仍然无法理解我是如何重现的dword ptr.
我在D编程语言中使用内联汇编程序访问静态变量时遇到了一些麻烦.文档说我必须访问局部变量
mov EAX, var[EBP]; //or mov EAX, var;
Run Code Online (Sandbox Code Playgroud)
和类变量
mov EBX, this;
mov EAX, var[EBX];
Run Code Online (Sandbox Code Playgroud)
但它没有记录如何访问静态变量.这是我的代码抛出错误:
module test;
static int A = 1234;
static void SetA()
{
asm
{
mov A, 5432; //compiles, but throws an error
//tried it with "mov dword ptr [A], 5432; too
}
}
Run Code Online (Sandbox Code Playgroud)
对于可以从汇编程序和汇编程序访问的整数,我真的需要一种"全局存储"的方式,我会非常高兴有任何这方面的帮助(或替代方法).
这是参考问题: Intrinsics中Neon的校验和代码实现
打开链接中列出的子问题作为单独的个别问题.因为多个问题不被要求作为单个线程的一部分.
无论如何回答这个问题:
可以ARM和NEON(中的ARM Cortex-A8架构来说的),实际上是在并行工作?我怎样才能做到这一点?
有人可以指向我或分享一些使用ARM-NEON的互操作的示例实现(伪代码/算法/代码,而不是理论实现论文或会谈)吗?(使用intrinsics或inline-asm的实现都可以.)
我知道这是一个非常基本的问题,但我真的很困惑.事实上,我绝对是gcc语法的新手.我希望在不使用扩展内联汇编的情况下拥有局部变量(事实上堆栈地址带有标签); 类似于intel语法中的代码:
DATA1 DB 100
MOV AL,DATA1
这是我猜可能在gcc中替代的代码:
- (int)someFunction:(int)x {
Run Code Online (Sandbox Code Playgroud)DATA1 DB 100 MOV AL, DATA1
但是这段代码导致了这个错误:
找不到架构x86_64的符号
我可以在x86中使用全局变量,但x64或x86_x64中的结果相同.
设置:LLVM 4.1; Xcode中使用的Cocoa 4
什么是正确的语法?
这是一个使用扩展汇编代码的C函数:
static inline uint
xchg(volatile uint *addr, uint newval)
{
uint result;
asm volatile("lock; xchgl %0, %1" :
"+m" (*addr), "=a" (result) :
"1" (newval) :
"cc");
return result;
}
Run Code Online (Sandbox Code Playgroud)
我读了这个codeproject链接,了解如何在C代码中使用Extended Assembly,但我对此代码感到困惑.我不明白这段代码中的内容:
1)(newval)汇编代码中哪里用作输入?(%0是指(*addr)与%1被参考(result)吧?然后"1" (newval)从来没有在代码中使用(我们从来没有看到%2在代码).或者我错了?)
2)什么是"1"在"1" (newval)输入操作数?
3)什么是"+m"标志意味着"+m" (*addr)什么?
我正在研究一个改变舍入模式的Rust箱子(+ inf,-inf,最近或截断).
更改舍入模式的函数使用内联汇编编写:
fn upward() {
let cw: u32 = 0;
unsafe {
asm!("stmxcsr $0;
mov $0, %eax;
or $$0x4000, %eax;
mov %eax, $0;
ldmxcsr $0;"
: "=*m"(&cw)
: "*m"(&cw)
: "{eax}"
);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在调试模式下编译代码时,它按预期工作,当向正无穷大舍入时,我获得0.3333333333337三分之一,但是当我在释放模式下编译时,无论我设置什么舍入模式,我都得到相同的结果.我想这种行为是由于LLVM后端的优化所致.
如果我知道哪个LLVM通过负责此优化,我可以禁用它们,因为我目前没有看到任何其他解决方法.
如果__SHA__未定义,我们使用内联汇编使SHA指令可用.在GCC下我们使用:
GCC_INLINE __m128i GCC_INLINE_ATTRIB
MM_SHA256RNDS2_EPU32(__m128i a, const __m128i b, const __m128i c)
{
asm ("sha256rnds2 %2, %1, %0" : "+x"(a) : "xm"(b), "Yz" (c));
return a;
}
Run Code Online (Sandbox Code Playgroud)
Clang不遵守 GCC的Yz约束条款(参见Clang 3.2 Issue 13199和Clang 3.9 Issue 32727),该sha256rnds2指令要求:
Run Code Online (Sandbox Code Playgroud)Yz First SSE register (%xmm0).
我们mov为Clang 添加了一个:
asm ("mov %2, %%xmm0; sha256rnds2 %%xmm0, %1, %0" : "+x"(a) : "xm"(b), "x" (c) : "xmm0");
Run Code Online (Sandbox Code Playgroud)
性能每字节约3个周期.在我的2.2 GHz Celeron J3455测试机(带有SHA扩展的Goldmont)上,大约为230 MiB/s.它不平凡.
看看反汇编,k当执行两轮时,Clang没有围绕SHA …
在答案中,我已经声明未对齐访问的速度与对齐访问的速度几乎相同(在x86/x86_64上).我没有任何数字来支持这个陈述,所以我已经为它创建了一个基准.
你看到这个基准测试有什么缺陷吗?你可以改进它(我的意思是,增加GB /秒,所以它更好地反映了真相)?
#include <sys/time.h>
#include <stdio.h>
template <int N>
__attribute__((noinline))
void loop32(const char *v) {
for (int i=0; i<N; i+=160) {
__asm__ ("mov (%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x04(%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x08(%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x0c(%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x10(%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x14(%0), %%eax" : : "r"(v) :"eax");
__asm__ ("mov 0x18(%0), %%eax" : : "r"(v) :"eax"); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编程Arduino由于PWM LED矩阵.我需要在绘制每一行之前准备好数据,但是过程中最内部的循环太慢了.屏幕目前闪烁.循环应该在500us以下完成.Arduino具有84MHz Cortex-M3 ARM处理器.
这是我需要如何重新组合输出位的概念:
5位颜色数据:
R1=12, G1=4, B1=7, R2=0, G2=2, B2=27
Run Code Online (Sandbox Code Playgroud)
下一步是创建一个连续1的32位流.1的数量由颜色值给出:
r1 = 0b00000000000000000000111111111111
g1 = 0b00000000000000000000000000001111
b1 = 0b00000000000000000000000001111111
r2 = 0b00000000000000000000000000000000
g2 = 0b00000000000000000000000000000011
b2 = 0b00000111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
最后一步是将每10个像素的第n位(总共30个颜色值)重新组合成32位整数:
pack1 = 0b00 ... 111011
pack2 = 0b00 ... 111011
pack3 = 0b00 ... 111001
pack4 = 0b00 ... 111001
pack5 = 0b00 ... 101001
...
Run Code Online (Sandbox Code Playgroud)
这是代码:
// In my case scanwidth is 64*2 (64 is the width of the LED matrix and two lines are scanned at …Run Code Online (Sandbox Code Playgroud) 在Delphi的math.pas单元中有一个DivMod程序,我希望将其转换为内联并优化它,除数总是为10.但我不知道五角大楼ASM的细节.波纹管程序的转换是什么?
procedure DivMod(Dividend: Integer; Divisor: Word;
var Result, Remainder: Word);
asm
PUSH EBX
MOV EBX,EDX
MOV EDX,EAX
SHR EDX,16
DIV BX
MOV EBX,Remainder
MOV [ECX],AX
MOV [EBX],DX
POP EBX
end;
Run Code Online (Sandbox Code Playgroud)