【问题标题】:How do you store data in the memory without using a variable within Assembly (NASM)?如何在不使用 Assembly (NASM) 中的变量的情况下将数据存储在内存中?
【发布时间】:2014-08-27 11:11:08
【问题描述】:

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

我知道 sys_break:

    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

感谢您的帮助。

【问题讨论】:

  • 为什么是0x0000?您应该只访问已分配给您的进程的内存,可以使用resb 等静态访问,也可以使用例如动态访问。 sys_brk.
  • 多谢回复,不过能不能这样,比如把数字1放到内存里?
  • @morgan 至少 x86 支持这样的操作。您熟悉 C 或其他编程语言吗?您在计算机编程领域有什么样的经验?我们需要了解您的水平,以便为您提供有效的建议。
  • 你想写入哪个内存?你用sys_brk分配的块?你不能只写随机地址。
  • nodakai,我今年 15 岁,具有 Java 知识和一点 C 知识,还有 Michael,是的,如果可能的话,我想写入我分配的内存。感谢您的帮助。

标签: memory-management assembly nasm


【解决方案1】:

您似乎误解了虚拟内存的概念。它类似于电话号码,因为您不能以每 10 位数字的组合呼叫某人。您只能拨打电话簿中列出的号码。否则,您会听到“抱歉,此号码目前无法使用”。同样,只有在每个进程的页表中列出的那些虚拟地址(总是由操作系统自动和透明地维护)才对进程访问有效。 SEGV 是操作系统表示“抱歉,此虚拟地址当前无法使用”的方式。

在您的代码中,您取消了0x0000 的引用,但它是有效虚拟地址的最不可能的值之一。您最终这样做是因为您丢弃了 brk(2) 系统调用返回的有效虚拟地址(请仔细阅读 man 2 brk,因为原始系统调用的行为与 glibc brksbrk 不同。)您的代码将以这种方式翻译成 C (虽然现在 glibc malloc(3) 经常依赖 mmap(2) 而不是 brk(2)):

void *p = malloc(16384);
int eax = ...;
(void *)0 = eax;

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

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;

应该像这样转换为 NASM:

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;

我的汇编编程知识生锈了,上面的代码可能包含很多错误……但概念部分应该不会错。

【讨论】:

  • 谢谢,你和 michael 扩展了我的知识,让我可以开始尝试开发更复杂的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2018-02-08
  • 2015-12-02
  • 2015-10-10
  • 2014-06-13
相关资源
最近更新 更多