gpt4 book ai didi

linux - 在 linux x86 上使用 int 0x80 在 nasm 中进行 mmap

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:56 25 4
gpt4 key购买 nike

我正在用 nasm 为 linux 编写一个小型库,我正在实现 malloc atm。

代码的 C 表示看起来像

void * malloc(int size) {
return mmap(0, size, 3, 34, -1, 0);
}

现在我必须将其转换为程序集,但我无法加载参数。

mov eax, 90
; load args (help)
int 0x80
; move adress to eax

我想知道如何将 C 代码转换为 asm。在大多数情况下,系统调用的参数映射顺序与汇编中的顺序相同,但 mmap 需要 6 个参数,而内核最多需要 5 个参数。

我还想知道返回值存储在哪里。

那么,我该如何实现呢。

更新:

代码:

section .data
mmap_arg: ; ugly
.addr: dq 0
.len: dq 512
.prot: dq 3
.flags: dq 34
.fd: dq -1
.offset: dq 0

mmap_test:
mov eax, 90
mov ebx, mmap_arg
int 0x80

它似乎可以正常工作,但是当我在 eax 的地址加载某些内容时,出现段错误。当我用 ebx 替换 eax 时,它运行时没有错误。 谁能确认返回地址在ebx中,或者我在使用ebx时写在.data部分。

Gdb 显示只有 eax 在 int 0x80 之后被修改。我又卡住了。时间不早了,明天再看看。

最佳答案

一个变化,args 定义必须是 dd,而不是 ia32 上的 dq。下面的 mallocSample 函数会将最近分配的内存返回到 eax 中。

        global  main
extern printf

section .data
mmap_arg: ; ugly
.addr: dd 0
.len: dd 512
.prot: dd 3
.flags: dd 34
.fd: dd -1
.offset: dd 0

section .text

mallocSample:
;old_mmap
mov eax, 90
lea ebx, [mmap_arg]

int $80

ret

main:
;malloc sample
call mallocSample
push eax
push message
call printf
add esp, 8
ret
message:
db 'our malloc gives address: 0x%x', 10, 0

关于linux - 在 linux x86 上使用 int 0x80 在 nasm 中进行 mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379451/

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