Tag: assembly

如何获取c代码来执行hex字节码?

我想要一个简单的C方法,能够在Linux 64位机器上运行hex字节码。 这是我的C程序: char code[] = “\x48\x31\xc0”; #include int main(int argc, char **argv) { int (*func) (); func = (int (*)()) code; (int)(*func)(); printf(“%s\n”,”DONE”); } 我试图运行的代码( “\x48\x31\xc0” )我通过”\x48\x31\xc0″这个简单的汇编程序获得(它不应该真的做任何事情) .text .globl _start _start: xorq %rax, %rax 然后编译并objdump它以获取字节码。 但是,当我运行我的C程序时,我得到一个分段错误。 有任何想法吗?

_builtin_prefetch()中第二个参数的影响是什么?

这里的GCC doc指定了_buitin_prefetch的用法。 第三个论点是完美的。 如果为0,则编译器生成prefetchtnta(%rax)指令如果为1,编译器生成prefetcht2(%rax)指令如果为2,则编译器生成prefetcht1(%rax)指令如果为3(默认值),则编译器生成prefetcht0 (%rax)指令。 如果我们改变第三个参数,操作码已经相应地改变了。 但第二个论点似乎没有任何影响。 __builtin_prefetch(&x,1,2); __builtin_prefetch(&x,0,2); __builtin_prefetch(&x,0,1); __builtin_prefetch(&x,0,0); 以上是生成的示例代码: 以下是assembly: 27: 0f 18 10 prefetcht1 (%rax) 2a: 48 8d 45 fc lea -0x4(%rbp),%rax 2e: 0f 18 10 prefetcht1 (%rax) 31: 48 8d 45 fc lea -0x4(%rbp),%rax 35: 0f 18 18 prefetcht2 (%rax) 38: 48 8d 45 fc lea -0x4(%rbp),%rax 3c: 0f 18 […]

MARS MIPS和struct节点

typedef struct node { int data; struct node *next; } nodeL; 假设我想用MIPS汇编语言翻译上述声明,我该怎么做呢? 除了在.text段中分配内存(使用系统调用9)之外, .data段怎么样? 对齐怎么样?

用于Sparc架构的GCC内联汇编

我在互联网上找到了__sync_val_compare_and_swap的实现: #define LOCK_PREFIX “lock ; ” struct __xchg_dummy { unsigned long a[100]; }; #define __xg(x) ((struct __xchg_dummy *)(x)) static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { unsigned long prev; switch (size) { case 1: __asm__ __volatile__(LOCK_PREFIX “cmpxchgb %b1,%2” : “=a”(prev) : “q”(new), “m”(*__xg(ptr)), “0”(old) : “memory”); return […]

ASM x64 scanf printf double,GAS

我无法弄清楚为什么这段代码对我不起作用。 我需要使用scanf函数用于double,然后printf用于相同的double。 使用此代码时结果不佳。 我看到的是相当随机的字符。 .data d1: .double format: .asciz “%lf\n” format2: .asciz “%lf” .text .globl main main: subq $8, %rsp #scanf movq $0, %rax movq $d1, %rsi movq $format2, %rdi call scanf addq $16, %rsp #printf movq $1, %rax movsd d1, %xmm0 movq $format, %rdi call printf addq $16, %rsp #exit movq $1, %rdi xorq […]

x86-64分段故障保存堆栈指针

我目前正在关注本教程 ,但我不是该学校的学生。 GDB thread_start上的thread_start给出了一个分段错误: movq %rsp, (%rdi) # save sp in old thread’s tcb 这是我回溯时的附加信息: #0 thread_start () at thread_start.s:16 #1 0x0000000180219e83 in _cygtls::remove(unsigned int)::__PRETTY_FUNCTION__ () from /usr/bin/cygwin1.dll #2 0x00000000ffffcc6b in ?? () Backtrace stopped: previous frame inner to this frame (corrupt stack?) 作为一个新手,我不能为我的生活找出原因。 这是我的主要文件: #define STACK_SIZE 1024*1024 //Thread TCB struct thread { unsigned char […]

在编写汇编函数时,序言和尾声是强制性的吗?

最近我在汇编中重写了一些libc函数,对于其中一些(不需要任何调用或系统调用指令的那些,如strlen),我丢弃了序言和尾声,因为没有它我的测试没有失败(也许我没有足够复杂的测试)。 在同行评审期间,有人告诉我丢弃它是一种不好的做法,但无法解释为什么。 那么,当我调用没有prologue / epilogue组合的asm函数时,我遇到了问题吗? 即使堆栈上不需要额外的空间,添加它也是一个好习惯吗? 如果出于某些原因强制要求,为什么编译器(我使用过nasm)不会处理它? 谢谢阅读

什么是CPUID标准function01H?

我需要检查ECX的第30位,这是RDRAND所需的CPUfunction。 来自RDRAND Wiki , 如果支持,则在调用CPUID标准function01H后设置ECX寄存器的第30位。 我不知道这意味着什么。 “标准function01H ”? 这是否意味着EAX = 80000001h ? 我不确定该怎么办。

Makefile问题 – 读者的致命错误

我正在为学校项目创建的makefile遇到一些问题。 我正在编译和组装C文件和SPARC程序集文件(分别)并链接它们。 我在Unix环境中工作。 这是makefile: proj09.exe: proj09.driver.o proj09.support.o gcc -Wall proj09.driver.o proj09.support.o -o proj09.exe proj09.driver.o: proj09.driver.c /user/cse320/Projects/project09.support.h gcc -Wall -c proj09.driver.c /user/cse320/Projects/project09.support.h proj09.support.o: proj09.support.s gcc -Wall proj09.support.s 但是,当我试图制作它时,我得到一个读者错误,特别是: “阅读器中的致命错误:proj09.makefile,第2行:看到意外的行尾” 现在我知道通常这意味着某些内容格式不正确,但我不知道在这种情况下它可能是什么。 另外,我不是100%确定这是makefile的正确代码(特别是我的support.s文件的汇编,以及两个文件的链接)。 如果这是一个重复的问题,我道歉,我事先查看了档案,找不到任何有用的东西。 任何帮助将不胜感激! 编辑:我不明白为什么这会有所作为,但我使用gedit实际编写代码,然后将文件传输到SSH进行链接。

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