体系接口
关于底层调用,话说windows也有syscall,这是有必要的。但是Windows的syscall能够直接call吗?
能够是能够,但是花费曲折,山小桔搞成SDT之类的杂乱概念。下面看看linux是怎样做的吧。
section .data
msg光猫 db "hello hopy!",0x0a
section .text
global _start
_start:
mov eax,4
mov ebx,1
m打火机ov ecx,ms蚊子和狮子g
mov edx,12
int 0x80
uglymov eax,1
mov ebx,0
int 0x80
直接用int堕入!!!
关键是体系调用号要知道,开端本猫找的是u抗日之血染大地sr/include/asm-gen*/unistd.h,
但是都不对。后免费色情来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,
有2个,别离痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷对应x86和x64.、编译衔接指令如下:
nasm -f elf main.asm
ld main.o
运转,段转储过错,查了一下,本猫用的是x64位的linux,所以要生成
x64位的程序,或许指明是x86的程序,我挑选后者:
ld -m elf_i38痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷6 -o main main.o
哦鸟!
体系接口 V痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷S C规范库
上面咱们看到了怎样仅仅用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
痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷call sleep
cmp edi,0
jnz again
push msg
call puts
push 0
call exit
msg:
db "happy xxx day!",0
以上代码功用很简略,从10倒数到0,然后打印一行,最终完毕.与之前代码不同的是其间
调用了C规范库中的函数.编译和曾经相同:
nasm -e elf main.asm
咱们看看怎样衔接:
gcc -m32 -o main main.o
好了!运转正常!
值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,假如开端用
ld -m elf_i386 -lc -o main main.o
的方法,首先会提示找不到c库,这能够进入/usr/lib,然后运用
sudo ln -sv /lib/i386-痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷linux-gun/libc.so痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷.6 libc.so
创立软衔接处理.
但在运转时提示无法找到可执行文件!该文件分明在的呀?
咱们换为用gcc来衔接,但要将_start改为main,还要装载32库
sudo apt-get install ia32-libs
还会提示找不到h文件,这时再装载库
sudo apt-get 贝韦伦兔install g++-mul异曲同工tilib
还周贷宝有2族库,如有必要也可加载:
sudo apt-get卖媳妇图片 install libc6:i386 libgcc1:i386 gcc-4.6-核算base:i386
libstdc++5:i386 痞子英豪,用汇编语言诠释Linux的简略之美,化龙巷libstdc++6:i386
sudo apt-get install libc6-i386
最终要说的是,一些C代码在用std=c99编译时会发现提示无法获洗铜水取结构巨细,
这惊天动地时改成如下即可郑裕玲:
gcc -D_GNU_87版红楼梦SOURCE -std=c99 main.c
回到体系调用
之前咱们测验运用了C库的函数完结功用,那么能不能用syscall方法来搞呢?
明显能够!
section .data
ft db "no崔雨墨w is X",10
section .text
global _start
_start:
mov edi,10
again:
dec edi
mov eax,edi
add eax,0x已婚妇女30
mov byte [ft+7],al
mov eax,4
mov ebx,1
mov ecx,ft
mov edx,9
int 0x80
mov eax,162
push 0
push 1
mov ebx,esp
mov ecx,0
int 0x80
cmp edi,0
jnz again
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,15
int 0x80
mov eax,1
mov ebx,0
int 0x80
msg:
db "happy xxx day!",10
nasm -f elf main.asm
ld -m elf_i386 -o main main.o
在代码中延时运用的是nanosleep,其他和第一篇共同,只不过做了一个bin->ascii的小转化.
总结
咱们经过以上几个比如能够看到在Linux下调用体系底层接口是多么的垂手可得,假如不信,请逆向Windows中相同功用的代码,你会觉得在Linux下开发几乎太美好了!!!
感谢欣赏 ;)