Tag: inline assembly

无法在内联汇编中声明.data

你好,我有一个问题,我似乎无法声明.data。 我用我的代码尝试了各种不同的东西,它似乎总是打破这一部分 asm( “.data\n” “.file: .ascii \”/dev/mem\\000\”\n” ); 我也可以删除.data之后的任何信息,它仍会在’.data’处中断。 这是在带有内联汇编的树莓派2上完成的。如果其余的代码是相关的,请告诉我,但我很确定它不是。 谢谢你的帮助! 编辑:道歉我忘了包含错误消息 “错误:’此处’方法名称’的.size表达式不会计算为常量

SPARC大会问题

我想在我的C程序中编写一个非常简单的内联汇编程序,然后将本地寄存器%l0 – %l7设置为不同的值。 我尝试了以下简单的方法: asm volatile ( “.text\n\t” “mov 0, %%l0 \n\t” “mov 1, %%l1 \n\t” “mov 2, %%l2 \n\t” “mov 3, %%l3 \n\t” “mov 4, %%l4 \n\t” “mov 5, %%l5 \n\t” “mov 6, %%l6 \n\t” “mov 7, %%l7 \n\t” ); 不幸的是,汇编器告诉:每条指令的非法操作数。 有人可以非常高兴地指出我如何正确地将立即值传递给SPARC汇编程序吗? 非常感谢! 编辑:谢谢克里斯,我做了你建议的更改,但Sparc编译器仍然告诉一些关于非法操作数…

在bcm2836上使用GPIO

我正在为我的RPI2 OS编写GPIO驱动程序。 我正在冲浪很长时间,但我发现只有linux数据。 我应该怎么做这样的function void gpio_set(int pin); void gpio_clr(int pin); 在C中为司机。 或者,也许它可以通过内联汇编来完成?

在XeonPhi上使用AVX内联汇编的矢量和

我是新手使用XeonPhi Intel协处理器。 我想使用AVX 512位指令为简单的矢量和编写代码。 我使用k1om-mpss-linux-gcc作为编译器,并希望编写内联汇编。 这是我的代码: #include #include #include #include #include #include void* aligned_malloc(size_t size, size_t alignment) { uintptr_t r = (uintptr_t)malloc(size + –alignment + sizeof(uintptr_t)); uintptr_t t = r + sizeof(uintptr_t); uintptr_t o =(t + alignment) & ~(uintptr_t)alignment; if (!r) return NULL; ((uintptr_t*)o)[-1] = r; return (void*)o; } int main(int argc, char* argv[]) { […]

编写MIPS机器指令并从C执行它们

我正在尝试用C和MIPS编写一些自修改代码。 由于我想稍后修改代码,我正在尝试编写实际的机器指令(而不是内联汇编)并尝试执行这些指令。 有人告诉我,有可能只是malloc一些内存,在那里写指令,指向它的C函数指针,然后跳转到它。 (我在下面举例说明) 我已经尝试使用我的交叉编译器(sourcery codebench工具链)并且它不起作用(是的,在后面的视线中我认为它确实看起来很幼稚)。 我怎么能正确地做到这一点? #include #include #include void inc(){ int i = 41; uint32_t *addone = malloc(sizeof(*addone) * 2); //we malloc space for our asm function *(addone) = 0x20820001; // this is addi $v0 $a0 1, which adds one to our arg (gcc calling con) *(addone + 1) = 0x23e00000; //this is […]

为内联汇编创建常量池的正确方法是什么?

问题是在C函数内部我有一个内联汇编。 就像是 ldr r7, =0xdeadbeef svc 0 如果未明确创建文字池(这是这种情况),汇编程序会在翻译单元的末尾创建一个文字池。 通常这很好,但是如果翻译单元真的很大,那么这不起作用,因为文字池离ldr指令太远了。 所以,我想知道处理这个问题的最佳方法是什么。 最明显的方法是在内联汇编中手动创建文字池: ldr r7, =0xdeadbeef svc 0 b 1f .ltorg 1: 要么 ldr r7, 1f svc 0 b 2f 1: .word 0xdeadbeef 2: 不幸的是,由于冗余分支指令,这导致了次优代码。 我不希望汇编器足够聪明,为函数内部的常量池找到合适的位置。 我想要做的是在函数的末尾创建一个常量池。 有没有办法告诉编译器(gcc)在函数末尾创建一个文字池? PS我最终使用了movw/movt对而不是常量池。 虽然,首先,movw / movt解决方案的可移植性略低于文字池,其次,我只是想知道是否可以可靠而有效地在内联汇编中使用常量池。 更新: 那么,处理问题的最佳方法是什么? 要强制工具链在函数之后创建常量池,可以将函数放在单独的代码部分中。 它的工作原理是因为在翻译单元结束时汇编程序为每个部分生成单独的常量池。 实际上, 最好的方法是避免将常量加载到内联汇编中的寄存器中。 让编译器这样做会更好。 在我的情况下,我最终写了一个类似的代码 register int var asm(“r7”) = 0xdeadbeef; asm […]

C /汇编:如何更改CPU寄存器中的单个位?

我是软件故障注入领域的新研究员,目前我的最终目标是编写一段能够改变CPU寄存器中单个位的代码。 我在考虑用C语言(在代码中包含一些程序集调用)。 考虑到这一点,我在Stack Overflow中找到了这个很棒的线程和关于如何访问32位CPU寄存器内容的简单示例: 是否可以在C中访问32位寄存器? 这样,我就能编写这个简单的代码: #include int main() { register int value; register int ecx asm(“ecx”); printf(“Contents of ecx: %d\n”, ecx); asm(“movl %%ecx, %0;” : “=r” (value) : ); //Assembly: this stores the ecx value into the variable value printf(“Contents of value: %d\n”, value); return 0; } 这似乎是对这个主题的一个很好的介绍,那里提供的答案给了我很好的见解和信息来源(我已经阅读了GCC文档),但现在我需要进一步,即我需要了解怎么能我更改了CPU寄存器中单个位的内容(或者至少,要启动,更简单一些:如何更改CPU寄存器值?)。 如果有人能给我一个提示或告诉我最合适的来源,我会非常感激。 最好的,并提前感谢,João PS:不知道这是否有帮助,但我正在使用CentOS 6.5 32位系统(虽然CPU是64位,更准确地说是Intel Pentium双CPU […]

为什么在调用printf时会覆盖EDX的值?

我写了一个简单的汇编程序: section .data str_out db “%d “,10,0 section .text extern printf extern exit global main main: MOV EDX, ESP MOV EAX, EDX PUSH EAX PUSH str_out CALL printf SUB ESP, 8 ; cleanup stack MOV EAX, EDX PUSH EAX PUSH str_out CALL printf SUB ESP, 8 ; cleanup stack CALL exit 我是NASM汇编程序和GCC,用于将目标文件链接到linux上的可执行文件。 本质上,该程序首先将堆栈指针的值放入寄存器EDX,然后将该寄存器的内容打印两次。 但是,在第二次printf调用之后,打印到stdout的值与第一个不匹配。 这种行为似乎很奇怪。 […]

是否可以将汇编指令放入CUDA代码中?

我想在CUDA C代码中使用汇编代码,以减少昂贵的执行,因为我们在c编程中使用asm 。 可能吗?

gcc中的内联汇编

我对一些内联汇编代码有些麻烦。 我知道应该做些什么,但我想念“怎么样”! 我有这个“几乎”工作的校验和function: static unsigned long cksum_unroll( unsigned short **w, int *mlen) { int len; unsigned short *w0; unsigned long sum=0; len = *mlen; w0 = *w; while( len >= 8) { asm volatile ( “ldmia %[w0]!, {v1, v2}\n\t” “adds %[sum], %[sum], v1\n\t” “adcs %[sum], %[sum], v2\n\t” “adcs %[sum], %[sum], #0” : [sum] “+r” (sum) […]