2009年(49)
分类: LINUX
2009-05-25 12:16:34
附录:陈莉君老师关于基本硬件和汇编语言方面的讲解
段的基地址(base address)
段的界限(limit)
段的属性(attribute)
描述符的概念 descriptor
描述符是一个8个字节的存储单元。里面有段的基地址,界限,还有存取权属性
描述符表 table
GDT IDT LDT等
所有的描述符表都占用8个字节倍数的空间。最多到64K字节。IDT最多只有(256×8)的空间。
段选择符 selector
因为现在的段地址都是32位,所以引入selector
16位段寄存器有13位是索引位,用来在GDT中找到效应的描述符。
AT&T 汇编语言
前缀:寄存器前面用%,立即数用$
基寄存器用[ ],例如:movl 5 (%ebx),%eax
Intel 里面: mov eax,[ebx+5]
间接寻址:
Intel里面用的 segreg:[base+index*scale+disp]
AT&T里面 %segreg:disp (base,index, scale)
这种寻址方式常常用在访问数据结构数组中某个特定元素内的一个字段,其中,base为数组的其实地址,scale为每个数组元素的大小,index为下标。如果数组元素还是一个结构,则disp为具体字段在结构中的位移。
在linux中.s文件是纯汇编语言。
汇编程序GAS(GNU Assembly)和连接程序ld,或者使用gcc
AT&T中的节(section)
一个节由.section关键词来标识,至少需要下面三个节。
section.data:这个节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如:
hello:.string “Hello world!\n”
hello_len : .long 13
.section.bss:这个节包含程序还未初始化的数据,也就是说,包含没有初值的哪些变量。当操作系统装入这个程序时,将这些变量都置为0,例如:
Name: .fill 30
Name_len: .long 0
当程序被装入时,name和name_len都被置为0.
使用.bss比使用.data的优势在于,.bss节不占用磁盘的空间。在磁盘上,一个长整数就足以存放.bss节。当程序被装入到内存时,操作系统也只分配这个节4个字节的内存大小。
注意,编译程序把.data和.bss在4字节上对其(align),例如,.data总共有34个字节,那么编译程序把它对齐在36个字节,也就是实际给他36字节的空间。
section.text:这个节包含程序的代码,它是只读节,而.data和.bss是读/写节。
汇编程序指令(Assembler Directive)
1. .ascii”string”…
.ascii表示0个或者多个字符串,并把每个字符串(结尾不自动加0字节)中的字符放在连续的地址单元。
加0的为.ascic
2. .byte表达式 0或者多个表达式,每个表达式被放在下一个字节单元。
3. .fill表达式
.fill repeat,size,value
含义是反复拷贝size个字节,repeat>=0,size也可以是>=0,但不能超过8,
4. .global symbol
使连接程序(ld)能够看到symbl,.globl SYMBOL_NAME(idt)
5. .quad bignums
表示0个或多个bignums,对于每个bignum,其缺省值是8字节整数。