orange's学习--汇编学习

版权声明:原创作者:http://blog.csdn.net/port23 。 欢迎讨论转载,请注明来源: https://blog.csdn.net/port23/article/details/87358175

参考:http://www.360doc.com/content/14/0118/10/839052_346133911.shtml

linux几乎总是默认安装as和gas作为默认的汇编程序编译器,然而,我们这里使用的NASM,采用intel语法,类似于TASM、MASM和其它的DOS汇编工具。
(as和gas采用AT&T语法,与intel语法有些不同,例如AT&T语法中,寄存器前面必须加上%前缀,并且源源操作数在目的操作数之前,详细请看附录C:参考:用AS和AT&T语法,或者看我另外一篇关于AT&T的汇编入门文章)


DOS和Linux汇编主要不同的地方  
DOS汇编中,大部分工作依靠21号中断(int 21h)来完成,并且BIOS服务中断用int 10h和int 16h,
在linux中,所有的函数通过linux系统调用最终被内核处理,并且通过int 80h陷入内核代替用户空间执行,这称为linux的软中断。
(关于软中断,这里不细讲,我以后会专门写篇文章来结合x86的流水线和地址空间来讲解linux的异常中断的细节,
软中断是用户合法进入内核的唯一方式,流水线通过执行int指令,跳转到中断向量表,查找中断号80h,执行中断服务程序ISR,来陷入内核空间开始)。

一件更令人高兴的事,linux的系统调用比DOS更少但更实用。linux是一个32位保护模式编程系统,
因此使得我们能处理真正的现代的32位汇编,32位代码运行在flat(平板)内存模型,其基本意思就是你根本不用再担心段寄存器的处理,因为你不必用段地址来重写或者修改段寄存器,它的每个地址都是32位长,并包含一个偏移量(这里暂时不必去深入理解,只需要记住它就行了)  x86的32位汇编代码中,你可以使用32位寄存器如eax,ebx,ecx,edx等等,来代替16寄存器ax,bx,cx,dx等等。  DOS的16编程时代已经过时了,只有一些不舍得扔下386编程的一些老的黑客仍在用它,linux汇编更实用。
(linux操作系统一部分由汇编代码编写,并且硬件驱动也常常离不开汇编代码,因为他是最靠近硬件的语言)


一个汇编程序的组成  一个简单的汇编代码通常分成下面三个节:  
.data section(节)  这个section主要存放初始化的数据,.data section包含例如像文件名、缓冲大小,并且还可以用EQU定义常量(constant),可以使用的一些指令如:DB,DW,DD,DQ,DT  
例:
section .data  
message:  db ‘Hello world!’ ; 
msglength:  equ 12   ; 
buffersize:    dw 1024    ;缓冲区大小1024个字长(相当于short类型) 

.bss section(节)  ;未初始化section  ;这个section存放未初始化数据,可以用RESB,RESW,RESD,RESQ和REST指令来为你的变量申请为初始化空间。  
例:
section .bss 
filename: resb 255  ;255字节  
number: resb 1  
bignum: resw 1 
realarray: resq 10  

.text section(节) ;代码section  这个section用于存放用户代码,.text section必须从global _start开始,来告诉内核程序从什么地方开始执行(类似于C或JAVA中的main函数,这里指一个开始位置)  
例:
section .text  
global _start  
_start:   
pop ebx   ;这里是程序实际开始的地方 


旁注:在编译器编译并链接生成可执行文件的过程中,会出现两次section的概念,
一个是在生成目标文件,通常是我们所说的.o文件,目标文件也是由多个section组成,我们通常叫这个section为节,这里的每个section的地址是静态偏移地址,是基于0的偏移地址,
而在我们链接多个目标文件(.o)及库(静态库和动态库,关于这两者,详细请看ld手册,我也会在后面的文章讲解ld的一些基础知识)时,实际上是经过ld链接脚本的处理并进行重定位之后,
把每个目标文件中的各个section 放到可执行文件的一个section中,这个section我们通常叫它段(例如.text节重定位之后生成.text段,.data节重定位生成.data段等等),详细请参考ld manual  

汇编语言中各寄存器的作用  参考http://www.360doc.com/content/14/0104/10/839052_342506302.shtml
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)


 

猜你喜欢

转载自blog.csdn.net/port23/article/details/87358175