Tag: x86

将c代码转换为x86程序集的简便方法?

是否有一种简单的方法(如免费程序)可以将c / c ++代码转换为x86程序集? 我知道任何c编译器都做了非常类似的事情,我可以编译c代码,然后反汇编编译的可执行文件,但这有点过分,我想要的只是转换几行代码。 有谁知道一些程序可以做到这一点? 编辑:我知道GCC编译器这样做,但它是AT&T语法,我正在寻找英特尔语法(不确定它是否称为英特尔语法)。 AT&T语法看起来有点像胡言乱语,有些命令以相反的顺序使用操作数,而不是我习惯的方式,它可能会让人感到困惑。

奇怪的’asm’操作数有不可能的约束错误

我正在尝试编译一个简单的C程序(Win7 32位,Mingw32 Shell和GCC 5.3.0)。 C代码是这样的: #include #include #define _set_tssldt_desc(n,addr,type) \ __asm__ (“movw $104,%1\n\t” \ :\ :”a” (addr),\ “m” (*(n)),\ “m” (*(n+2)),\ “m” (*(n+4)),\ “m” (*(n+5)),\ “m” (*(n+6)),\ “m” (*(n+7))\ ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x89″) char *n; char *addr; int main(void) { char *n = (char *)malloc(100*sizeof(int)); char *addr = (char *)malloc(100*sizeof(int)); set_tss_desc(n, addr); free(n); […]

_builtin_prefetch()中第二个参数的影响是什么?

这里的GCC doc指定了_buitin_prefetch的用法。 第三个论点是完美的。 如果为0,则编译器生成prefetchtnta(%rax)指令如果为1,编译器生成prefetcht2(%rax)指令如果为2,则编译器生成prefetcht1(%rax)指令如果为3(默认值),则编译器生成prefetcht0 (%rax)指令。 如果我们改变第三个参数,操作码已经相应地改变了。 但第二个论点似乎没有任何影响。 __builtin_prefetch(&x,1,2); __builtin_prefetch(&x,0,2); __builtin_prefetch(&x,0,1); __builtin_prefetch(&x,0,0); 以上是生成的示例代码: 以下是assembly: 27: 0f 18 10 prefetcht1 (%rax) 2a: 48 8d 45 fc lea -0x4(%rbp),%rax 2e: 0f 18 10 prefetcht1 (%rax) 31: 48 8d 45 fc lea -0x4(%rbp),%rax 35: 0f 18 18 prefetcht2 (%rax) 38: 48 8d 45 fc lea -0x4(%rbp),%rax 3c: 0f 18 […]

如何将未签名的int加载到SIMD中

我有一个C程序,我有一些无符号整数数组。 我正在使用这个声明uint32_t 。 我想使用SIMD对存储在每个arrays中的数据执行一些操作。 这是我被卡住的地方,因为看起来大多数SSE和SSE2函数只支持float和double。 加载uint32_t类型数据的最佳方法是什么?

x86-64分段故障保存堆栈指针

我目前正在关注本教程 ,但我不是该学校的学生。 GDB thread_start上的thread_start给出了一个分段错误: movq %rsp, (%rdi) # save sp in old thread’s tcb 这是我回溯时的附加信息: #0 thread_start () at thread_start.s:16 #1 0x0000000180219e83 in _cygtls::remove(unsigned int)::__PRETTY_FUNCTION__ () from /usr/bin/cygwin1.dll #2 0x00000000ffffcc6b in ?? () Backtrace stopped: previous frame inner to this frame (corrupt stack?) 作为一个新手,我不能为我的生活找出原因。 这是我的主要文件: #define STACK_SIZE 1024*1024 //Thread TCB struct thread { unsigned char […]

将__m256i存储为整数

如何将__m256i数据类型存储为整数? 我知道浮子有: _mm256_store_ps(float *a, __m256 b) 其中第一个参数是输出数组。 对于整数我只发现: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数都是__m256i数据类型。 做这样的事情就足够了: int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 ); (我使用它作为函数的参数,我想获得它的值) 内部function: __m256i * Xmmtype = (__m256i*) X; //fill output _mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i 这个可以吗? – – -更新 – – – – – […]

什么是CPUID标准function01H?

我需要检查ECX的第30位,这是RDRAND所需的CPUfunction。 来自RDRAND Wiki , 如果支持,则在调用CPUID标准function01H后设置ECX寄存器的第30位。 我不知道这意味着什么。 “标准function01H ”? 这是否意味着EAX = 80000001h ? 我不确定该怎么办。

切换特定位

所以我已经看到了诸如在ith positon稍微切换一下的问题以及如何设置,清除和切换一个位? ,但我想知道是否有一个很好的方法在x86-64汇编中切换第i个位置? 我尝试用C语言编写并查看程序集,并不完全明白为什么有些东西存在。 C: unsigned long toggle(unsigned long num, unsigned long bit) { num ^= 1 << bit; return num; } int main() { printf("%ld\n", toggle(100, 60)); return 0; } 从GDB切换function组件: push rbp mov rbp, rsp mov QWORD PTR [rbp-0x8],rdi mov QWORD PTR [rbp-0x10],rsi mov rax, QWORD PTR [rbp-0x10] mov edx, 0x1 mov ecx, […]

无法从MSR回读

我正在编写一个内核模块,它是关于读写MSR的。 我写了一个简单的测试程序,但它仍然失败。 它所做的只是写入MSR,然后再读回来。 这是代码: static int __init test3_init(void) { uint32_t hi,lo; hi=0; lo=0xb; asm volatile(“mov %0,%%eax”::”r”(lo)); asm volatile(“mov %0,%%edx”::”r”(hi)); asm volatile(“mov $0x38d,%ecx”); asm volatile(“wrmsr”); printk(“exit_write: hi=%08x lo=%08x\n”,hi,lo); asm volatile(“mov $0x38d,%ecx”); asm volatile(“rdmsr”:”=a”(lo),”=d”(hi)); printk(“exit_write2: hi=%08x lo=%08x\n”,hi,lo); return 0; } 输出如下: exit_write: hi=00000000 lo=0000000b exit_write2: hi=00000000 lo=00000000 有人能告诉我为什么第二个输出中的返回值为0,而不是原始值? 我的代码有问题吗? 非常感谢。

这个汇编声明是什么意思?

我正在使用-s标志查看gcc生成的汇编代码。 一些陈述如下所示。 movl is_leader(%rip), destination 这里, is_leader是C代码中int类型的全局定义变量。 我不明白的是这里的术语是is_leader(%rip) 。 是不是翻录指令指针? 我需要知道这个语句是如何用来访问is_leader的 。