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(无符号除法)