汇编语言知识点总结

本文详细介绍了8086汇编语言中的关键概念,包括微机硬件中的段寄存器、外部设备的接口通信,以及各种寻址方式。重点讲解了数据传送、算术指令、控制转移指令和串传送指令,并阐述了中断处理和子程序设计的基本原理,还涉及了输入输出程序设计中的中断分类和键盘处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微机的硬件


对于汇编程序员来说,主要关心的是cpu中的寄存器。主存储器和I/O接口是以通过地址的形式供程序员使用


寄存器
数据寄存器AX/BX/CX/DX(存放操作数和计算结果)
变址寄存器SI/DI(用来确定主存储器中储存单元的地址)
堆栈指针寄存器SP/BP/SS(用来确定堆栈段中储存单元的地址)
指令指针寄存器CS/IP(用来控制指令序列的执行流程)
标志寄存器CF/ZF/SF/OF/PF/AF(条件标志)DF/IF/TF(状态标志)

注意:

1.  PF标志仅反映最低8位中1的个数是偶或奇,即使是进行16位字操作。低字节中“1”的个数为0或者偶数时,PF=1.

2.  注意溢出和进位的区别。处理器在进行运算时,根据无符号数设置进位标志,根据是否超出有符号数范围设置溢出标志

段寄存器DS/CS/SS/ES

因为8086有20跟地址线,要解决16位的机器字长处理20为地址的问题,采取分段的形式访问内存,段内最大64KB


外部设备

CPU通过接口与外设通信,每一个接口有一组寄存器(数据寄存器、状态寄存器、命令寄存器),每一个寄存器都有一个独立于内存的I/O地址空间


寻址方式

由于指令系统设计了多种操作数的来源,寻找操作数的过程就是操作数的寻址,不同的寻址方式执行的速度和效率不一样。

跟数据有关的寻址方式(MOV)(注意两个操作数字长要一致)

立即寻址方式 MOV AX, 5 (直接给出操作数)

寄存器寻址方式 MOV AX, BX (在寄存器中给出操作数,CS指令不能用MOV改变)

直接寻址方式 MOV AX, VALUE 或 MOV AX, [VALUE] 或 MOV AX, [2000H] (直接给出有效地址,在内存中寻找操作数,隐含段为DS,可使用段跨越前缀指定其它段)

寄存器间接寻址方式 MOV AX, [BX](有效地址在寄存器中,不允许使用AX/CX/DX存放有效地址)

寄存器相对寻址方式 MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI](可用寄存器BX/BP/SI/DI)

基址变址寻址方式 MOV AX, [BX][SI](必须是一个基址寄存器和一个变址寄存器的组合)

相对基址变址寻址方式 MOV AX, MASK[BX][SI]

比例变址寻址方式 MOV EAX, ARRAY[ESI*4]

基址变址寻址方式 MOV EAX, [EBX][ESI*6]

相对比例变址寻址方式 MOV EAX, ARRAY[EBX][ESI*8]

与转移地址有关的寻址方式(JMP) 

段内直接寻址 JMP (NEAR PTR/SHROT)NEXT   (NEAR PTR----16位位移量, SHORT----8位位移量,有效地址为当前IP+位移量(8/16位))

段内间接寻址 JMP BX或JMP TABLE[BX](转向的有效地址是一个寄存器或存储单元的内容)

段间直接寻址 JMP FAR PTR NEXT(转向另一个代码段中的地址,修改CS和IP)

段间间接寻址 JMP DWORD PTR [INTERS+BX](用存储器中的两个相继字的内容取代CS和IP)


指令系统

数据传送指令(不影响标志位)

MOV DST, SRC(DST不能是CS,立即数不能直接送段寄存器,两个操作数不能同时为段寄存器)

MOVSX 带符号扩展传送指令,MOVZX 不带符号扩展传送指令(源操作数长度一定小于目的操作数长度)

PUSH SCR (必须以字为单位,DST不能是CS)

PUSHA/POPA (AX/CX/DX/BX依次入/出栈)

XCHG OPR1, OPR2 交换操作数(不允许使用段寄存器)

IN AL/AX, PORT/DX (I/O->CPU)

OUT AL/AX, PORT/DX (CPU->I/O)

LEA REG, SRC (有效地址送寄存器指令,REG不能是段寄存器,SRC必须是存储器寻址方式)


算数指令(影响标志位)

ADD/ADC/INC (除INC不影响CF标志外,都对条件标志位有影响) <OF=1,   两个操作数符号相同,而结果符号与之相反>

SUB/SBB/NEG/CMP (除DEC不影响CF标志外,都对条件标志位有影响) <OF=1,   两个操作数符号相反,而结果符号与减数符号相同>

MUL/IMUL (AL/AX为隐含的乘数寄存器、AX/AX&DX为隐含的乘积寄存器,SRC不能是立即数,除CF/OF,对条件标志位无定义)<MUL: CF/OF=0, 乘积的高一半为0,IMUL: CF/OF=0,乘积的高一半是低一半的符号扩展>

DIV/IDIV ( AX(DA&AX)为隐含的被除数寄存器,AL(AX)为隐含的商寄存器,AH(DX)为隐含的余数寄存器,SRC不能是立即数, 对多有条件标志位无定义)

CBW/CWD (无操作数,隐含对AL/AX进行符号扩展,不影响标志位)

DAA/DAS(压缩的BCD码加/减法调整指令,隐含的操作寄存器为AL,紧接在加减指令之后使用,除AF/CF外,对其他条件标志位无定义)

AF=1或(AL)0~3=A~F,则(AL) <-(AL) ±06H,AF=1

CF=1或(AL)4~7=A~F,则(AL) <-AL) ± 60H,CF=1

AAA/AAS(非压缩的BCD码加/减法调整指令)

AAM/AAD(非压缩的BCD码乘/除法调整指令)

NOT/AND/OR/XOR/TEST(CF/OF=0; AF无定义; 其余按照运算结果设置)

移位指令 S/R(简单移位/循环),H/A(逻辑/算数S)或O/C(不带进位/带进位R),L/R(左移/右移) (当移位超过1位时,不能使用立即数,条件标志位CF为移入的数值,只移一位时,OF=1最高有效位的值发生变化,根据结果设置SF/ZF/PF)


串传送指令(不影响条件标志位)

REP MOVS/STOS/LODS(目的串默认附加段,源串默认数据段,CX=串长度,CLD/STD建立方向标志DF,0表示从低到高)

REPE/REPZ(相等继续比较)REPNE/REPNZ(不相等继续比较)CMPS/SCAS (DI:相比配/不匹配的字符的下一个地址,CX: 剩下的还未比较的字符的个数)


控制转移指令(不影响条件标志位)

JMP 无条件转移

JZ(JE): ZF=1转移,JNZ(JNE): ZF=0转移

JS/JNS/JO/JNO...

JC(JB/JNAE) CF=1转移,JNC(JNB/JAE) CF=0转移

JA/JAE/JB/JBE  CF&ZF=1/0

JL/JLE/JG/JGE  SF&ZF=1/0

JCXZ  CX=0转移

LOOP CX=0转移,否则循环

LOOPE/LOOPZ CX≠0&ZF=1循环

LOOPNE/LOOPNZ CX≠0&ZF=0循环

CALL 段内直接调用/段内间接调用 IP压栈

  段间直接调用/段间间接调用 CS/IP压栈

RET (立即数) 段内调用 弹IP,段间调用 弹IP/CS, 立即数表示弹出IP/CS后堆栈弹出多少个字节

INT TYPE(压标志->压CS->压IP,新 IP=TYPE*4, CS=TYPE*4+2)

IRET 从中断返回指令(INT 指令执行时,把IF和TF置零,但不影响其他标志位)


伪操作

段定义伪操作




PARA: 段起始地址的最低十六进制数位必须为0, PRIVATE: 私有段,不与其他同名段合并(这两个位默认的定位类型和组合类型)

PUBLIC: 与其他同名段合并,由连接命令决定连接顺序,每一小分段从小段(16个字节)的边界开始

COMMON: 覆盖


符号定义伪指令

等价伪指令EQU 等号伪指令= 定义符号名伪指令LABEL

WBUF LABLE WORD

BUF DB 200 DUP(0)


汇编地址计数器 $ (当前正在汇编的指令的偏移地址)

置汇编地址计数器 ORG 常数表达式   (设置当前地址计数器的值,使下一字节的地址成为参数表达式的值)

      EVEN (使下一变量或指令开始于偶字节地址)

      ALIGN 常数 (使下一变量或指令开始于常数的倍数)

基数控制伪操作  .RADIX  expression (当使用其他基数表示的常数时,使用此指令)


表达式与运算符

算数运算符

+ -*/ MOD SHL SHR

既可以用于数值表达式也可以用于地址表达式


逻辑运算符

AND ORXORNOT


关系运算符

EQ(相等) NE(不相等)LT(小于)GT(大于)LE(小于等于)GE(大于等于)

属性运算符 PTR


数值返回运算符

SEG 分离变量或标号所在段的首地址

TYPE 分离变量或标号的类型


LENGTH 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,而对于其他情况则送1

SIZE 取出变量所含的数据存储区的大小,返回值为LENGTH*TYPE


字节分离运算符

HIGH 分离出高字节, LOW 分离出低字节

CONST  DW   0ABCDH

MOV   AH, HIGH CONST    ;    0ABHàAH  

子程序

同一模块的不同过程之间的参数传递

通过寄存器传递参数

直接访问模块中的变量

通过地址表穿传送参数地址

通过堆栈传送参数或参数地址

子程序的重入是只子程序被中断后又被中断服务程序说调用,子程序的冲入是被动的进入,递归是主动的进入


宏汇编

宏:具有宏名的一段汇编语句序列(宏定义时书写)

宏指令:这段汇编语句序列的缩写(宏调用时书写)

红展开:宏指令出用这段宏代替的过程(宏汇编时实现)

宏调用的实质是在汇编的过程进行宏展开,用宏定义的代码序列替代宏指令的过程

伪指令

LOCAL:宏定义体采用了标号,要用LOCAL进行说明,必须是宏定义MACRO语句之后的第一条语句

.XALL列出只产生目标代码的宏展开

.LALL列出包括注释项在内的所有宏展开

.SALL不列出任何展开信息

%和&,作为哑元的前缀


重复汇编

在汇编过程中,重复展开一段基本相同的语句




条件汇编

在汇编过程中,根据条件决定汇编的语句

输入输出程序设计

中断的分类

内部中断(软中断): CPU内部原因产生的中断,CPU错误、由INT指令引起的中断、DEBUG设置的中断

外部中断(硬中断): 非CPU内部原因产生的中断,分可屏蔽中断和不可屏蔽中断

从外设发出中断请求道CPU相应中断,有两个决定性的条件

1.该外设的中断请求是否被屏蔽,通过端口21H的中断相应位来决定,相应位为0表示允许中断

2.CPU是否允许响应中断,由CPU的标志寄存器FLAGS中的IF位决定

在一次中断程序处理完成后,应对20H端口发中断结束命令,第5位(EOI)置1.否则以后将屏蔽掉对同级中断的请求



主程序为响应中断应做的准备工作,以及硬件(CPU和外设接口)自动完成的工作:

主程序:(1)设置中断向量

             (2)设置8259A的中断屏蔽位

             (3)设置CPU的中断允许位

硬件:  (4)外设接口送中断请求给CPU

            (5)当前指令执行完后,CPU送响应信号给外设接口

            (6)CPU接收中断类型号

            (7)当前的FLAGS,CSIP入栈

            (8)清除IFTF

            (9)中断向量送IPCS

中断处理程序

    (1)保护寄存器的内容

    (2)如允许中断嵌套,则开中断(STI)

    (3)处理中断

    (4)关中断

    (5)送中断结束命令(EOI)给中断命令寄存器

    (6)恢复寄存器内容

    (7)返回被中断的程序(IRET)


键盘I/O

每当按键动作产生,系统做如下处理:

1.主板上的键盘微控制器获得按键的扫描码,将扫描码放入I/O端口60H,并触发键盘终端INT 09H的中断请求。

2.若允许键盘中断,且CPU开中断,可进入INT 09H的ISR

3.INT 09H的ISR从端口60H读扫描码,并根据对应按键动作做出相应处理。如果是非变 换键和非特殊请求键,则生成一个16位值,存入键盘缓冲区,低字节ASCII码,高位字节扫描码。INT 09H的ISR不将按键的断码放入BUFFER

BIOS键盘中断INT 16H

显示器I/O

显存地址B000:0000、B800:0000,低字节ASCII码,高字节属性值,BIOS显示终端INT 10H


汇编语言(各章知识点) 课程介绍 第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 习题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值