gpt4 book ai didi

linux - 在 Linux 中获取数据段的结尾

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:05 26 4
gpt4 key购买 nike

我正在尝试在汇编中构建一个 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

内存.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

最佳答案

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

关于linux - 在 Linux 中获取数据段的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49600812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com