当我运行以下代码时出现分段错误...
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)
这有什么不对?
在运行期间,如何获取寄存器fs中的值并在"call*fs:0x334"中计算目标函数的地址?我可以使用什么样的x86组件?
我有一个向量,我保持递增数据.通常,向量的每个元素都是64位长的变量.然而,很可能两个连续元素之间的差异非常小,因此例如我们可以具有如下序列.
1, 34, 37, 42, 45, 1098, 1200, 1211, 1938
Run Code Online (Sandbox Code Playgroud)
压缩此数据的最佳方法是什么?保持差异是理想的,并且有一个标题字节来定义差异有多大,是否只是一个字节,字,双字等,还是有更好的方法来压缩这些增量数据?
我需要在线压缩,即将数据放入向量中.您可以假设动态扩展矢量.
我想用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?我究竟做错了什么?
对不起,我不太喜欢S/O和asm的全新内容.
我一直在阅读英特尔,Amd和nasm文档,ref.x86asm.net,sandpile.org和wiki.osdev.org.
我不太欣赏的一件事是:
对不起,如果这真的很明显......
我想了解汇编代码.我被困在指定指针的部分和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) 我写:
mov 60, %rax
Run Code Online (Sandbox Code Playgroud)
GNU as接受了它,虽然我应该写
mov $60, %rax
Run Code Online (Sandbox Code Playgroud)
这两个电话之间有什么区别吗?
我在寻找一个POSIX外壳/ bash命令来确定OS架构386,amd64,arm,或arm64?
我试图从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)
为什么会出现此问题,我该如何解决?
我在Mac OS上玩x86-64程序集(使用NASM 2.09和2.13,以捕获由NASM问题引起的错误)。我目前正在尝试实现函数调用,并尝试使用push和pop指令,但pop始终似乎会导致段错误:
line 10: 41072 Segmentation fault: 11 ./result
我尝试手动调整rsp,rbp等等,但这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)