Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 如何在不使用程序集(NASM)中的变量的情况下将数据存储在内存中?_Memory Management_Assembly_Nasm - Fatal编程技术网

Memory management 如何在不使用程序集(NASM)中的变量的情况下将数据存储在内存中?

Memory management 如何在不使用程序集(NASM)中的变量的情况下将数据存储在内存中?,memory-management,assembly,nasm,Memory Management,Assembly,Nasm,我在每个网页上都搜索了答案,但似乎找不到。我已经学习了大约2个月的网络范围的汇编语法,我正在试图找到一种在内存中存储数据的方法 我知道系统崩溃: mov,eax 45 保留内存,我有一个保留16kb内存的功能宏: %macro reserve_mem mov eax,45 xor ebx,ebx int 80h add eax,16384 mov ebx,eax mov eax,45 int 80h %endmac

我在每个网页上都搜索了答案,但似乎找不到。我已经学习了大约2个月的网络范围的汇编语法,我正在试图找到一种在内存中存储数据的方法

我知道系统崩溃:

    mov,eax 45
保留内存,我有一个保留16kb内存的功能宏:

    %macro reserve_mem
    mov eax,45
    xor ebx,ebx
    int 80h
    add eax,16384
    mov ebx,eax
    mov eax,45
    int 80h
    %endmacro
我还知道,当您保留字节(resb)时,单词等。在.bss部分中,一小部分内存分配给未初始化的数据

此外,还可以使用0x0000之类的地址访问虚拟内存,然后将其映射到实际内存位置

然而,我的问题是,我试图将数据存储在内存中,但我尝试的一切都以分段错误(内核转储)告终,这是程序试图访问它无法访问的内存。我试过下面这样的代码

     mov [0x0000],eax

谢谢你的帮助。

你似乎误解了虚拟内存的概念。它和电话号码相似,因为你不能用10位数的组合给某人打电话。您只能拨打电话簿上列出的号码。否则,您将听到“对不起,此号码目前已停用”。同样,只有每个进程的页表中列出的虚拟地址(总是由操作系统自动和透明地维护)才是进程访问的有效地址。SEGV是操作系统表示“抱歉,此虚拟地址当前已停止服务”的方式

在代码中,您取消了对
0x0000
的引用,但它是可用虚拟地址的最小可能值之一。您这样做是因为您丢弃了
brk(2)
syscall返回的有效虚拟地址(请仔细阅读
man2brk
,因为原始系统调用的行为与glibc
brk
sbrk
都不同)您的代码将以这种方式转换为C(尽管现在glibc
malloc(3)
通常依赖于
mmap(2)
而不是
brk(2)
):

这显然是错误的,您必须这样做:

void *p = malloc(16384);
int *p0 = (int *)p + 0;
int *p1 = (int *)p + 1;
int eax = ...;
int ebx = ...; /* it's all up to you which register to use */
*p0 = eax;
*p1 = ebx;
reserve_mem  ; IIRC eax now points to the last
mov ecx, eax ; byte of the newly allocated chunk
sub ecx, 16383 ; set p0 (== p)
mov edx, ecx
add edx, 4 ; set p1; 4 is for sizeof(int)
; ... set whatever value to eax ...
; ... set whatever value to ebx ...
mov [ecx], eax ; *p0 = eax;
mov [edx], ebx ; *p1 = ebx;
这应该转化为NASM,如下所示:

void *p = malloc(16384);
int *p0 = (int *)p + 0;
int *p1 = (int *)p + 1;
int eax = ...;
int ebx = ...; /* it's all up to you which register to use */
*p0 = eax;
*p1 = ebx;
reserve_mem  ; IIRC eax now points to the last
mov ecx, eax ; byte of the newly allocated chunk
sub ecx, 16383 ; set p0 (== p)
mov edx, ecx
add edx, 4 ; set p1; 4 is for sizeof(int)
; ... set whatever value to eax ...
; ... set whatever value to ebx ...
mov [ecx], eax ; *p0 = eax;
mov [edx], ebx ; *p1 = ebx;

我在汇编编程方面的知识正在生锈,上面的代码可能包含许多错误。。。但是概念部分不应该如此错误。

为什么
0x0000
?您应该只访问已分配给进程的内存,可以使用
resb
等静态方式,也可以使用
sys\u brk
等动态方式。感谢您的回复,但是是否可以这样做,例如将数字1放入内存?@morgan至少x86支持这样的操作。您熟悉C或其他编程语言吗?你在计算机编程领域有什么经验?我们需要了解您的级别,以便为您提供有效的建议。您希望向哪个内存写入?您用
sys\u brk
分配的块?你不能只写随机地址。nodakai,我15岁,懂java和一点C语言,Michael,是的,如果可能的话,我想写我分配的内存。谢谢你的帮助。谢谢,你和迈克尔扩展了我的知识面,让我可以开始尝试开发更复杂的程序。