2013-03-12 29 views
0

我是新的X86_64大会,我试图实现一个brk内存管理程序,但我有一些代码行的问题。X86_64大会从内存加载时不返回正确的值地址

。数据部分:

.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_AVAIL_OFFSET(%RDX)应加载由0上heap_start解决的内容。但是,它将一个完全不同的内存地址返回到%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 

可以在你告诉我我做错了什么? 谢谢。

回答

0

您使用的数据是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 
+0

它的工作!谢谢! :) – 2013-03-12 03:02:02

相关问题