我正在尝试在程序集中构建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
答案 0 :(得分:0)
链接器在链接时创建指向数据段末尾的符号2018/03/411aa377c0e092ce.html
。您可以使用此符号查找数据段的末尾。
答案 1 :(得分:0)
brk
分配的区域与可执行文件的数据段不连续,除非禁用地址空间布局随机化。
要查找此区域的当前结束,请使用参数0调用brk
。在程序启动时,大小为零,因此结束地址与起始地址相同。