Memory 从内存地址加载时X86_64程序集未返回正确的值

Memory 从内存地址加载时X86_64程序集未返回正确的值,memory,assembly,load,x86-64,cpu-registers,Memory,Assembly,Load,X86 64,Cpu Registers,我是X86_64汇编的新手,我正在尝试实现一个brk内存管理程序,但我在一些代码行中遇到了一些问题 .数据部分: .section .data heap_start: .double 0 .equ HDR_AVAIL_OFFSET, 0 .equ HDR_SIZE_OFFSET,4 .equ UNAVAILABLE, 0 .equ AVAILABLE, 1 正文部分与问题相关: .text alloc: movq heap_start, %rdx loop: movq HD

我是X86_64汇编的新手,我正在尝试实现一个brk内存管理程序,但我在一些代码行中遇到了一些问题

.数据部分:

.section .data

heap_start: .double 0

.equ HDR_AVAIL_OFFSET, 0
.equ HDR_SIZE_OFFSET,4
.equ UNAVAILABLE, 0
.equ AVAILABLE, 1
正文部分与问题相关:

.text
alloc:
    movq heap_start, %rdx
loop:
    movq HDR_AVAIL_OFFSET(%rdx), %rcx
    cmpq $UNAVAILABLE, %rcx
    jne found_space
loop2:
    movq HDR_PROX(%rdx), %rdx
    cmpq %rdx, heap_start
    jne loop
    jmp new_brk
found_space:

    cmpq HDR_SIZE_OFFSET(%rdx), %rdi
    jg loop2
问题是,HDR\u AVAIL\u偏移量(%rdx)应该在堆开始时加载0寻址的内容。但是,它正在将一个完全不同的内存地址返回到%rcx中

heap_start指向我要检查的内存数组的开始,第一个元素是0。 当我使用x/nfu检查gdb上的内存时,它显示如下:

(gdb) x/nfu $rdx
0x602001:  0
但之后

movq HDR_AVAIL_OFFSET(%rdx), %rcx
%rcx是:

(gdb) print $rcx
$1 = 429496729600
谁能告诉我我做错了什么?
谢谢。

您使用的数据是32位,如偏移量为4字节所示,但您将以64位访问它。如果以十六进制打印429496729600,将得到0x6400000000,这表明低位32位都是0

要解决此问题,请将数据字段更改为64位宽,或更改为32位访问,方法是在处理数据时,将
q
后缀更改为
l
s,并将寄存器更改为以
e
开头,而不是以
r
开头:

.text
alloc:
    movq heap_start, %rdx               # Address, 64 bits
loop:
    movl HDR_AVAIL_OFFSET(%rdx), %ecx   # Data, 32 bits
    cmpl $UNAVAILABLE, %ecx             # Data
    jne found_space
loop2:
    movq HDR_PROX(%rdx), %rdx           # Address
    cmpq %rdx, heap_start               # Address
    jne loop
    jmp new_brk
found_space:
    cmpl HDR_SIZE_OFFSET(%rdx), %edi    # Data
    jg loop2