
(一)话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是 可以但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。 - section .data
- msg db "hello hopy!",0x0a
-
- section .text
- global _start
-
- _start:
- mov eax,4
- mov ebx,1
- mov ecx,msg
- mov edx,12
- int 0x80
-
- mov eax,1
- mov ebx,0
- int 0x80
关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h, 可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件, 有2个,分别对应x86和x64.、编译连接指令如下: - nasm -f elf main.asm
- ld main.o
运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成 x64位的程序,或者指明是x86的程序,我选择后者: - ld -m elf_i386 -o main main.o
哦鸟! (二)我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用 C标准库中的函数快速做一些"复杂"的事: - section .data
- ft db "now is %d",10
-
- section .text
- extern puts
- extern exit
- extern sleep
- extern printf
- global main
-
- main:
- mov edi,11
- again:
- dec edi
- push edi
- push ft
- call printf
-
- push 1
- call sleep
-
- cmp edi,0
- jnz again
-
- push msg
- call puts
-
- push 0
- call exit
-
- msg:
- db "happy xxx day!",0
以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中调用了C标准库中的函数.
|