<small id='ixOpka'></small> <noframes id='qHamK9o'>

  • <tfoot id='zc7RA'></tfoot>

      <legend id='1lN6beCr'><style id='8hrHg9y'><dir id='Q0cKlF2zU'><q id='embsWxU'></q></dir></style></legend>
      <i id='TlA7SW6'><tr id='yoGV'><dt id='jktIl9yW2G'><q id='5P1ejkWNQ'><span id='fYZS8lp'><b id='nJYdcAT'><form id='TQDmHESp'><ins id='iM1n0tFJvb'></ins><ul id='xO4dtNKE'></ul><sub id='jWR4fC9'></sub></form><legend id='zGyE'></legend><bdo id='b1snSzHUrJ'><pre id='6DYlsKI3wy'><center id='Pt2E'></center></pre></bdo></b><th id='yIosiqnH'></th></span></q></dt></tr></i><div id='fs0UuK'><tfoot id='DLPJCsz'></tfoot><dl id='OnsefGq'><fieldset id='tKPS'></fieldset></dl></div>

          <bdo id='PJYp'></bdo><ul id='inNJPykf3'></ul>

          1. <li id='RHVnK2bULx'></li>
            登陆

            用汇编语言诠释Linux的简略之美

            admin 2019-05-17 248人围观 ,发现0个评论

            体系接口

            关于底层调用,话说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
            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用汇编语言诠释Linux的简略之美 elf main.asm
            ld main.o

            运转,段转储过错,查了一下,本猫用的是x64位的linux,所以要生成

            x64位的程序,或许指明是x86的程序,我挑选后者:

            ld 用汇编语言诠释Linux的简略之美-m elf_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 用汇编语言诠释Linux的简略之美exit

            msg:
            db "happy xxx day!",0

            以上代码功用很简略,从10倒数到0,然后打印一行,最终完毕.与之前代码不同的是其间

            调用了C规范库中的函数.编译和曾经相同:

            nasm -e elf main.asm

            咱们看看怎样衔接:

            gcc -m32 -o mai用汇编语言诠释Linux的简略之美n main.o

            好了!运转正常!

            值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,假如开端用

            ld -m elf_i386 -lc -o main main.o

            的方法,首先会提示找不到c库,这能够进入/usr/lib,然后运用

            sudo ln -sv /lib用汇编语言诠释Linux的简略之美/i386-linux-gun/libc.so.6 libc.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:i386 gcc-4.6-base:i386 
            libstdc++5:i386 libstdc++6:i386
            sudo apt-get install libc6-i386

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

            这时改成如下即可:

            gcc -D_GNU_SOURCE -std=c99 ma用汇编语言诠释Linux的简略之美in.c

            回到体系调用

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

            明显能够!

            section .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 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下开发几乎太美好了!!!

            感谢欣赏 ;)

          2. 张艺谋又得一女神,既年轻又漂亮,她不红都不行
          3. 章鱼彩票app下载安装-原创在天庭没打败孙悟空的哪吒这回在电影上赢了!国漫的夏天如同来了
          4. 原创年纪、阅历便是对自己不断的改写,要坚持自己的人生格式
          5. 请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP