Tag: 内联汇编

在c和内联汇编之间传递参数

我有一个关于在c和内联汇编之间传递参数的问题 我在将数组传递到内联汇编时遇到了麻烦。 我一直收到错误’错误:内存输入1无法直接寻址’ 以下是我的代码示例: void main() { char name[] = “thisisatest”; __asm__ (“\ .intel_syntax noprefix \n\ mov eax, %[name] \n\ inc (eax) \n\ ” :/*no output*/ :[name]”m”(name) ); } 这应该增加我的字符​​串的第一个字母(使它’u’),但它不会构建。 想法?

(C中的内联汇编)有趣的内存分段错误

我的asm汇编代码中有以下部分 “LOOP%=:\n\t” “movapd (%%eax), %%xmm4\n\t” “addl $32, %%eax\n\t” “movsd (%%edx), %%xmm5\n\t” “addl $16, %%edx\n\t” “movapd %%xmm4, %%xmm6\n\t” “subl $1, %%ecx\n\t” “unpcklpd %%xmm5, %%xmm5\n\t” “testl %%ecx, %%ecx\n\t” “mulpd %%xmm5, %%xmm6\n\t” “movsd -8(%%edx), %%xmm7\n\t” “addpd %%xmm6, %%xmm0\n\t” “movapd -16(%%eax), %%xmm6\n\t” “unpcklpd %%xmm7, %%xmm7\n\t” “mulpd %%xmm6, %%xmm5\n\t” “addpd %%xmm5, %%xmm1\n\t” “mulpd %%xmm7, %%xmm4\n\t” “addpd %%xmm4, %%xmm2\n\t” “mulpd %%xmm6, […]

如何格式化汇编代码?

我有一个用汇编语言编写的相当长的代码,我想在使用asm()函数的C程序中使用它,但是必须引用代码中的每一行,并且必须插入一个新行字符(’\ n’)每行的结尾以使其可用。 是否有任何文本编辑工具可以执行此操作,或者我必须手动执行此操作?

为什么我的程序在Ubuntu gcc上运行但不在OSX gcc上运行?

所以我的作业,我在Ubuntu中运行它,它编译得很好并且运行方式应该如此。 但是当我在Mac OSX中运行它时,会出现总线错误。 这是为什么? 我正在使用gcc -m32 source.c -o test编译 这是Mac OSX版本(添加了前缀下划线): #include #include #include char phrase[] = “slow but sure”; int sz; int phrasesz; char *arg; char *result; // Add any extra variables you may need here. int main(int argc, char* argv[]) { if (argc != 2) { printf(“Usage: %s takes 1 string argument.\n”, argv[0]); […]

Visual-C ++内联汇编程序两个偏移量的差异

我正在将一大堆代码从MASM移植到C内联汇编程序(x86,Windows,MS VC)。欺骗不是真正的代码,只是欺骗提出一个想法。 假设我将一些数据定义为静态数组,甚至是两个标签之间的代码块,我需要获得它的大小。 label1: bla bla bla label2: …. mov eax, (offset label2 – offset label1) 这样的代码在MASM中像魅力一样工作,但在CI中得到以下错误消息:“错误C2425:’ – ‘:’第二个操作数’中的非常量表达式”我可以编译: mov eax, offset label1 mov eax, offset label2 我希望编译器在编译时评估(偏移label1 – 偏移label2),但看起来我错了。 我也不能添加偏移量(为什么?这些只是在编译期间添加的两个整数……?)当然,我可以获得mov eax,offset label2 mov edx,offset label1 sub eax,edx编译,但这是一个额外的代码只是为了计算常数。 有人可以解释一下,我的代码有什么问题吗? 这可能是搬迁造成的吗? 如何推动它? 期待一个答案,谢谢。

如何从内联汇编程序调用Win32 API函数?

有人请告诉我这个代码有什么问题我只是从kernel32.dll调用Sleep函数有什么问题? 我正在使用Visual Studio 2008.任何帮助都将不胜感激。 非常感谢你。 __asm { mov eax, 77e2ef66h push 9999 call eax }

我可以使用asm函数和ac – string变量而不是字符串文字作为参数吗?

我做了这样的事情: char命令[] =“一些令人讨厌的代码”; asm volatile(命令); 它没有用。 具体来说,我得到以下错误: Expected string literal before command. 那么,我可以只使用带有C内联汇编的字符串文字吗? 我真的希望能够使用上面的字符串变量。 我怎样才能达到这个效果?

如何编写从汇编代码调用的C函数

我需要编写一个C函数,它将从linux内核中的汇编代码中调用。 应该考虑哪些特殊问题? 我有一些想法,但任何人都可以提供更多细节: (1)召集会议 确保组件中的呼叫者和c中的被叫者握手良好。 但是我应该使用哪种调用约定? 如何声明c函数并在汇编代码中声明它? (2)保护寄存器 在调用之前,应将某些寄存器保存在程序集中。 我粗略记得他们是eax,ecx和edx。 但我不需要保存它们,除非我需要在调用C函数之前引用旧值,对吧? 还有什么其他问题?

如何读取寄存器:RAX,RBX,RCX,RDX,RSP。 C或C ++中的RBP,RSI,RDI?

让我们说我想在双核x64 CPU上读取这些寄存器的值(以及它的全部内容)。 我怎样才能做到这一点? 我可以简单地写一下: uint64_t rax = 0, rbx = 0; __asm__ __volatile__ ( /* read value from rbx into rbx */ “movq %%rdx, %0;\n” /* read value from rax into rax*/ “movq %%rax, %1;\n” /* output args */ : “=r” (rbx), “=r” (rax) : /* no input */ /* clear both rdx and rax […]

自己内核的键盘中断处理程序(C)

我正在写一个小操作系统,作为学校分配的一部分,但我得到了卡住键盘输入(按一个键 – >显示在屏幕上)。 我正在使用osdev.org上的Bare Bones教程(gcc交叉编译器,GRUB引导程序,ld链接器),因为我处于保护模式,所以我不能使用BIOS中断进行输入,这就是为什么我必须编写自己的中断处理程序( ?)但即使在我阅读了一些osdev文章和论坛讨论后,我也不确定该怎么做。 非常类似的问题( http://forum.osdev.org/viewtopic.php?f=1&t=9746 ),除了我不知道如何“设置中断”。 #if !defined(__cplusplus) #include /* C doesn’t have booleans by default. */ #endif #include #include #define INT_DISABLE 0 #define INT_ENABLE 0x200 #define PIC1 0x20 #define PIC2 0xA0 #define ICW1 0x11 #define ICW4 0x01 void outb( unsigned short port, unsigned char val ) { asm volatile(“outb %0, %1” […]