第一章基础知识
1.1 CPU基本功能
1.1.1 目标代码
计算机系统中的CPU只能执行机器指令
由机器指令组成的程序,被称为目标程序,也被称为目标代码
计算机系统最终运行的是目标程序
int cf11( void )
{
int sum, i;
sum = 0;
for ( i = 1; i <= 10; i += 1 )
sum += i*i;
return sum;
}
等价于:
xor ecx, ecx
xor eax, eax
inc ecx
$LL3@cf11:
mov edx, ecx
imul edx, ecx
add eax, edx
inc ecx
cmp ecx, 10
jle $LL3@cf11
ret
1.1.2 基本功能
1.执行机器指令
ü CPU能够直接识别并遵照执行的指令被称为机器指令
ü CPU一条接一条地依次执行存放在存储器中的机器指令
ü 每一条机器指令的功能通常很有限
ü CPU能够执行的全部机器指令,被称为该CPU的指令集
ü CPU决定机器指令。不同种类CPU,其指令集往往不相同
ü 按指令的功能来划分,通常机器指令可分为以下几大类:
数据传送指令、算术逻辑运算指令、转移指令
处理器控制指令、其他指令等
2.暂存少量数据
ü 一个目标程序中的绝大部分指令是对数据进行各种运算或者处理
ü CPU有若干个寄存器,可以用于存放运算数据和运算结果,还可以给出存储单元地址
ü 利用寄存器存放运算数据和运算结果,效率最高
ü 大部分指令的操作数据至少有一个在寄存器中
ü CPU内可以用于存放运算数据和运算结果的寄存器数量很有限
3.访问存储器
ü CPU要执行目标程序,就要访问存储器。目标程序在存储器中,待处理 的数据也在存储器中。这里存储器是指CPU能够直接访问的计算机系统的物理内存
ü 存储器(内存)由一系列存储单元线性地组成,最基本的存储单元为一个字节。为了标识和存取每一个存储单元,给每一个存储单元规定一个编号,也就是存储单元地址
ü CPU支持以多种形式表示存储单元的地址。一些功能较强的CPU还支持以多种方式组织管理存储器
int x = 1;
int y = 2;
void cf12( void )
{
y = x * x + 3;
return;
}
等价于:
int x = 1;
int y = 2;
void cf12( void )
{
y = x * x + 3;
return;
}
1.2 汇编语言概念
1.2.1 机器指令
ü 把CPU能够直接识别并遵照执行的指令称为机器指令
ü 机器指令一般由操作码和操作数两部分构成
ü 操作码指出要进行的操作或运算
例如,加、减、传送等
ü 操作数指出参与操作或运算的对象,也指出操作或运算结果存放的位置
例如,寄存器、存储单元和数据等
xor ecx, ecx
xor eax, eax
inc ecx
lab1: mov edx, ecx
imul edx, ecx
add eax, edx
inc ecx
cmp ecx, 10
jle lab1
ret
等价于:
33 C9
33 C0
41
8B D1
0F AF D1
03 C2
41
83 F9 0A
7E F3
C3
1.2.2 汇编格式指令
1.人们采用便于记忆、并能描述指令功能的符号来表示指令的操作码。这些符号被称为指令助记符
2.用符号表示操作数,如寄存器、存储单元地址等
3.由指令助记符、操作符号和常量等表示的指令被称为汇编格式指令
ü 汇编格式指令的一般格式
[ 标号:] 指令助记符 [ 操作数表]
1.2.3 汇编语言及其优缺点
汇编语言
ü 汇编语言是一种程序设计语言,是机器语言的符号化
ü 汇编语言的语句主要是汇编格式指令和伪指令
ü 由于汇编语言的主体是汇编格式指令,而汇编格式指令又与机器密切相关,且功能有限,所以常把汇编语言称为低级语言
汇编和汇编程序
ü 把用汇编语言编写的程序称为汇编语言源程序,或称为汇编源程序,或简称为源程序。
ü 把汇编源程序翻译成目标程序的过程称为汇编。
ü 把完成汇编工作的工具或程序叫做汇编程序(汇编器)。
汇编语言的优缺点
ü 汇编语言与机器关系密切
ü 汇编语言程序效率高
ü 编写汇编语言源程序繁琐
ü 汇编语言程序调试困难
1.3 数据的表示和存储
1.3.4 数据的存储
ü 以二进制形式表示的数据和代码存放在存储器(内存)之中。
ü 内存由一系列基本存储单元线性地组成,每一个基本存储单元有一个唯一的地址。通常,基本存储单元由8个连续的位构成,可用于存储一个字节的数据。所以,基本存储单元也被称为字节存储单元。
ü 可以把内存看作为一个很大的一维字符数组,把地址看作为标识数组元素的下标。
ü 字节存储单元是基本的存储单元。
ü 一个字节存储单元中8位数据的意义,根据需要可以有不同的解释。
ü 两个连续的字节存储单元构成一个字存储单元。字存储单元的地址是较低的字节存储单元的地址。“高高低低”规则。
ü 四个连续的字节存储单元构成一个双字存储单元。
#include <stdio.h>
char buff[] = { 3, 2, 1, 0, 130}; // 130=0x82
int a, b;
int main( )
{
char *p = buff;
a = *( int* ) p; //L1
b = *( int* ) ( p+1 ); //L2
printf( "a = %x, b=%x\n", a, b ); //L3
printf( "a = %d, b=%d\n", a, b ); //L4
return 0;
}