标签: x86-64

为什么mmap不能在这里工作

当我运行以下代码时出现分段错误...

int * x = mmap( 0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, 0, 0 );

x[0] = 42; // <--- Segmentation fault happens due to this
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

c linux memory-management mmap x86-64

1
推荐指数
1
解决办法
5849
查看次数

如何解码此指令"call*fs:0x334"以了解确切的函数地址?

在运行期间,如何获取寄存器fs中的值并在"call*fs:0x334"中计算目标函数的地址?我可以使用什么样的x86组件?

x86 assembly x86-64 linux-kernel

1
推荐指数
1
解决办法
529
查看次数

压缩递增数据的最佳方法

我有一个向量,我保持递增数据.通常,向量的每个元素都是64位长的变量.然而,很可能两个连续元素之间的差异非常小,因此例如我们可以具有如下序列.

1, 34, 37, 42, 45, 1098, 1200, 1211, 1938
Run Code Online (Sandbox Code Playgroud)

压缩此数据的最佳方法是什么?保持差异是理想的,并且有一个标题字节来定义差异有多大,是否只是一个字节,字,双字等,还是有更好的方法来压缩这些增量数据?

编辑

我需要在线压缩,即将数据放入向量中.您可以假设动态扩展矢量.

c compression x86-64

1
推荐指数
1
解决办法
112
查看次数

printf float in nasm assembly 64-bit

我想用printf打印浮点值

global main
extern printf

section .data
   string: db `%f\n`, 0

section .bss
   rs: resq 1

[...]

   movq xmm0, [rs]
   mov rdi, string
   mov rax, 0
   call printf
Run Code Online (Sandbox Code Playgroud)

rs包含浮点值1.6

(gdb) x/fg &rs
0x600ad8 <rs>:  1.6000000000000001
Run Code Online (Sandbox Code Playgroud)

但程序打印

[username@localhost folder]$ ./programname
0.000000
Run Code Online (Sandbox Code Playgroud)

谁能让程序打印1.6?我究竟做错了什么?

assembly printf x86-64 nasm calling-convention

1
推荐指数
1
解决办法
4050
查看次数

64位代码占用了32位代码的更多存储空间吗?

对不起,我不太喜欢S/O和asm的全新内容.

我一直在阅读英特尔,Amd和nasm文档,ref.x86asm.net,sandpile.org和wiki.osdev.org.

我不太欣赏的一件事是:

  1. 64位指令实际上比32位指令(在保护模式下)更大(在长模式下),因为前缀...或指令的宽度是否相同?
  2. 当给出操作数时,它们通常是零填充(自动),但这是由编译时的汇编程序还是运行时的处理程序完成的?

对不起,如果这真的很明显......

assembly x86-64 nasm 32bit-64bit

1
推荐指数
1
解决办法
101
查看次数

了解x86-64汇编代码中的指针赋值

我想了解汇编代码.我被困在指定指针的部分和leaq命令后的代码中

这是我的C代码:

#include <stdio.h>
#include<stdlib.h>

int main(){
    int x=50;
    int *y=&x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我相应的ASSEMBLY代码:

.file   "AssemlyCode.c"
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    movl    $50, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (GNU) 5.4.0"
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64 att

1
推荐指数
1
解决办法
437
查看次数

1
推荐指数
2
解决办法
265
查看次数

如何通过shell / bash检测386,amd64,arm或arm64 OS体系结构

我在寻找一个POSIX外壳/ bash命令来确定OS架构386amd64arm,或arm64

bash shell posix arm x86-64

1
推荐指数
5
解决办法
3409
查看次数

GCC内联汇编错误:'lidt'的指令后缀无效

我试图从C调用一些汇编代码。最近,我在将程序从x86切换到x86-64之前开始工作。我有以下代码:

__asm__ __volatile__("lidtl (%0)" : : "r" (&idt_reg));
Run Code Online (Sandbox Code Playgroud)

哪里&idtreg是对结构的引用。用GCC进行编译会给我这个错误:

'lidt'的无效指令后缀

当我添加$令牌时:

__asm__ __volatile__("lidtl $(%0)" : : "r" (&idt_reg));
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

非法的立即寄存器操作数(%rax)

为什么会出现此问题,我该如何解决?

assembly gcc x86-64 inline-assembly osdev

1
推荐指数
1
解决办法
141
查看次数

为什么在这段汇编代码中调用“ pop”会导致分段错误?

我在Mac OS上玩x86-64程序集(使用NASM 2.09和2.13,以捕获由NASM问题引起的错误)。我目前正在尝试实现函数调用,并尝试使用pushpop指令,但pop始终似乎会导致段错误:

line 10: 41072 Segmentation fault: 11 ./result

我尝试手动调整rsprbp等等,但这pop似乎是问题所在。任何帮助,将不胜感激!

section .data

default rel
global start
section .text

start:
    mov r12, 4
    push r12
    call label_0_print_digit
    (some stuff to exit program)

label_0_print_digit:
    pop r12
    (some stuff to print the digit - the issue persists even without this)
    ret 
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 nasm

1
推荐指数
1
解决办法
61
查看次数