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
变量,它的地址是有效的,您可以使用它。