Articles of 内联汇编

如何确定保存在堆栈中的值?

我正在做一些试验,希望能够看到系统调用期间保存在堆栈中的内容(用户登陆过程的保存状态)。 根据http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.S,它显示寄存器的各种值被保存在堆栈指针的特定偏移处。 这里是我一直试图用来检查什么是保存在堆栈上的代码(这是在我创build的自定义系统调用): asm("movl 0x1C(%esp), %ecx"); asm("movl %%ecx, %0" : "=r" (value)); 其中value是一个无符号long。 截至目前,这个值不是预期的(它显示为ds的用户值保存了一个0)。 我正确访问堆栈指针的偏移量? 另一种可能性是我可以使用debugging器(如GDB)在内核中检查堆栈内容吗? 我没有太多的广泛使用与debugging,我不知道如何debugging内核的代码。 任何帮助深表感谢。

GCC:putchar(char)inline assembly

溢出, 我怎么才能实现使用内联汇编的putchar(char)过程? 我想在x86-64程序集中做到这一点。 我这样做的原因是实现我自己的标准库(或至less它的一部分)。 这是我到目前为止: void putchar(char c) { /* your code here: print character c on stdout */ asm(…); } void _start() { /* exit system call */ asm("mov $1,%rax;" "xor %rbx,%rbx;" "int $0x80" ); } 我正在编译: gcc -nostdlib -o putchar putchar.c 感谢您的帮助!

在gcc内联汇编中调用一个函数

说,我想在gcc的内联汇编中调用带有以下签名的函数。 我怎样才能做到这一点? int some_function( void * arg );

在内联的GNU汇编程序中获取string长度

我正在重新学习在很老的MS-DOS机器上使用的汇编程序! 这是我对这个function应该是什么样子的理解。 它试图把0xffffffff写入ecx时编译但碰撞了一个SIGSEGV 。 该代码运行在一个虚拟机与32位Debian的9.任何帮助,将不胜感激。 int getStringLength(const char *pStr){ int len = 0; char *Ptr = pStr; __asm__ ( "movl %1, %%edi\n\t" "xor %%al, %%al\n\t" "movl 0xffffffff, %%ecx\n\t" "repne scasb\n\t" "subl %%ecx,%%eax\n\t" "movl %%eax,%0" :"=r" (len) /*Output*/ :"r"(len) /*Input*/ :"%eax" /*Clobbered register*/ ); return len; }

如何将Linux 32位gcc内联汇编转换为64位代码?

我试图在Linux中使用gcc将RR0D Rasta Ring 0 Debugger从32位模式转换为64位模式(长模式)。 我熟悉x86 32位程序集(在MS-DOS环境下),但我是x86 64位程序集和Linux汇编程序devise的初学者。 此项目是为生产使用(我需要一个工作的非源代码debugging器),但我也试图学习如何做32位到64位转换。 如果可能的话,我试图find一种通用的方法来进行32位到64位的转换,这些转换可以在任何使用正则expression式的32位程序上完成(这样可以自动化)。 我知道没有一个通用的解决scheme(64位代码可能比32位代码占用更多的空间,并消耗更多的堆栈等),但即使在这种情况下,自动转换的代码将作为一个起点。 这个想法是保持8位和16位操作数,并用64位操作数replace32位操作数。 这种方法自然会失败,如果pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx被pushw %ax; pushw %bx; popq %rcxreplacepushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx ,但行为良好的程序通常不会push两个16位操作数,然后pop一个32位操作数,或者他们? 到目前为止,这些转换是: 编辑:修正: […]

64位应用程序和内联汇编

我正在使用Visual C ++ 2010开发32位Windows应用程序。 有一些我真的想要使用内联汇编。 但是我刚刚意识到Visual C ++不支持64位应用程序中的内联汇编。 因此将来移植到64位是一个大问题。 我不知道64位应用程序如何与32位应用程序不同。 将来有没有机会将32位应用程序全部升级到64位? 我听说64位的CPU有更多的寄存器。 由于性能不是我的应用程序的关注,使用这些额外的寄存器不是我所关心的。 还有什么其他的原因,32位应用程序需要升级到64位? 除了64位应用程序可能使用64位CPU专有的寄存器或指令之外,64位应用程序与32位应用程序相比处理事情是否有所不同? 我的应用程序需要与其他操作系统组件进行交互,例如驱动程序,我知道它必须是64位窗口中的64位。 我的32位应用程序是否兼容?