首页 > TAG信息列表 > inline-assembly

C-不使用stdlibs打印args

我刚刚编写了一个C程序,它不使用标准库或main()函数即可打印其命令行参数.我的动机只是出于好奇心,并了解如何进行内联汇编.我正在将Ubuntu 17.10 x86_64与4.13.0-39通用内核和GCC 7.2.0一起使用. 以下是我尝试尽我所能理解的代码.系统需要使用函数print,print_1,my_exit和_start()

如何使asm跳转到c中的变量地址?

现在,我用c中的内联汇编调用跳转指令,如下所示: int register eax asm("eax") = addr; // addr is a memory address asm("jmp *%eax"); 我想这样做而不必设置任何其他寄存器值(例如,我想做的就是这样): asm("jmp *(addr)"); 什么是正确的方法?也就是说,如何将c变量“插入”到asm

linux-使用-O1和内联汇编程序的GCC分段错误

我在我的代码中检测到一个奇怪的分段错误,如果这可能是GCC错误,还是我的错,我想听听您的意见! 该函数如下所示: void testMMX( ... ) { unsigned long a = ...; unsigned char const* b = ...; unsigned long c = ...; __asm__ volatile ( "pusha;" ); __asm__ vol

为什么从x86_64汇编函数调用C abort()函数会导致分段错误(SIGSEGV)而不是中止信号?

考虑该程序: main.c #include <stdlib.h> void my_asm_func(void); __asm__( ".global my_asm_func;" "my_asm_func:;" "call abort;" "ret;" ); int main(int argc, char **argv) { if (argv[1][0] == 

如何在gcc内联汇编中使用全局变量

我试图使用这样的内联汇编,作为全局变量,但编译器通过对saved_sp的未定义引用给出错误. __asm__ __volatile__ ( "movq saved_sp, %rsp\n\t" ); saved_sp被声明为static long saved_sp global(对于一个文件).我在这做什么错?解决方法:如果它失败并且“未定义引用`saved_sp

c – 使用GCC的内联汇编进行直接C函数调用

如果要从内联汇编调用C/C++函数,可以执行以下操作: void callee() {} void caller() { asm("call *%0" : : "r"(callee)); } 然后GCC将发出如下所示的代码: movl $callee, %eax call *%eax 这可能会有问题,因为间接调用会破坏旧CPU上的管道. 由于被调用者的地址最终是常量,因

在GNU C内联汇编中编写Linux int 80h系统调用包装器

参见英文答案 > How to invoke a system call via sysenter in inline assembly?                                    2个 我正在尝试使用内联汇编…我读了这页http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx,但我无法理解传递

linux – 在内联GNU汇编程序中获取字符串长度

我正在重新学习我在很老的MS-DOS机器上使用的汇编程序! 这是我对该功能应该是什么样的理解.当尝试将0xffffffff放入ecx时,它会编译但与SIGSEGV崩溃. 代码在具有32位Debian 9的VM中运行.任何帮助将不胜感激. int getStringLength(const char *pStr){ int len = 0;

是否可以在GCC中使用C17中的显式寄存器变量?

我正在使用explicit register variables将参数传递给原始Linux系统调用,使用没有machine-specific constraints的寄存器(例如x86_64上的r8,r9,r10),如建议的here. #include <asm/unistd.h> #ifdef __i386__ #define _syscallOper "int $0x80" #define _syscallNumReg "eax" #defi

linux – ARM inline asm:退出系统调用,从内存中读取值

问题 我想在Linux Android设备上使用内联汇编在ARM中执行退出系统调用,我希望从内存中的某个位置读取退出值. 例 如果不给出这个额外的参数,调用的宏看起来像: #define ASM_EXIT() __asm__("mov %r0, #1\n\t" \ "mov %r7, #1\n\t" \

c – __asm volatile是什么(“pause”:::“memory”);做?

我正在看一个开源C项目,它具有以下代码结构: while(true) { // Do something work if(some_condition_becomes_true) break; __asm volatile ("pause" ::: "memory"); } 最后的陈述是做什么的?我知道__asm意味着它是一个汇编指令,我发现了一些关于暂停指令的帖子,这些

C内联汇编:如何处理引用?

如何处理内联汇编程序中的函数引用?我正在尝试这个 void foo(int& x) { __asm mov x, 10 } int main() { int x = 0; foo(x); std::cout << x << std::endl; } 但是在执行函数后x仍为0,但是这个工作正常 int x = 0; __asm mov x, 10 std::cout << x << std::end

错误的寄存器’%rbx’与’l’后缀一起使用

我正在尝试使用gcc编译器在linux下编译此代码: static inline unsigned long get_current(void) { unsigned long current; asm volatile ( " movl %%esp, %%eax;" " andl %1, %%eax;" " movl (%%eax), %0;" : "=r" (curren

c – 内联汇编是否需要在linux中拥有权限?

任何用户都可以为当前的Linux内核运行内联汇编,还是需要特殊权限?解决方法:内联汇编与内核无关.所以答案是否定的. 任何人都可以编写内联汇编并将其编译到程序中.它与编译器生成的代码没有任何不同. 至于你的评论,答案是不可能的,因为memory protection.一旦你试图访问未映射的内存

android – 优化霓虹灯组装功能

我正在开发一个应该在ARMv7处理器设备上运行的原生Android应用程序. 出于某些原因,我需要对向量(短和/或浮点)进行一些繁重的计算.我使用NEON命令实现了一些汇编功能来增强计算.我已经获得了1.5速度因素,这也不错.我想知道我是否可以更快地改进这些功能. 所以问题是:我可以做些什么

_syscallN宏在哪里?

过去,如果你需要在不使用现有库的情况下直接在linux中进行系统调用,你可以只包括< linux / unistd.h>它会定义一个与此类似的宏: #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ type name(type1 arg1,type2 arg2,type3 arg3) \ { \ long __res; \ __asm__ vola

GCC内联汇编中的系统调用

参见英文答案 > How to invoke a system call via sysenter in inline assembly?                                    2个是否可以使用内联汇编块中的系统调用来编写单个字符?如果是这样,怎么样?它应该看起来像这样的“东西”: __asm__ __volat