概述
基础知识
机器语言
0 和 1
汇编语言
汇编语言的主体是汇编指令
寄存器是CPU中存储数据的器件,一个CPU有多个寄存器。
程序员–汇编指令–编译器–机器码–计算机CPU处理
存储单元
存储器被划为若干个存储单元,每个存储单元从0开始编号
8 个bit 组成一个Byte(一个字节)
微型存储器的存储单元可以存储一个Byte,即8个二进制位。
一个存储器有128个存储单元,可以存储128个Byte
CPU 对存储器的读写
CPU通过执行存储单元的地址来从内存中读写数据。
先通过地址线确定内存中的地址,通过控制线读写命令,用数据线发送数据。
寄存器
8086CPU 有14个寄存器 AX、BX、CX、DX 、SI、 DI、 SP、 BP、 IP、 CS、 SS、 DS、 ES、 PSW
寄存器进行信息存储
通用寄存器
8086CPU所有的寄存器都是16位的,可以存放两个字节
AX、BX、CX、DX 是4个通用寄存器
AX 的低8位构成AL寄存器,高8位构成AH寄存器,AH和AL寄存器是可以独立使用的9位寄存器。
字在寄存器中的存储
字节: byte,一个字节由8个bit组成,可以存在8位寄存器中
字: word,一个字由两个字节组成,分为高位字节和低位字节
8086CPU计算物理地址的方法
地址加法器采用 物理地址 = 段地址X16+偏移地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYXAYyfl-1599878886163)(E:新建文件夹(9)]__笔记image-20200904100516784.png)
物理地址 = 段地址X16+偏移地址 本质含义是:CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
段的概念
若干地址连续的内存单元看作一个段,用段地址X16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元
段寄存器
8086CPU有 4个段寄存器 CS、DS、SS、ES
CS 和 IP
CS 代码段寄存器 IP 指令指针寄存器
8086机中,CPU将CS:IP 指向的内容当作指令执行
修改CS和IP的内容,jmp 段地址: 偏移地址
DS 和address
DS 段寄存器,通常用来存放访问数据的段地址
mov、add、sub 指令
mov 寄存器,数据 、 mov 寄存器,寄存器、 mov 寄存器,内存单元、mov 内存单元,寄存器、mov 段寄存器,寄存器
栈
先进后出
pop ax 表示从栈顶取出数据送入ax
push ax 表示将寄存器ax 中的数据送入栈中。
SS 和SP
段寄存器SS 和寄存器SP 栈顶的段地址存放在SS中,偏移地址存放在SP中。
任意时刻,SS:SP 指向栈顶元素
第一个程序
源程序执行的过程
汇编源程序 —> 编译链接 —> 可执行文件 —> 执行
源程序
汇编指令是有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
伪指令没有对应的机器指令,由编译器来执行,进行相关的编译工作。
伪指令 segment (开始)和 ends(结束) 定义一个代码段,
一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。
end 汇编程序结束标记,assume cs:csdeg 代码段与寄存器的关联
程序返回
mov ax,4c00H, int 21H
[BX] 和loop 指令
[bx] 表示内存单元,偏移地址为bx 。 内存单元的物理地址为 ((ds)*16+(bx))
inc bx 将bx寄存器中的内容加1
loop 指令 是循环指令。cx 是存放循环的次数
段前缀
显示的指明内存单元的段地址的 “ds:”,“cs:”,“ss:”,“es:”
定位内存的方法
and和or指令
and 逻辑与指令,按位进行与运算
or 逻辑或指令,按位进行或运算
[bx+idata]
[bx+idata] 表示一个内存单元,它的偏移地址为(bx)+idata
SI 和 DI
si 和 di 是8086CPU中和bx 功能相近的寄存器,si 和 di 不能够分成两个8位寄存器
reg 和 sreg
reg 表示寄存器,reg的集合包括:ax、bx、cx 、dx、ah 、al、 bh、 bl、 ch、 cl、 dh、 dl、 sp、 bp、 si、 di
sreg 表示一个段寄存器,sreg的集合包括:ds、ss、cs、es
寻址方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1VRZeQx-1599878886169)(E:新建文件夹(9)]__笔记image-20200904134414873.png)
div指令
div指令是除法指令,除数放在reg 或内存单元,被除数默认放在ax 或dx和ax中
伪指令dd
db 和dw 定义字节型数据和字型数据。dd是用来定义dword 型数据的。
dup
db 3 dup (0) 相当于 db 0,0,0
转移指令的原理
可以修改IP,或同时修改CS和IP的指令统称为转移指令
8086CPU的转移指令分为以下几类。
- 无条件转移指令(jmp)
- 条件转移指令
- 循环指令
- 过程
- 中断
操作符offset
offset 获取标号的偏移地址
jmp 指令
jmp 为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp 指令要给出两信息,(1)转移的目的地址。(2)转移的距离(段间转移、段内短转移、段内近转移)
依据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)
这种格式是段内短转移
CPU在执行jmp 指令的时候并不需要转移的目的地址
转移的目的地址在指令中的jmp指令
jmp far ptr 标号 段间转移
转移地址在寄存器中的jmp 指令
jmp 16位 reg
转移地址在内存中的jmp指令
jmp word ptr 内存单元地址
jcxz 指令
jcxz指令为有条件转移指令
CALL和RET指令
ret 和 retf
ret 指令用栈中的数据,修改IP的内容,从而实现近转移
retf 指令用栈中的数据, 修改CS和IP的内容,从而实现远转移
call 指令
CPU执行call 指令时, 进行两步操作:(1) 将当前的IP或CS和IP压入栈中 ; (2) 转移
call 和 ret 配合使用
可以写一个程序段A, 使用call 指令转移到A的地址来执行程序,执行到ret指令,在跳转到主程序中继续执行下面的.
mul 指令
mul 是乘法指令
标志寄存器
- 用来存储相关指令的某些执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJve46Ju-1599878886171)(F:新建文件夹(9)]__笔记汇编学习笔记image-20200904152625387.png)
ZF标志
flag 第6位是ZF,零标志位,它记录相关的指令执行后,其结果是否为0.
如果结果为0,那么zf=1;如果结果不为0,那么zf = 0.
PF标志
flag 第2位是PF,奇偶标志位,它记录相关的指令执行后,其结果中所有的bit位中1的个数位偶数,pf=1 ,为奇数 pf=0
SF标志
flag的第7位是SF, 符号标志位 , 它记录相关指令执行后,其结果为负,sf=1; 非负 sf=0
CF标志
flag 的第0为是CF, 进位标志位, 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值.
OF标志
第11位是OF,溢出标志位,符号运算的结果发生溢出,OF=1,没有OF=0
adc 指令
带进位加法指令,它利用CF位上记录的进位值
sbb 指令
带借位减法指令,它利用了CF位上记录的借位值。
sbb ax bx 实现的功能是:(ax)=(ax)-(bx)-CF
cmp指令
比较指令,相当于减法,cmp 操作对象1, 操作对象2 : (1)-(2) .
但是不保存结果,但是其结果会改变标志位寄存器
DF标志和串传送指令
第10位是DF, 方向标志位。 在串处理指令中,控制每次操作后si、di的增减。
df = 0 , 每次操作后 si、 di 递增
df =1 , 每次操作后 si、 di 递减
movsb 的功能如下: mov es:[di],byte ptr ds:[si]
功能是将ds:si 指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。
movsw 的汇编语法描述: mov es:[di],word ptr ds:[si]
将ds:si指向的内存单元中的字送入到es:di中,然后根据标志位寄存器df位的值,将si和di递增或递减2
pushf 和popf
pushf 的功能是将标志寄存器的值压栈,而popf 是从栈中弹出数据,送入标志寄存器中。
内中断
概念:任何一个通用的cpu ,比如8086,都具备一种能力,可以在执行完当前正在执行的指令后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。
中断的意思就是,CPU不在接着向下执行,而是转去处理这个特殊信息。
内中断的产生
CPU内部有4种情况可以产生中断信息。
- 除法错误,比如,执行div指令产生的除法溢出 ; 中断类型码: 0
- 单步执行; 中断类型码: 1
- 执行into指令; 中断类型码: 4
- 执行int指令
中断向量表
CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
8086PC机中,中断向量表指定放在内存地址0处。
中断过程
8086CPU在收到中断信息后,所引发的中断过程。
- 从中断信息中取得中断类型码;
- 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中);
- 设置标志寄存器的第8位TF和第9位IF的值为0
- CS的内容入栈
- IP的内容入栈
- 从内存地址为中断类型码*4 和中断类型码 * 4 +2 的两个字单元中读取中断处理程序的入口地址设置IP 和CS
端口
在PC机系统中,和CPU通过总线相连的芯片除了各种存储器外,还有以下3种芯片。
- 各种接口卡上的接口芯片,它们控制接口卡进行工作;
- 主板上的接口芯片,CPU通过它们对部分外设进行访问;
- 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。
在这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器,它们在物理上可能处于不用的芯片中,但是它们在以下两点上相同。
- 都和CPU的总线相连,当然这种连接是通过它们所在的芯片进行的;
- CPU对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写命令。
可见,从CPU的角度,将这些寄存器都当作端口,对它们统一编址,从而建立了一个统一的端口地址空间。每一个端口在地址空间中都有一个地址。
CPU可以直接读写一下3个地方的数据。
- CPU内部的寄存器
- 内存单元
- 端口
端口的读写
端口读写命令: in , 从端口读取数据; out , 往端口写入数据;
外中断
PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干个寄存器,CPU将这些寄存器当作端口来访问。
接口芯片和端口
外设的输入不直接送入内存和CPU,而是送入相关的芯片的端口中;CPU向外设的输出也不是直接送入外设。而是先送入端口中,再由相关的芯片送到外设。
最后
以上就是老实老师为你收集整理的汇编语言个人笔记的全部内容,希望文章能够帮你解决汇编语言个人笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复