Tag: 内联汇编

在不使用gcc的内联汇编的情况下访问寄存器

我想在不编写内联汇编的情况下读取堆栈指针寄存器值。我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦。 所以我想做那样的事情。 register “rsp” long rsp_alias; <— How do I achieve something like that in gcc? long current_rsp_value[NUM_OF_THREADS]; current_rsp_value[tid] = rsp_alias; gcc有什么可能吗?

GCC内联汇编:约束

我很难理解角色约束在GCC内联汇编(x86)中的作用。 我已经阅读了手册 ,它准确地解释了每个约束的作用。 问题在于,即使我理解每个约束的作用,但我很少理解为什么要使用一个约束而不是另一个约束,或者含义可能是什么。 我意识到这是一个非常广泛的话题,所以一个小例子应该有助于缩小焦点。 以下是一个简单的asm例程,它只添加两个数字。 如果发生整数溢出,则将值1写入输出C变量。 int32_t a = 10, b = 5; int32_t c = 0; // overflow flag __asm__ ( “addl %2,%3;” // Do a + b (the result goes into b) “jno 0f;” // Jump ahead if an overflow occurred “movl $1, %1;” // Copy 1 into c “0:” // We’re […]

(C中的内联汇编)汇编程序消息:错误:未知的伪操作:

我为asm内联汇编编写了一个简短的C“包装器”函数,如下所示。 汇编代码由while循环组成,使用SSE2计算几个矢量点积。 我在x86上的Ubuntu 14.04上使用GCC 4.8.4。 以下代码可以“无问题”组装 gcc -fpic -O2 -msse2 -S foo.c 但是,当我这样做 gcc -c foo.s 触发错误: foo.c:汇编程序消息: foo.c:2:错误:未知的伪操作:`.while5′ 我检查了汇编器输出“foo.s”并发现了一些奇怪的东西。 C文件“foo.c”: #include void foo (int kk, double *A, double *B, double *ALPHA, double *C, int ldc) { asm(“movl %0, %%ecx\n\t” /* kk -> %ecx */ “movl %3, %%eax\n\t” /* A -> %eax */ “movl %4, […]

gcc,内联汇编 – pushad / popad缺失?

有什么方法可以避免将pushad / popad指令体复制粘贴到我的代码中? 因为gcc(当前标志: -Wall -m32 )抱怨这一点 __asm__(“pushad;”); 错误:没有这样的指令:`pushad’ __asm__(“popad;”); 错误:没有这样的指令:`popad’

无法从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,而不是原始值? 我的代码有问题吗? 非常感谢。

如何访问c变量以进行内联汇编操作

鉴于此代码: #include int main(int argc, char **argv) { int x = 1; printf(“Hello x = %d\n”, x); } 我想在内联汇编中访问和操作变量x。 理想情况下,我想使用内联汇编更改其值。 GNU汇编程序,并使用AT&T语法。

我怎么告诉gcc我的内联汇编是否是堆栈的一部分?

考虑这样的内联汇编: uint64_t flags; asm (“pushf\n\tpop %0” : “=rm”(flags) : : /* ??? */); 尽管可能存在某种内在函数来获取RFLAGS的内容,但我如何向编译器指出我的内联汇编在堆栈顶部破坏了一个四字内存?

使用gcc中的内联汇编从stdin扫描并打印到stdout

如何在内联汇编gcc中读取stdin并写入stdout,就像我们在NASM中这样做: _start: mov ecx, buffer ;buffer is a data word initialised 0h in section .data mov edx, 03 mov eax, 03 ;read mov ebx, 00 ;stdin int 0x80 ;Output the number entered mov eax, 04 ;write mov ebx, 01 ;stdout int 0x80 我尝试从内联汇编中的stdin读取,然后将输入分配给x: #include int x; int main() { asm(” movl $5, %%edx \n\t” ” […]

如何告诉GCC为实模式生成16位代码

我正在编写实模式函数,它应该是具有堆栈帧的正常函数,但是它应该使用%sp而不是%esp。 有办法吗?

gcc内联汇编错误“mov的操作数类型不匹配”

//quick inline asm statements performing the swap_byte for key_scheduling inline void swap_byte(unsigned char *x, unsigned char *y) { unsigned char t; asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(t) :”r”(*x) :”%eax”); asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(*x) :”r”(*y) :”%eax”); asm(“movl %1, %%eax;” “movl %%eax, %0;” :”=r”(*y) :”r”(t) :”%eax”); } 在这里,我试图从x交换char并存储在y ,并且y与x交换相同。 我已经通过将movl更改为mov来编译这些指令,但没有成功。 编译/链接的问题在哪里? 以下是cygwin中编译的输出: $ […]