0

X86_64アセンブリを初めて使用し、brkメモリ管理プログラムを実装しようとしていますが、コードの一部の行で問題が発生しています。

.data部分:

.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)がheap_startの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

誰かが私が間違っていることを教えてもらえますか?ありがとうございました。

4

1 に答える 1

0

オフセットが4バイト離れていることからわかるように、使用しているデータは32ビットですが、64ビットとしてアクセスしています。429496729600を16進数で印刷すると、0x6400000000が得られます。これは、下位32ビットがすべて0であることを示しています。

これを修正するには、データフィールドを64ビット幅に変更するか、データを操作するときではなく、qサフィックスをlsに変更し、レジスタを最初に変更して32ビットアクセスに変更します。er

.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
于 2013-03-12T02:41:51.643 に答える