痞子英雄,用汇编语言诠释Linux的简略之美,化龙巷

频道:社会万象 日期: 浏览:488

体系接口

关于底层调用,话说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下开发几乎太美好了!!!

感谢欣赏 ;)

热门
最新
推荐
标签