您当前的位置: 首页 > 

小天才才

暂无认证

  • 0浏览

    0关注

    168博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

汇编语言程序设计---期末复习大纲知识点总结(王爽第二版)

小天才才 发布时间:2021-03-12 17:10:01 ,浏览量:0

文章目录
    • @[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)

关注
打赏
1658396332
查看更多评论
立即登录/注册

微信扫码登录

0.1190s