5233杨光--第四周实验报告

****Intel处理器系列:

俗称x86,开始时是第一代单芯片、16位微处理器之一。

x86寻址方式有三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式

每个后继处理器的设计都是后向兼容的。

****ISA的定义

ISA即为指令集体系结构,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。

PC寄存器:即程序计数器。指示将要执行的下一条指令在存储器中的地址。

程序计数器(CS:IP)

整数寄存器(AX,BX,CX,DX)

条件码寄存器(OF,SF,ZF,AF,PF,CF)

浮点寄存器

一条机器指令只执行一个非常基本的操作。

 

***P107代码为code.c:

Int accum = 0;

 

Int sum(int x,int y)

{

    Int t = x  + y ;

    Accum +=t;

    Return t;

}

命令行上使用“-S”选项,就能得到C语言编译器产生的汇编代码。在Linux系统中,带“-d”命令行标志的程序OBGDUMP可以充当反汇编器的角色。

gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编,即可查看目标代码文件的内容.
注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c

****数据格式

Intel中:8 位:字节  16位:字   32位:双字   64位:四字

 

C声明 Intel数据类型 汇编代码后缀 字节
char 字节 b 1
short w 2
int 双字 l 4
long int 双字 l 4
long long int ----- - 4
char * 双字 l 4
float 单精度 s 4
double 双精度 l 8
long double 扩展精度 t 10/12

 

****数据传送指令

movb 传送字节

movw 传送字

movl 传送双字


****寄存器

 esi edi可以用来操纵数组

 esp ebp用来操纵栈帧

对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,要理解32位的eax,16位的ax,8位的ah,al都是独立的


*****操作数的三种类型

立即数、寄存器、存储器

 

立即数:即常数值

 

寄存器:表示某个寄存器内容

 

存储器:根据计算出来的地址(通常称有效地址)访问某个存储器位置

 

因此寻址方式也有多种,如:立即数寻址、寄存器寻址、绝对寻址、间接寻址、变址寻址、伸缩化  的变址寻址……

 

有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

 

 ****区分MOV,MOVS,MOVZ三个命令

 

 MOV相当于C语言的赋值”=“

 

 MOVS将作了符号扩展的字节传送到字

 

 MOVZ将作了零扩展的字节传送到字

****算术和逻辑操作

移位操作 :sall==shll(填0)  sarl(算术右移,填符号位)  shrl(逻辑右移,填0)

特殊算术操作:imull(有符号64位乘法)  mull(无符号64位乘法)  cltd(转换为四字) idivl(有符号除法)   divl(无符号除法)



posted @ 2015-10-11 19:37  Mccartney  阅读(192)  评论(2编辑  收藏  举报