我正在用 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/