现在的位置: 首页 > 综合 > 正文

linux汇编必读

2018年01月24日 ⁄ 综合 ⁄ 共 2902字 ⁄ 字号 评论关闭

 

linux汇编必读

                                      

 

个人认为程序就是用来处理数据的,所以最要紧的是解决输入与输出的问题,
还有一个要紧的问题就是我们能在屏幕上看到输出结果,
下面我说说我在看linux下面汇编
的时候的一些感想,以及linux下面汇编和dos下面的个人认为的最主要的不同,
在dos下面主要就是调用dos中断和bios中断
比如返回系统是
mov ah,4ch
int 21h
等待输入是
mov ah,1
int 21h
输入到al
输出到显示器是
mov ah,2
int 21h
是把dl输出
这些数据从哪里来,到哪里去,大家一定要搞清楚呀,
上面的都是dos中断,当然你也可以调用bios中断

但是在linux下面是不行的,linux没有dos中断,也不利用bios,linux的所有驱动都是由

系统人员自己从头开始写的,并不利用bios里面的驱动,好了又要说说bios,叫做基本

的输入输出系统 basic input out put system,里面有一些最基本的驱动,不过这些

都是dos以前的功能,后来直接做到bios里面了,所以对linux没有用处的,linux系统启动
以后
会初始化中断向量表,用的都是linux系统自己的中断处理程序,linux系统用的只是bios
里面
很少很少的一部分功能,就是bios的硬件检测功能,比如bios检测到内存的大小是多少

然后传递给内核,然后内核创建页面文件,

好了说了linux既不能调用bios中断,也不能调用dos中断,linux用的是什么呢?
linux用的是系统调用,也就是system calls,就是这样的工作过程,比如退出程序返回系

的系统调用号是1,那么把1存到规定的寄存器里面,然后下面就是呼叫内核进行系统调用,
这个
需要int 0x80,这个就是叫内核处理这个系统调用,我看linux似乎只需要这么一个int 0
x80
系统调用号有好几百个,都定义在/usr/include/asm/unistd.h这个文件里面
好了说了这么多,大家还是不知道怎么进行系统调用,
我在网上搜了一个例子,对大家肯定会很有帮助的,例子如下
http://turing.une.edu.au/~comp283/prac/pracL/pracL.html

这篇文章大家要好好看呀:)
需要注意的是sys_read,sys_write,sys_exit是怎么调用的,
先把系统调用好存在哪个寄存器里面的,
读和写的时候先要进行些什么准备,读到哪个寄存器的,读多少,写到哪个寄存器的,写多少
大家可以到上面我给的那个网址去看看,其他的几个程序,
-------------------------------------------------------------------------
;constants
section .bss ;uninitialized data section
;no uninitialized data in this
;program
section .data ;initialized data section

msg db Hello, world! ,0xa ;our dear string
len equ $ - msg ;length of our dear string

section .text ;program section
global _start ;must be declared for linker (ld)

_start: ;tell linker entry point

mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

rawmode ;place the keyboard in raw mode
mov edx,2 ;message length
mov ecx,msg ;message to read
mov edx,2 ;message length
mov ecx,msg ;message to read
mov ebx,0 ;file descriptor (stdin)
mov eax,3 ;system call number (sys_read)
int 0x80 ;call kernel

mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel

--------------------------------------------------------------------------
基本上这一个程序就把三个系统调用都给出来了,大家可以看看,注释非常的详细,我就
不多说了
至于如何编汇编程序,我还是要简单的说说,免得大家去看前面的那些冗长的手册
先是编译器的选择,有很多汇编编译器,大家看前面的手册就知道了,推荐windows用户使
用nasm
主要是语法跟windows下面是一样的,这样的话,大家不需要又了解linux汇编是如何工作
的,
又还要去对比两者的语法不同,刚转过来的人同时应付这些问题会很头大的,我茫然的好
长时间
现在也只是给大家指路,
好了,我只说说最常用的吧
首先是编辑程序,用任何文本编辑器都是可以的,因为编辑的是文本文件,
我再说说如何编译程序,好多人用VC弄来很很多坏习惯,都不知道程序是怎么出来的,

首先我们需要编辑程序,就是进行编码工作,这个用任何的文本编辑器都是可以的,
然后就是编译程序,
然后是链接,
最后是执行,
可惜VC这些集成的开发环境把所有的事情都自己做了,大家都不太清楚实质
按照上面的步骤,
我们先是编代码,用vi就可以,当然也也可以用其他的任何文本编辑器,不过不要用offi
ce什么的
然后是用编译器来编译它,假设我们上面编辑的文件叫hello.asm
我们需要执行
nasm -f elf hello.asm
说明一下,elf是一种更优秀的二进制格式,这个这么说大家还是不明白,
需要了解的可以到CU搜一篇叫从程序员角度看elf,非常详细
好了,上面操作以后生成一个文件叫hello.o,如果你不指定elf的话生成的是另外的格式

可以用objdump看看
好了下面是,用链接器来链接
ld -o hello hello.o
这样就可以了,
会生成一个hello的二进制文件,大家可以
file hello,可以看见文件类型
或者objdump -s hllo可以看见二进制文件的详细信息
好了,最后是执行,
./hello
就可以了

上面的都是我个人的理解,如果有不对的,真诚的欢迎大家批评与指正

另外推荐大家看看nasm中文手册,另外就是官方的那个手册,baidu上面很容易搜到的
中文手册和官方的比,上了附录B,很长一段内容都没有,可能也是比较重要的,

 

抱歉!评论已关闭.