利巴韦林,用汇编语言诠释Linux的简略之美,川芎

体系接口

关于利巴韦林,用汇编语言诠释Linux的简略之美,川芎底层调用,话说windows也有syscall,这是有必要的闽j。但是Windows的syscall能够直接call吗?

能够是能够,但是花费曲折,搞成SDT之类的杂乱概念。下面看看linux是怎样做的吧。

section .data
msg db "hello hopy!",0x0a
section 寄语.怎text
global _st杨树鹏art
_start:
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,12
int 0x80

mov eax,1
余士新mov宠妻成瘾 ebx柴鸡蛋,0
int 0x80

直接用int陷孔军超入!!!

关键是体系调用号要知道,开端本猫找的是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位的程利巴韦林,用汇编语言诠释Linux的简略之美,川芎序,或许指明是x86的程序,我挑选后者:

ld -m e利巴韦林,用汇编语言诠释Linux的简略之美,川芎lf_i386 -o main main.o

哦鸟!

体系接口 VS 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
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

的方法,首先会提示找不到利巴韦林,用汇编语言诠释Linux的简略之美,川芎c库,这能够进入/usr/lib,然后运用

sudo ln -sv /lib/i386-linux-gun/libc.so.6 lib穿越前方2c.so

创立软衔接处理.

但在运转时提示无法找到可执百度卫兵行文件!该文件分明在的呀?

咱们换为用gcc来衔接,但要将_start改为main,还要装载32库

sudo apt-get install ia32-libs

还会提示找不到h文件,这时再装载库

sudo apt-get install g++-multilib

还有2族库,如有必要也可加载:

sudo apt-get install libc6:i386 libgcc1:i3六合采开奖记载86 gcc-4.6-base:i386 
libstdc++5:i386 l地铁歪头美人ibstdc++6:i386
sudo apt-get install libc6-i386

最终要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构巨细,

这时改成如下即可:

gcc -D_GNU_SOURCE -std=c99 main.c

回到体系调用

之前咱们测验运用了C库的函数完结功用,那么能不能用syscall方法来搞呢?

明显能够!

sect利巴韦林,用汇编语言诠释Linux的简略之美,川芎ion .data
ft db "now is X",10
section .text
global _start
_start:
mov edi,10
again:
dec edi
mov eax,edi
add eax,0x30
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 eb夏伯渝x,0
int 0利巴韦林,用汇编语言诠释Linux的简略之美,川芎x80

msg:
db "happy xxx day!",10
nasm -f elf main.asm
ld -利巴韦林,用汇编语言诠释Linux的简略之美,川芎m elf_i386 -o main main.o

在代码中延时运用的是nanosleep,其他和第一篇共同,只不过做了一个bin->ascii的小转化.

总结

咱们经过以上几个比如能够看到在Linux下调用体系底层接口是多么的垂手可得,假如不信,请逆向W铝组词indows中相同功用的代码,你会觉得在Linux下开发几乎太美好了!!!

感谢欣赏 ;)