Tag: x86 64

从Assembly调用C函数(printf)时的Segfault

我在linux上使用NASM编写一个基本的汇编程序,它从C库(printf)调用一个函数。 不幸的是,我这样做会导致分段错误。 注释掉对printf的调用允许程序无错误地运行。 ; Build using these commands: ; nasm -f elf64 -g -F stabs .asm ; gcc .o -o ; SECTION .bss ; Section containing uninitialized data SECTION .data ; Section containing initialized data text db “hello world”,10 ; SECTION .text ; Section containing code global main extern printf ;————- ;MAIN PROGRAM BEGINS HERE […]

在LLVM中为变量使用特定寄存器

我正在写一个修改LLVM bitcode的LLVM传递。 对于一个变量,我希望它使用寄存器,比如x86上的R15。 如何在生成机器代码时指示LLVM使用此寄存器? 这可以在bitcode级别指导吗?

计算大型CRC32的正确方法是什么?

这篇文章描述了如何使用现代x86-64处理器中的内置CRC32指令计算最大1024字节的CRC32。 但是,我需要计算超过1024字节的CRC32。 计算1024字节的每个块的CRC32并最终求和它们是否是正确的方法,还是不正确? 如果是这样,那么正确的方法是什么?

关于movq指令的Segfault?

考虑以下简短程序。 int main(){ asm(“movq 0x5F5E100, %rcx;” “startofloop: ; ” “sub 0x1, %rcx; ” “jne startofloop; “); } 这个程序编译得很好,但是当它运行时,它会在初始的movq指令上发生段错误。 我一定错过了一些明显的东西,但我希望有人能为我指出这一点。 我在Debian 8上运行,内核3.16.0-4-amd64,如果相关的话。 为了将来参考,这是编译器生成的内容。 main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 #APP # 2 “asm_fail.c” 1 movq 0x5F5E100, %rcx;startofloop: ; sub 0x1, %rcx; jne startofloop; # 0 “” 2 […]

试图对一个函数进行逆向工程

我试图更多地了解x86中的汇编。 我在这里有一个神秘的function,我知道返回一个int并接受一个int参数。 所以它看起来像int mystery(int n){} 。 但我无法弄清楚C中的function。 该组件是: mov %edi, %eax lea 0x0(,%rdi, 8), %edi sub %eax, %edi add $0x4, %edi callq repz retq mov %edi, %eax shr %eax and $0x1, %edi and %edi, %eax retq 我不明白lea在这里做了什么以及它可能是什么样的function。

在没有原型的文件中调用的函数在ARM和x86-64上产生不同的结果

我们有3个文件: main.c , lib.h和lib.c : main.c中: #include #include /* #include “lib.h” */ int main(void) { printf(“sizeof unsigned long long: %zu\n”, sizeof(unsigned long long)); printf(“sizeof int: %zu\n”, sizeof(int)); unsigned long long slot = 0; int pon_off = 1; lib_fn(slot, pon_off); return EXIT_SUCCESS; } lib.h: void lib_fn(unsigned slot, int pon_off); lib.c: #include #include void lib_fn(unsigned slot, int […]

x86_64程序集约定保存参数寄存器

我正在编写一些x86_64程序集来调用C函数。 我的C函数接受1个参数,因此程序集将参数放在%rdi 。 ABI pdf(下面链接)表示其他6个参数寄存器(rsi,rdx,rcx,r8,r9)不会在函数调用中保留。 但是,由于我的C函数只需要一个long参数,我是否可以保证C函数是否会破坏其他5个寄存器? 我的假设是,如果参数的值发生了变化,那么参数寄存器只会被破坏: void foo(int a, int b) { a++; /* %rdi will be changed, but %rsi won’t be changed when control returns. */ } 我问,因为我想在我的C函数调用中保留其他5个参数寄存器的值(无需手动显式地从堆栈中推送/弹出它们)。 x86_64 ABI – http://www.x86-64.org/documentation/abi-0.99.pdf

我的(AT&T)程序集(x86-x64)代码应该增加但不增加

我正在尝试组装一个小程序(AT&T)。 我试图以整数的forms从用户那里获得一个输入,然后在它之后递增,然后输出递增的值。 但是,该值不会增加。 我花了最后几个小时尝试我能想到的一切,但它仍然不起作用,所以我有一个想法,我可能不太了解汇编中的概念,导致我没有发现错误。 这是我的代码: 1 hiString: .asciz “Hi\n” 2 formatstr: .asciz “%ld” 3 4 .global main 5 6 main: 7 movq $0, %rax #no vector registers printf 8 movq $hiString, %rdi #load hiString 9 call printf #printf 10 call inout #inout 11 movq $0, %rdi #loading exit value into register rdi 12 call exit […]

是否有专门设计用于编译1到1的C函数或宏,以及跨平台方式的位操作汇编指令?

我有一个涉及仿真的项目(如果你查看我的post历史,你会看到我到底有多远!)我正在寻找使用C进行伪二进制翻译并使用优化器和/或编译器使用C代码将我的switch语句内容编译为单个汇编指令,主要用于非常标准的指令,如mov s, add , SR和其他简单的位操作和算术指令。 我希望同时为ARM和x86-64这样做,尽可能少地在两个程序集中编写。 如果我所描述的东西不存在,那么我想知道是否有某种“汇编语言”可以用来编写我的代码然后将该汇编编译成x86-64和ARM。

64位GCC混合32位和64位指针

尽管代码有效,但我对编译器决定混合使用相同类型的32位和64位参数感到困惑。 具体来说,我有一个接收三个char指针的函数。 查看汇编代码,三个中的两个作为64位指针(如预期的那样)传递,而第三个,一个本地常量,但仍然是字符串,作为32位指针传递。 我看不出我的函数在第3个参数不是满载的64位指针时怎么知道。 显然,只要较高的一方为0,它就没关系,但我认为它没有努力确保这一点。 在这个例子中,任何东西都可能在RDX的高端。 我错过了什么? 顺便说一下,接收函数假定它是一个完整的64位指针,并在输入时包含以下代码: movq %rdx, -24(%rbp) 这是有问题的代码: .LC4 .string “My Silly String” .text .globl funky_funk .type funky_funk, @function funky_funk: pushq %rbp movq %rsp, %rbp pushq %rbx subq $16, %rsp movq %rdi, -16(%rbp) ;char *dst 64-bit movl %esi, -20(%rbp) ;int len, 32 bits OK movl $.LC4, %edx ;<<<<—- why is it […]