我试图在程序集中构建一个malloc函数。我的计划是使用brk系统调用,但是为了做到这一点,我需要知道当前段的结尾在哪里。在C语言中,我可以使用sbrk(0),但这在汇编中不可用。除了在底部加上一个标签之外,是否还有其他方法可以得到数据段的结尾。
我正在使用ubuntu、nasm和ld,如果有帮助的话。
我正在组装和连接:

nasm -f elf64 mem.s -o mem.o
ld -m elf_x86_64 -o mem mem.o -e _start

记忆
global _start
%include "stdasm.s"
section .text
_start:
    mov rax, 1
    mov rbx, str
    call print
    mov rax, 0x0123456789ABCDEF
    call regPrint
    mov rax, end
    call regPrint
    mov rax, _end
    call regPrint
    call exit
section .data
str: db 'Hello, world!',0x0A,0
end:

stdasm.s.公司
section .text
exit:
    mov rax, 1
    mov rbx, 0
    int 0x80
print:;rax = fd, rbx = string
    push rdx
    push rcx
    mov rcx, rbx
    mov rbx, rax
    .loop:
    cmp byte [rcx], 0
    je .exit
    mov rdx, 1
    mov rax, 4
    int 0x80
    inc rcx
    jmp .loop
    .exit:
    pop rcx
    pop rdx
    ret
regPrint:
    push rbx
    push rcx
    push rdx
    xor rcx, rcx
    mov rbx, regPrintBuf
    .loop:
    rol rax, 4
    mov dl, al
    and rdx, 0x0F
    add rdx, hexStr
    mov dl, byte [rdx]
    mov byte [rbx], dl
    inc rcx
    inc rbx
    cmp rcx, 16
    jl .loop
    mov rbx, regPrintBuf
    mov rax, 1
    call print
    pop rdx
    pop rcx
    pop rbx
    ret
section .data
hexStr: db '0123456789ABCDEF'
regPrintBuf: db '0000000000000000', 0x0A,0

最佳答案

链接器在链接时创建指向数据段末尾的符号_end。可以使用此符号查找数据段的结尾。

10-08 19:31