在Linux中汇编数据段结束

时间:2018-04-01 17:35:39

标签: linux ubuntu assembly

我正在尝试在程序集中构建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

mem.asm

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

2 个答案:

答案 0 :(得分:0)

链接器在链接时创建指向数据段末尾的符号2018/03/411aa377c0e092ce.html。您可以使用此符号查找数据段的末尾。

答案 1 :(得分:0)

brk分配的区域与可执行文件的数据段不连续,除非禁用地址空间布局随机化。

要查找此区域的当前结束,请使用参数0调用brk。在程序启动时,大小为零,因此结束地址与起始地址相同。