Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Assembly 如何使用内存位置?_Assembly_X86 64_Gnu Assembler - Fatal编程技术网

Assembly 如何使用内存位置?

Assembly 如何使用内存位置?,assembly,x86-64,gnu-assembler,Assembly,X86 64,Gnu Assembler,例如,我编写了一个代码 .global _start .data str: .long 0x1 .text _start: mov $1, %rax # system call 1 is write mov $0x21, %rdx mov %rdx, 4(%rax) mov $60, %rax # system call 60 is exit xor %rdi, %rdi # we want return code

例如,我编写了一个代码

.global _start
.data
str:
    .long 0x1
.text
_start:
  mov  $1, %rax         # system call 1 is write
  mov  $0x21, %rdx
  mov  %rdx, 4(%rax)

  mov  $60, %rax        # system call 60 is exit
  xor  %rdi, %rdi       # we want return code 0
  syscall               # invoke operating system to exit

为什么我会收到分割错误?何时使用内存位置?如何使用内存位置?

您正在尝试将rdx中的值写入内存位置5。(rax+4,rax被初始化为1)

你是在真正的计算机上还是在模拟器上运行这个程序

如果您在计算机上运行它,不能只写入任意内存位置。操作系统为进程分配一定数量的内存,如果进程试图访问超出此范围的内存,则可能导致分段错误

如果你在模拟器上运行它,并且没有操作系统,那也没关系。 如果要写入内存,请在数据段中声明一个变量,如下所示:

.data
myvar:
    .long 0x1
.text
_start:
  #....
  mov  %rdx, myvar
  #...

使用什么内存位置?现在看起来您正试图写入地址5(4+1),该地址可能未映射到您的进程。使用内存位置意味着什么?您的问题没有多大意义。是您定义何时使用内存位置,为什么要问我们?另外,您所说的
内存位置是指什么?看起来你需要澄清你的问题。如果这是一个问题,您可能需要有人帮助您学习英语。但是您访问内存的唯一位置是
mov%rdx,4(%rax)
,而rax是1,因此您尝试将0x21(8字节)写入地址5处的内存。Michael已经指出5不太可能是有效地址。为什么使用5?通常,您定义变量,然后使用它们的地址,或者从其他地方接收有效地址(例如,从C的
malloc()
)。您定义了
str
变量,它的地址是有效的,您可以使用它。