《汇编语言程序设计》易错知识,核心知识总结(第一,二章)

本文是主要基于钱晓捷的《汇编语言程序》第五版做出的易错知识,核心知识点总结。

8086指令系统:

一,数据传送类:

易错点:

        段寄存器之间不能传值,存储器之间不能传值,立即数不能直接传给段寄存器,立即数传给存储器需要显示指明存储器单元类型。

        数据传送类指令除标志寄存器传送指令(lahf,sahl,pushf,popf)外均不影响标志位

        MOV指令:

                mov reg/men, imm

                mov reg/men/seg, mem

                mov reg/seg, mem

                mov reg/men, seg

        XCHG指令:

                XCHG reg,reg/mem

                XCHG reg/mem,reg

        XLAT转码指令:

                xlat           ;al\leftarrowds:[bx+al]该指令默认使用BX,AL寄存器

        PUSH堆栈操作指令:操作对象只能式字操作数

                push r16/m16/seg  ;sp\leftarrowsp - 2, ss:[sp]\leftarrowr16/m16/seg

        POP堆栈操作指令:操作对象只能式字操作数

                pop r16/m16/seg  ;  r16/m16/seg\leftarrowss:[sp], sp\leftarrowsp + 2

                                                                8086处理器堆栈操作

堆栈的应用:

 标志传送指令:

1. 标志送AH指令 LAHF(LOAD AH FROM FLAGS)

2.AH送标志指令 SAHF(SAVE AH TO FLAGS)

3.标志进栈指令PUSHF

4.标志出栈指令POPF

算数运算类:

        状态标志:进位标志(针对无符号)CF=1,进位或借位,如何理解:比如字节数据相加减,结果不在0~255范围内,则CF=1。

                          溢出标志(针对有符号)OF=1,溢出。如何理解溢出:有符号正数相加,得到了负数,就说明溢出了  0110 0001 + 0100 0010 = 1010 0011。总结起来就是:只有当两个相同符号数相加(包含两个不同符号数相减)而运算结果的符号与原数据符号相反,才产生溢出。因为此时运算结果显然不对。两个正数相加怎么可能是负数?正数减负数怎么可能得负数?因为溢出了呀! 

     

 其他标志位如零标志ZF,运算结果为零时ZF=1;符号标志SF,运算结果为负数是SF = 1;奇偶标志PF,运算结果在1的个数为偶数时AF =1。

提醒一句:之前说到的数据传送类指令除了标志寄存器传送指令(lahf,sahl,pushf,popf)外均不影响标志位

现在开始介绍算术指令(按照+ - * / 的顺序):

add加法指令,add reg, imm/reg/mem  ;reg\leftarrowreg+imm/reg/mem

                        add mem,imm/reg

adc带进位加,即运结果还要加上CF的值

 

inc增量指令(加一运算),如:inc ax,设计目的是用于对计算器和地址指针的调用,不影响CF

sub减法指令,格式同add

sbb带借位减法指令,运算结果还要减去OF的值

dec减量指令,类似inc

neg求补指令,可以表示成:将操作数按位取反+1。对标志位的影响同add。

eg:neg reg/mem;    reg/mem\leftarrow0 - reg/mem

cmp比较指令,同sub一样执行同样的操作,影响标志位,但是结果不送入目的操作数

乘法指令

除法指令

提醒:乘法指令利用对OF,CF的影响可以判断相乘的结果的高一半是否含有有效数据,如果有OF=CF=1,如果没有,即高位为0,则OF=CF=0;对其他标志位没有定义,即为任意,但不代表不影响,可能在8086中没有定义的必要。除法指令类比理解。 

 符号扩展指令(针对有符号数设计,正数补1,负数补0)cbw将al符号扩展到ax,cwd将ax符号扩展到dx和ax寄存器对。

 

逻辑运算指令:(所有双操作数的逻辑指令均设置CF=OF=0,根据结果设置SF,ZF,PF的状态,而对AF没有定义),对两个操作数执行逻辑运算,结果送目的操作数

        AND逻辑与指令,两个操作数不能同时为存储器寻址,源操作数可以是任意寻址方式,目的操作数只能是立即数外的其他寻址方式。

        OR逻辑或指令

        XOR逻辑异或指令。xor  ax,ax;将ax设置为0

        NOT逻辑非指令,不影响标志位

        TEST测试指令,执行操作和AND一样,不保存结果,目的操作数不变,根据结果来影响标志位

移位指令:

        shl  reg/mem , 1/cl;逻辑左移,最低位补0,最高位进入CF,如下图所示

         shr  reg/mem , 1/cl

        sal  reg/mem , 1/cl;同shl

        sar  reg/mem , 1/cl;算数右移,最高位不变,最低位进去CF

移位指令按照移入的位设置进位标志CF,根据移位后的结果影响SF,ZF,PF对AF没有定义。如果进行1位移动,按照操作数的最高符号位是否改变,相应设置溢出标志OF,最高位改变OF=1,否则OF = 0;如果移位次数大于1时,OF不确定。

 

 循环移位指令:

        rol  reg/mem , 1/cl;不带进位循环左移

        ror  reg/mem , 1/cl

        rcl  reg/mem , 1/cl;带进位循环左移,具体操作见下图。

        rcr  reg/mem , 1/cl

前两条指令不降进位CF纳入循环位中。后两条纳入,即9位或者17位二进制数一起移动。循环移位指令按照功能设置进位CF,不影响其他标志位。

控制转移类

        1.无条件转移指令

                段内转移,相对寻址:JMP  lable;ip\leftarrowip+位移量

                段间转移,间接寻址:JMP  r16/m16;ip\leftarrowr16/m16

                段间转移,直接寻址:JMP  far ptr lable;ip\leftarrowlabel的偏移地址,cs\leftarrowlabel的段地址

                段间转移,间接寻址:JMP  far ptr mem;ip\leftarrow[mem],cs\leftarrow [mem+2]

        2. 条件转移指令jcc(指令集)

                        JCC  label;条件满足,发送转移,ip\leftarrowip+8位位移量,否则顺序执行ip\leftarrowip+2

                                                                根据标志位状态

                                                              针对无符号数高低的比较 

                                        ​​​​​​​        ​​​​​​​        ​​​​​​​      针对无符号数大小的比较  

循环指令(loop,loope/loopz,jcxz,loopne/loopnz)

        提醒:循环指令不影响标志位。

        loop指令首先将CX值减1,如何判断CX是否为0,CX不为0,则继续执行循环体内的指令;CX为0,表示循环结束,于是程序退出循环,顺序执行后面的程序。

        使用loop的三要点:

        1.必须在CX中存放循环次数;

        2.loop指令的标号一般应在前面,要执行的循环程序段应写在标号和LOOP指令之前 

        3.为防止CX初值为0导致循环次数出错,可以在循环之前使用JCXZ指令进行判断。

子程序指令(call,ret)

                                                            程序调用和返回堆栈示意图

远调用时注意cs先入栈,ip后入栈。ip先赋新值,cs后赋新值 

远调用时注意ip先出栈,cs后出栈 ;

 

二 , 寻址方式:

三类七种

        立即数寻址   eg:mov ax,  0102h

        寄存器寻址   eg:   mov ax, 1234h

        存储器寻址(五种):

                1. 直接寻址: mov ax, [2000h];指令中直接包含有效地址

                2. 寄存器间接寻址:有效地址存放在寄存器中,8086中寄存器只能是基址寄存器BX或者变质寄存器SI,DI。其默认的段地址在DS段寄存器中,可以使用段超越改变前缀。eg:mov ax,[si]

                3. 寄存器相对寻址方式:有效地址是寄存器的内容与有符号8位或16位位移量之和,寄存器可以是BX,BP,SI,DI。操作数的EA = BX/BP/SI/DI+8/16位位移量。BP默认堆栈段SS,其他默认DS

eg:mov ax,[di + 06h]。采用BP相对寻址时如果偏移量为0,也可以不写,形式上与寄存器间接寻址一样。eg:mov ax,[bp]  ; mov ax, [bp+0]

                4. 基址变址寻址: 有效地址EA= BX/BP+SI/DI。BX默认段DS,BP默认段SS。

                5. 相对基址变址寻址:EA = BX/BP+SI/DI+8/18位偏移量。

同一寻址方式可以写成不同形式:

        mov ax, [bx][si] ;也可写成:mov ax ,[bx+si]

        mov ax count[si] ;也可以写成 mov ax, [si+count],count为变量或常量,若为变量此处count取偏移地址地址,而不是取count表示的值。

        mov ax wnum[bx][si];也可写成mov ax, [bx+si+wnum]或者mov ax,wnum[bx+si]

汇编语言(各章知识点) 课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点   1 机器语言   2 汇编语言   3 汇编程序   4 汇编语言的主要特点   5 汇编语言的使用领域  1.2 数据的表示和类型   1 数值数据的表示   2 非数值数据的表示   3 基本的数据类型  1.3 习题 第2章 CPU资源和存储器  2.1 寄存器组   1 寄存器组   2 通用寄存器的作用   3 专用寄存器的作用  2.2 存储器的管理模式   1 16位微机的内存管理模式   2 32位微机的内存管理模式  2.3 习题 第3章 操作数的寻址方式  3.1 立即寻址方式  3.2 寄存器寻址方式  3.3 直接寻址方式  3.4 寄存器间接寻址方式  3.5 寄存器相对寻址方式  3.6 基址加变址寻址方式  3.7 相对基址加变址寻址方式  3.8 32位地址的寻址方式  3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义   1 内存变量定义的一般形式   2 字节变量   3 字变量   4 双字变量   5 六字节变量   6 八字节变量   7 十字节变量  4.3 调整偏移量伪指令   1 偶对齐伪指令   2 对齐伪指令   3 调整偏移量伪指令   4 偏移量计数器的值  4.4 复合内存变量的定义   1 重复说明符   2 结构类型的定义   3 联合类型的定义   4 记录类型的定义   5 数据类型的自定义  4.5 标号  4.6 内存变量和标号的属性   1 段属性操作符   2 偏移量属性操作符   3 类型属性操作符   4 长度属性操作符   5 容量属性操作符   6 强制属性操作符   7 存储单元别名操作符  4.7 表达式   1 进制伪指令   2 数值表达式   3 地址表达式  4.8 符号定义语句   1 等价语句   2 等号语句   3 符号名定义语句  4.9 习题 第5章 微机CPU的指令系统  5.1 汇编语言指令格式   1 指令格式   2 了解指令的几个方面  5.2 指令系统   1 数据传送指令   2 标志位操作指令   3 算术运算指令   4 逻辑运算指令   5 移位操作指令   6 位操作指令   7 比较运算指令   8 循环指令   9 转移指令   10 条件设置字节指令   11 字符串操作指令   12 ASCII-BCD码调整指令   13 处理器指令  5.3 习题 第6章 程序的基本结构  6.1 程序的基本组成   1 段的定义   2 段寄存器的说明语句   3 堆栈段的说明   4 源程序的结构  6.2 程序的基本结构   1 顺序结构   2 分支结构   3 循环结构  6.3 段的基本属性   1 对齐类型   2 组合类型   3 类别   4 段组  6.4 简化的段定义   1 存储模型说明伪指令   2 简化段定义伪指令   3 简化段段名的引用  6.5 源程序的辅助说明伪指令   1 模块名定义伪指令   2 页面定义伪指令   3 标题定义伪指令   4 子标题定义伪指令  6.6 习题 第7章 子程序和库  7.1 子程序的定义  7.2 子程序的调用和返回指令   1 调用指令   2 返回指令  7.3 子程序的参数传递   1 寄存器传递参数   2 存储单元传递参数   3 堆栈传递参数  7.4 寄存器的保护与恢复  7.5 子程序的完全定义   1 子程序完全定义格式   2 子程序的位距   3 子程序的语言类型   4 子程序的可见性   5 子程序的起始和结束操作   6 寄存器的保护和恢复   7 子程序的参数传递   8 子程序的原型说明   9 子程序的调用伪指令   10 局部变量的定义  7.6 子程序库   1 建立库文件命令   2 建立库文件举例   3 库文件的应用   4 库文件的好处  7.7 习题 第8章 输入输出和中断  8.1 输入输出的基本概念   1 I/O端口地址   2 I/O指令  8.2 中断   1 中断的基本概念   2 中断指令   3 中断返回指令   4 中断和子程序  8.3 中断的分类   1 键盘输入的中断功能   2 屏幕显示的中断功能   3 打印输出的中断功能   4 串行通信口的中断功能   5 鼠标的中断功能   6 目录和文件的中断功能   7 内存管理的中断功能   8 读取和设置中断向量  8.4 习题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值