1、x86寄存器
x86的通用寄存器有 eax, ebx, ecx, edx ,edi, esi,有些指令规定只能使用其中的某个寄存器,如除法指令idivl要求被除数在 eax寄存器中,edx寄存器为0,而除数寄存器可以为任意寄存器,计算结果必须保存在 eax寄存器中,余数保存在edx寄存器中
x86的特殊寄存器有ebp, esp, eip, eflags ;eip是程序计数器,相当于PC寄存器,eflags保存着计算过程中产生的标志位,ebp和esp用于维护函数调用的栈帧
2、第二个汇编程序
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
.section .text
.globl _start
_start:
movl $0, %edi
movl data_items(,%edi,4), %eax
movl %eax, %ebx
start_loop:
cmpl $0, %eax
je loop_exit
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
程序解析:
/******************************************************************************************************************
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
.long指示声明一组数,每个数占32位,相当于C语言中的数组。数组开头定义了一个符号data_items,汇编器会把数组的首地址作为data_items符号所代表的地址,data_items相当于数组名,除了 .long外常用的数组名还有:
.byte :也是声明一组数,每个数占8位
.ascii:如 .ascii "hello world"声明11个数,取值为相应的ASCII码,这样声明的字符串末尾是没有'\0'字符的
movl data_items(,%edi,4), %eax
这条指令把数组data_items的第0个元素传递给 %eax,data_items是数组的首地址,edi的值是数组的下标,4表示数组的元素占4个字节,那么数组中的第 edi个元素地址应该是 data_items + edi * 4,写在指令中就是movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop
将eax和ebx比较,如果 eax <= ebx则跳转
******************************************************************************************************************/
3、寻址方式
直接寻址: movl ADDRESS, %eax把ADDRESS地址处的32位数传送到eax寄存器
变址寻址: movl data_items(,%edi,4)
基址寻址: movl 4(%eax), %ebx用于访问结构体成员,如一个结构体的基地址保存在eax寄存器中,其中一个成员在结构体内的
偏移量是4字节,要把这个成员读上来就可以使用这条指令
立即数寻址: movl $12 , %eax