【原创】汇编语言的基本知识(一)
一,基础
1,汇编指令的组成:
汇编指令:有对应的机器码
伪指令:没有对应的机器码,计算机不执行
其他符号:没有对应的机器码,+-*/
2,指令和数据:
在内存和磁盘行,指令和数据没有任何区别,都是二进制信息
3,cpu对存储器的读写
(1)存储单元:以字节为最小单位
(2)cpu对外部器件通信,有三类信息的交互:
存储单元的地址(地址信息),地址总线
器件的选择,读和写的命令(控制信息),控制总线
读或写的数据(数据信息),数据总线
4,地址总线:
1个cpu上有n跟地址总线,表示这个cpu的地址总线的宽度为n,这样的cpu最多可以寻找2的n次方个内存单元
5,内存地址空间
所有器件(主存,显存...)的内存,被cpu看成一个有若干内存单元组成的逻辑存储器,不同器件对应不同的地址段或叫地址空间。
cpu对相应的地址空间上读写数据实际上是对相应器件的物理存储器中读写数据
二,寄存器
1,字节和字的概念:
1个字=2个字节,1个字节=8个位bit,1字节是一个存储单元
2,cpu的结构:运算器,控制器,寄存器
运算器:进行数据的运算
寄存器:数据的存储
控制器:控制各种器件进行工作
内部总线:连接运算器,寄存器和控制器
3,物理地址:核心问题
物理地址就是内存单元的地址:物理地址=段地址*位数+偏移地址
4,几个基本的寄存器
(1)通用寄存器:存储一般性的数据:AX,BX,CX,DX..
(2)端地址存放在段寄存器中:CS,DS,SS,ES...
(3)CS和IP寄存器:指示cpu当前要读取指令的地址;
CS是代码段寄存器,IP是指令指针寄存器,举例:
CS的内容为M,IP的内容为N,cpu位数为64;则cpu将从内存 M*64+N 单元开始,读取一条指令并执行
5,代码段
在编程时,将一组内存单元定义为一个段。我们可以将长度为N的一组代码,存在一组地址连续,起始位置为cpu位数的倍数的内存单元中。然后认为这段内存是用来存储代码的,从而定义了一个代码段;
实际含义:例如:123B0H~123B9H 这段字段内存单元构成一个代码段,他的段地址为123BH,长度为10;所以内存地址最后映射的数据就是这段内存中的数据
三,内存访问
1,内存中字的存储
cpu用16位的寄存器存储1个字,高8位存放高位字节,低8位存放低字节
1一个字单元相当于2个内存单元
2,cpu读写一个内存单元的汇编代码,比如读10000H(1000:0)单元的内容
mov bx,1000H # mov ds,bx #ds 内存单元的段地址 mov al,[0] # [...] 内存单元的偏移地址
3,mov,add,sub指令
mov 寄存器, 数据
mov 寄存器, 寄存器
mov 端寄存器, 寄存器
mov 寄存器, 内存单元
mov 内存单元, 寄存器
add 寄存器, 数据
add 寄存器, 寄存器
add 寄存器, 内存单元
add 内存单元, 寄存器
sub 寄存器, 数据
sub 寄存器, 寄存器
sub 寄存器, 内存单元
sub 内存单元, 寄存器
4,cpu提供的栈机制:push和pop 指令,段寄存器SS(栈顶的段地址),寄存器SP(栈的偏移地址)
(1)入栈时,栈顶从高地址像低地址反向增长
(2)任意时刻,SS:SP指向栈顶元素
(3)push和pop指令
push 寄存器
push 段寄存器
push 内存单元
pop 寄存器
pop 段寄存器
pop 内存单元
举例:
mov ax, 0123H
push ax
mov bx, 2266H
push bx
mov cx,1122H
push px
pop ax
pop bx
pop cx
#解析
push ax
1,SP=SP-2,SS:SP将指向新的栈顶
2,将ax中的数据送入SS:SP指向的内存单元,SS:SP此时已经指向新的栈顶
四,第一个程序
1,编写汇编源程序:
产生存储源程序的文本文件:x.asm
2,编译汇编源程序
用汇编语言编译程序编译源程序,产生目标文件:x.obj
3,链接目标文件
用链接程序链接目标文件,产生可执行文件:x.exe
可执行文件包含2个部分
(1)程序(源程序中汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
(2)描述信息(程序有多大,要占用多大内存)
4,伪指令
(1)segment和ends是一对成对使用的伪指令;2者定义一个段,segment定义段的开始,ends定义段的结束
(2)end:程序结束标志
(3)程序返回
mov ax, 4c00H
int 21H