我在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显示在int 0x80之后只有eax被修改。我再次陷入困境。它迟到了,我明天再看看它。
答案 0 :(得分:2)
一个变化,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