- @[toc]
- 第一~三章 概述
- 第四~六章 基本程序结构
- 第七章 更灵活的访存方法
- 第八章 数据处理的两个基本问题
- 第九章 转移指令的原理
- 第十章 call和ret指令
- 第十一章 标志寄存器
- 第十二章 中断
- 第十三章 中断程序设计 + 宏
- 第十四~十六章 端口、外中断、
1.机器语言、汇编语言、高级语言的概念
机器语言:直接用二进制代码的机器指令表示的语言
汇编语言:用指令助记符、符号地址、标号等符 号书写程序的语言
高级语言:一种类似于人类语言的语言
2.汇编语言特点
占用空间少、执行速度快、直接控制硬 件能力强,但不容易掌握、开发周期较长且 可移植性差。
3.汇编语言工作过程
4.8086寄存器组
8086CPU有14个寄存器 :
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW(FLAGS)
(1)通用寄存器:AX、BX、CX、DX
AX:累加寄存器,通常用于运算,在乘除指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传输数据。
BX:基址寄存器,常用于地址索引。
CX:计数寄存器,常用于计数;常用于保存计算值,如位移指令,循环(loop)和串处理指令中作隐含的计数器。
DX:数据寄存器,常用于数据传递。
(2)段寄存器:CS、DS、SS、ES
当8086CPU要访问内存时,由这4个段寄 存器提供内存单元的段地址。
汇编指令不区分大小写
5.三大总线
地址总线: CPU是通过地址总线来指定存 储单元的。
总线的宽度决定了物理寻址的范围。
一个CPU有N根地址总线,CPU最多可以寻找 2^N个内存单元
数据总线 :数据总线的宽度决定了CPU和外界进行一次数 据传送的位数。
控制总线 :不同控制线的集合,控制总线的宽度决定了 CPU对外部器件的控制能力
6.物理地址 = 段地址×16+偏移地址
CPU可以用不同的段地址和偏移 地址形成同一个物理地址
7.8086PC工作过程
(1)从CS:IP指向内存单元读取指令,读取 的指令进入指令缓冲器;
(2)IP = IP + 所读取指令的长度,从而 指向下一条指令;
(3)执行指令。 转到步骤 (1),重复这 个过程。
8086CPU 加电启动或复位后( 即 CPU刚开 始工作时)CS和IP被设置为CS=FFFFH, IP=0000H,即FFFF0H单元中的指令是 8086PC机开机后执行的第一条指令。
8.从80386开始,Intel的CPU具有3种运行模式:实模式、 保护模式和虚拟8086模式
9.存储器中数据的组织方式
大端方式 :高位字节排放在内存的低地址端,低位字节存放在高地址端。
小端方式 :低位字节存放在内存的低地址端,高位字节存放在高地址端
10.mov指令的格式: mov 寄存器名,内存单元地址
执行指令时,8086CPU自动取DS中的数据 为内存单元的段地址
11.
12.mov指令的几种形式:
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
13.8086CPU提供入栈和出栈指令:
PUSH (入栈)
POP (出栈)
如:
push ax
pop ax
8086CPU的入栈和出栈操作以**字**为单位进行。
14.任意时刻,SS:SP指向栈顶元素
15.push指令的执行过程
push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
16.pop指令的执行过程
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2
17.8086CPU不保证对栈的操作不会超界
18.push和pop指令是可以在寄存器和内存 之间传送数据的。
19.push、pop 实质上是一种内存传送指令,可以在寄存器和内存之间传送数据。不过,push和pop指令访问的内存单元的地址是由SS:SP指出的同时,push和pop指令还要改变 SP ,栈顶sp的变化范围为:0~FFFFH。
20.对于数据段,将它的段地址放在 DS中。对于代码段,将它的段地址放在 CS中,将段中第一条指令的偏移地址放在IP中。对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地置放在 SP 中。
第四~六章 基本程序结构1.一个汇编语言程序从写出到最终执行的简要过程:编写 --〉编译 --〉连接 --〉执行
2.
3.汇编程序从写出到执行的过程
4.用R命令可以看各个寄存器的设置情况
用U命令查看一下其他指令
用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果,到了 int 21,我们要用P命令执行
使用Q命令退出Debug,将返回到command中,因为Debug是由command加载运行的
5.要完整地描述一个内存单元,需要两种信息:
(1)内存单元的地址;
(2)内存单元的长度(类型)
6.mov ax,[bx]
功能:bx 中存放的数据作为一个偏移地址,段地址 默认在ds 中,将ds:[bx]处的数据送入ax中。
即: (ax)=(ds *16 +(bx));
7.mov [bx],ax
功能:bx中存放的数据作为一个偏移地址,段地址默认在ds中,将ax中的数据送入内存ds:[bx]处。
即:(ds *16 +(bx)) = (ax)
8.CPU 执行loop指令的时候,要进行两步操作:
① (cx)=(cx)-1;
② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
9.通常,我们可以用loop指令来实现循环功能,cx 中存放循环次数
10.我们在Debug中写过类似的指令:
mov ax,[0]
表示将ds:0处的数据送入al中。
但是在汇编源程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理
11.显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀
12.一般,DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2FF( 0:200h~0:2FFh)的256 个字节的空间。所以,我们使用这段空间是安全的.
13.end的作用:end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。
14.end start:说明了程序的入口,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令
15.inc bx 表示bx自加一,比add bx,1要快不少
第七章 更灵活的访存方法1.大、小写字母的ASCII码值相差**20H**
2.通过and和or指令,进行大小写转换
3.[bx+ idata]:也可表示一个内存单元,偏移地址为(bx)+ idata
用[bx+idata]的方式进行数组处理如下:
4.SI和DI是8086CPU中和bx功能相近的寄存器,SI和DI不能分成两个8位寄存器来使用。
5.更灵活的方式:[bx+si]、[bx+di]、[bx+si+idata]
6.一般来说, 在需要暂存数据的时候,我们都应该使用**栈**。
7.在8086CPU中,只有4个寄存器(bx、 bp、si、di) 可以用在“[…]"中来进行内存单元的寻址。 可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di
8.只要在[…]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。比如: mov ax,[bp+ si+idata] 含义: (ax)=((sS)*16+(bp)+(si)+ idata)
第八章 数据处理的两个基本问题1.8086CPU的指令,可以处理Byte、word两种长度的数据 (1)寄存器指明 mov al,ds:[0] (2)用操作符X ptr指明 (X =word/byte) add word ptr [bx],2 mov byte ptr ds:[0],1 push [1 000H] (3)其他方法(如堆栈默认以字为单位)
3.div 是除法指令,使用div 做除法的时候要注意以下问题。 (1)除数:有8位和16位俩种,在一个reg或内存单元中 (2)被除数:默认放在AX 或 DX和AX中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数位16位,被除数则位32位,存放在DX和AX中,DX存放高16位,AX存放低16位。 (3)结果,若除数为8为,则AL存放商,AH存放余数。若除数为16位,AX存放商,DX存放余数。
例子如下
4.db 和 dw 定义字节型数据和字型数据。dd是用来定义dword(double word,双字)型数据的,占俩个字。
5.dup是一一个操作符,在汇编语言中同db、dw、dd等一样,由编译器识别处理,和db、dw、dd等伪指令配合使的,用来进行数据的重复。
1.offset的功能是取得标号的偏移地址,伪操作符
2.jmp为无条件转移指令,可以只修改IP也可以同时修改CS和IP。 jmp指令要给出两种信息: (1)转移的目的地址 (2)转移的距离(段间转移、段内短转移、段内近转移)
3.jmp near ptr标号实现段内近转移。 指令jmp near ptr标号”的功能为: (IP)=(IP)+ 16位位移。
4.jmp far ptr标号: (CS)=标号所在段的段地址; (IP)=标号所在段中的偏移地址。 far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。
5.jmp short 标号(转移到标号处执行指令) 这种实现的是段内短转移,它对IP的修改范围为-128 ~ 127,也就是说它向前最多转移128个字节,向后转移最多127个字节。jmp指令中的“short”符号说明指令是短转移。jmp指令中的“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。
6.转移地址在内存中的jmp指令有两种格式。 (1)jmp word ptr 内存单元地址(段内转移) 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。 (2)jmp dword ptr 内存单元地址(段间转移) 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是目标的偏移地址。 (CS)=(内存单元地址+2) (IP)=(内存单元地址)
7.jcxz指令是一个有条件转移指令,所有的条件住哪一指令都是短转移。 IP的修改范围都为:-128 ~ 127。 指令格式:jcxz 标号(如果(CX) = 0,转移到标号处执行) 其功能的解释相当于:if((CX) == 0) jmp short 标号。
8.loop 指令为循环指令,所有的循环指令都是短转移。IP修改的范围为:-128 ~ 127. 指令格式:loop 标号((CX) = (CX) - 1, 如果(CX) != 0,转移到标号处执行)
9.“jmp 2000:0100”,是在Debug中使用的汇编指令,汇编编译器并不认识,如果在源程序中使用,编译时也会报错。
第十章 call和ret指令1.Ret指令用栈中的数据,修改IP的内容,从而实现近转移; (1) (IP)=((SS)x16+(sp)) (2) (sp)=(sp)+2 2.Retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移; (1) (IP)=((SS)x16+(sp)) (2) (sp)=(sp)+2 (3) (CS)=((SS)x16+(sp)) (4) (sp)=(sp)+ 2
3.CPU执行call指令,进行两步操作: (1)将当前的IP或CS和IP压入栈中; (2)转移。 call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同.
4.call标号 (将当前的IP压栈后,转到标号处执行) (1)(sp) = (sp)- 2 ((SS)x16+(sp)) = (IP) (2) (IP) = (IP) + 16位位移
16位位移=“标号”处的地址 一 call指令后的第一个字节的地址; 16位位移的范围为-32768~32767, 用补码表示; 16位位移由编译程序在编译时算出。
5.CPU执行指令“call 标号”时,相当于进行: push IP jmp near ptr 标号
6.指令“call far ptr标号”实现的是段间转移。
call far ptr标号: (1) (sp) = (sp)- 2 ((ss) X16+(sp)) = (CS) (sp) = (sp)- 2 ((ss) X16+(sp)) = (IP) (2)(CS)=标号所在的段地址 (IP)=标号所在的偏移地址
7.call 16位寄存器 功能: (sp) = (sp)- 2 ((ss)*16+(sp)) = (IP) (IP) = (16位寄存器)
8.转移地址在内存中
(1)call word ptr 内存单元地址 push IP jmp word ptr 内存单元地址
(2) call dword ptr内存单元地址 push CS push IP jmp dword ptr 内存单元地址
9.call和ret来实现子程序
10.伪指令PROC
过程定义伪指令格式: 子程序名 PROC 属性 … 子程序名 ENDP 说明:属性分为NEAR属性和FAR属性。默认为NEAR.
11.主程序和子程序在同一个代码段使用NEAR属性。否则,使用FAR属性。 Call指令执行时,系统根据子程序名的属性决定保存断点的段地址和偏移地址。
12.mul指令
格式: mul reg mul 内存单元 相乘的两个数:要么都是8位,要么都是16位。 8位:AL中和8位寄存器或内存字节单元中; 16位:AX中和16位寄存器或内存字单元中。
结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。
13.内存单元可以用不同的寻址方式给出,比如:
mul byte ptr ds:[0] 含义为:
(ax)=(al)x((ds)x16+0);
mul word ptr [bx+si+ 8] 含义为:
(ax)=(al)x((ds)x16 +(bx)+ (si)+ 8)结果的低16位; (dx)=(al)x((ds)x16+(bx)+(si)+ 8)结果的高16位;
14.xchg指令
指令格式: XCHG OPRD1, OPRD2 目的 源 功能:将一个字节或一个字的源操作数和目的操作数相交换。 交换指令可以在寄存器之间,寄存器与存储器之间进行。
15.XCHG指令不允许的情况有以下四种: (1)不能同时都为内存操作数 (2)任何一个操作数都不能为段寄存器 (3)任何一个操作数不能为立即数
(4)两个操作数的长度必须相等
16.
17.
1.
2.
3.ZF标志
flag的第6位是ZF,零标志位。 它记录相关指令执行后,结果为0,ZF=1;结果不为0,ZF =0
示例如下
mov ax, 1 mov aX, 1 sub ax, 1 and ax,0 指令执行后,结果为0,则ZF = 1。 mov ax,2 mov aX,I sub ax, 1 or aX, 1 指令执行后,结果为1,则ZF = 0。
4.PF标志
flag的第2位是PF,奇偶标志位。 它记录指令执行后,结果的所有二进制位中1的个数: 为偶数,PF=1; 为奇数,PF=0。
示例如下
指令:mov al,1 add al,10 执行后,PF=0; 指令:mov al,1 or al,10 执行后,PF=1 ;
5.SF标志
flag的第7位是SF。符号标志位。 它记录指令执行后,结果为负,SF=1;结果为正,SF=0。
6.CF标志
flag的第0位是CF,进位标志位。 一般,在进行无符号数运算的时候,它记录运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
示例如下
mov al,98H add al,al
执行后: (al)=30H, CF= 1
7.OF标志
溢出:在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
注意CF和OF的区别: CF是对无符号数运算有意义的标志位; 而OF是对有符号数运算有意义的标志位。
示例如下
mov al, 0F0H add al, 88H 执行后: CF=1,OF=1。 对于无符号数运算,0F0H+ 88H有进位,CF=1 ; 对于有符号数运算,0F0H+ 88H发生溢出,OF=1。
8.adc指令
adc是带进位加法指令,它利用了CF位上记录的进位值。 格式:adc操作对象1 ,操作对象2 功能:操作对象1=操作对象1 +操作对象2+ CF
示例如下
mov ax,2 mov bx,1 sub bx,ax adc ax,1 执行后,(ax)=4。
9.adc指令和add指令相配合可以对更大的数据进行加法运算。
10.sbb指令
sbb是带借位减法指令,它利用了CF位上记录的借位值。 格式:sbb操作对象1 ,操作对象2 功能:操作对象1=操作对象1-操作对象2-CF
11.cmp指令
cmp是比较指令,功能相当于减法指令只是不保存结果。 cmp指令执行后,将对标志寄存器产生影响。
格式:cmp操作对象1 ,操作对象2 功能:计算操作对象1-操作对象2
12.
13.cmp ah,bh
(1)如果SF=1,而OF=0 OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负; 因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah) (bh)。.
(3)如果SF=0,而OF= 1,因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。 这样,SF=0,OF=1,说明了(ah)
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?