这一章主要是讲了程序的运行过程,还有数据的格式格式,前两节就是重点讲了汇编。
要点一
大多数常用数据类型都是作为双子存储的。其中有常见的 int 和 long int,无论有无符号;所有指针都是四字节的双字;当然还有很多,具体的如下表所示(32位为例,64*2就行):
c声明 |
Intel数据类型 |
GAS后缀 |
大小(字节) |
char |
字节 |
b |
1 |
short |
字 |
w |
2 |
int |
双字 |
l |
4 |
unsigned |
双字 |
l |
4 |
long int |
双字 |
l |
4 |
unsigned long |
双字 |
l |
4 |
char * |
双字 |
l |
4 |
float |
单精度 |
s |
4 |
double |
双精度 |
l |
8 |
long double |
扩展精度 |
t |
8 |
所以有时候会看到mov的一些变形:movb 、movw 、movl ,就是分别传送字节、传送字和传送双字。
要点二
在做题之前,要先了解一些概念:
操作数:统共有三种类型,第一种是立即数,也就是常数值;第二种是寄存器,表示的是某个寄存器的内容;第三种是存储器引用,会根据计算出来的地址(即有效地址)访问某个存储器的位置。
以上应该是在学习汇编的过程中就有一些了解的。
题目
操作数 |
值 |
%eax |
0x100 |
0x104 |
0xAB |
$0x108 |
0x108 |
(%eax) |
0xFF |
4(%eax) |
0xAB |
9(%eax,%edx) |
0x11 |
260(%ecx,edx) |
0x13 |
0xfc(,%ecx,4) |
0xFF |
(%eax,%edx,4) |
0x11 |
这个做题,就按照这张表来算就好:
一谈到数据就会牵扯到程序执行时的空间变化还有很多的汇编,例如下面又有一张表:
这里还涉及到汇编中的条件码寄存器:
CF:进位标志。
ZF:零标志。
SF:符号标志。
OF:溢出标志。(正负溢出)
那应该怎么用呢?
题目
做一道题练手汇编。
A:8048dlc
B:8048CEE
8048CF0
C:80489D2
D:ff 25表示的是简介跳转,因为读取的地址需要4字节,又因为是小端法,所以是e0 a2 04 08。