计算机硬件基础——第六章:汇编语言程序设计

汇编语言概述

程序处理过程

  • 1.编写源程序(文件名 .ASM)
  • 2.编译成目标文件(文件名 .OBJ )
    1. 生成可执行文件(文件名 .EXE )
    1. 调试,运行程序

程序的格式

  • 每个语句可以由 四项组成

  • 指令性语句格式

    • [标号 :]指令助记符 [操作数,操作数] [ ; 注释]
    • 标号与指令助记符之间用冒号分隔
    • 指令助记符与操作数之间用空格分隔
    • 操作数之间用逗号分隔
    • 操作数与注释之间用分号分隔
    • 表示可选项
  • 伪指令语句格式

    • [名称] 伪指令指示符 [参数] [;注释]
    • 名称与伪指令指示符之间用空格分隔
    • 伪指令指示符与参数之间用空格分隔
    • 参数之间用逗号分隔
    • ‘参数与注释之间用分号分隔
    • 表示可有可无
  • 标号和名称

    • 代表该语句的存储器地址
    • 标号在一些指令中充当操作数,用来表示转移地址
    • 名称可以是常量名,变量名,段名,过程名,宏指令名等。
    • 名称在一些指令中充当直接寻址方式的符号地址
  • 标号和名称的命名规则

    • 可用符号

      • 数字

      • 字母

      • 特殊符号

        • $
        • @
        • _
    • 不区分字母的大小写

    • 不能使用保留字和关键字

    • 长度不能超过31个字符

    • 数字不能做开头

数据项和表达式

  • 数据项

    • 常数

      • 十进制用D结尾
      • 十六进制用H结尾 A~F开头时加 0
      • 八进制用Q结尾
      • 二进制用B结尾
    • 寄存器

    • 存储器

    • 变量

      • 通常指存放在存储单元中的值
    • 标号

      • 可执行指令语句的地址和符号表示

      • 段值:标号所在段的段地址

      • 段内偏移地址:标号所在地址与所在段地址之间的偏移量

      • 类型:转移指令中标号可转移的距离

        • NEAR:表示近标号,段内转移
        • FAR:表示远标号,段间转移
  • 表达式

    • 运算对象

      • 常量
      • 变量
      • 标号
    • 运算符

      • 算术运算符

        • 加减乘除,MOD,左移SHL ,右移SHR
      • 关系运算符

        • EQ = 、 NE != 、 GT >

        • LT < 、LE <= 、 GE >=

        • 必须是数值,结果是一个常数

        • 字长16位时

          • 关系成立

            • 结果为 0FFFFH
          • 关系不成立

            • 结果为 0000H
      • 属性运算符

      • 逻辑运算符

        • AND,OR,NOT,XOR
        • 只能用于数值表示
        • 地址表达式没有意义
      • 数值返回运算符

        • OFFSET 返回偏移地址
        • SEG 返回段基址
        • TYPE 返回元素字节数
        • LENGTH 返回变量单元数
        • SIZE 返回变量总字节数

系统功能调用和动态调试

为了节省系统程序猿的编程工作量和优化程序结构

在DOS中预先设计好了一系列的通用子程序

DOS

  • 提供包括基本输入输出管理
  • 内存储器读写管理
  • 磁盘文件的读写管理
  • 时间和日期的设置功能

调用方法

  • 使用软中断指令

    • INT n
    • n为中断类型号

步骤如下

  • 在AH寄存器中设置系统功能调用号
  • 在指定的寄存器中设置入口参数
  • 用INT 21H 指令 执行功能调用
  • 根据出口参数分析功能调用执行情况

1号功能

  • 从键盘输入一个字符并回显

  • 入口参数无

  • 出口参数

    • AL<——键入字符的ASCII码

2号功能

  • 在屏幕当前位置显示DL寄存器中的字符,并将光标后移一格

  • 入口参数

    • DL<——显示字符的ASCII码
  • 出口参数无

10号功能

  • 从键盘接受一个字符串,并存入用户定义的输入缓冲区内,回车结束

  • 首地址放长度,下一地址放实际长度,随后放接收的第一个字符

  • 入口参数

    • DS:DX <——缓冲区首地址
  • 出口参数无

9号功能

  • 将当前数据区DS:DX所指向的以“$"结尾的字符串显示在显示器上

  • 入口参数

    • DS:DX <——字符串首地址
  • 出口参数无

4CH号功能

  • 由.EXE文件返回DOS

调试

  • 进入调试 debug eg1.exe
  • 查看寄存器 R
  • 查看标志寄存器 RF
  • 查看主存 D
  • 反汇编 U
  • 单步操作 T
  • 执行命令 G
  • 退出调试 Q

80X86汇编语言伪指令

伪指令语句在汇编期间进行处理

  • 变量定义
  • 存储器分配
  • 指示程序开始和结束
  • 定义段
  • 段分配

数据定义伪指令

  • 为变量存储空间,赋初值

  • 格式

    • [变量名] 伪指令 初值表 [ ; 注释 ]
  • 类型

    • DB 定义字节
    • DW 定义字
    • DD 定义双字
    • DT 定义十字节 用于 BCD 码
    • DQ 定义四字

符号定义伪指令

  • 给一个数值,字符串或表达式赋予一个名字

  • 格式

    • [符号名] 伪指令 表达式或数据 [ ; 注释 ]
  • 类型

    • EQU 等值
    • = 等号
    • LABEL 类型定义

段和过程定义伪指令

  • 段定义伪指令用来定义汇编语言源程序的逻辑段

    • 段定义 SEGMENT/ENDS

      • 格式

        • 段名 SEGMENT [ 定位类型 ] [ 组合类型 ] [ 类别 ]

          • 定位类型

            • PAGE 段起始地址的低8位为0 ,从页边界开始
            • PARA 段起始地址的低4位为 0 , 从节边界开始
            • WORD 段起始地址的低1位为0 ,从字边界开始
            • BYTE 段起始地址任意定义,从字节边界开始
          • 组合类型

            • 说明 逻辑段装入内存时,如何与其他段组合
            • NONE 表示本段和其他段不发生关系 (默认)
            • PUBLIC 同名同类型的段相邻地连接到一起,具有共同的段地址
            • STACK 和PUBLIC 一样,但是用于 堆栈段
            • COMMON 所有同名类型段具有相同地址,都后面的会覆盖前面的,用于共享数据
            • MEMORY 本段定义在其他段之后
            • AT 本段定义在表达式指定位置,但是代码段不能用
          • 类别

            • 用户自定义的类别名
            • 单引号括起来
        • 段名 ENDS

    • 假定 ASSUME

      • 出现在代码段中,告诉汇编程序,如何设定各段与对应段寄存器的相互关系

      • 格式

        • ASSUME 段寄存器名:段名[ ,段寄存器名:段名,……]
        • ASSUME CS : CODE , DS : DATA ,SS : STACK
  • 过程定义伪指令用来定义子程序

    • 主程序可以按照过程名进行调用

    • 格式

      • 过程名 PROC [NEAR / FAR ]
      • 过程名 ENDP
    • [ NEAR / FAR ] 说明距离属性, 默认 NEAR

    • 至少有一条返回指令 RET

  • 程序结束伪指令 END

    • 格式

      • END 标号
    • 注意

      • 源程序中必须有END 结束语句
      • 有效语句都要在END之前
      • 标号是程序中第一句指令性语句的标号

80X86汇编语言程序结构

好的程序

  • 结构化,简明,易读,易调试,易维护
  • 执行速度快
  • 占用存储空间少

常见程序结构

  • 顺序结构
  • 分支结构
  • 循环结构
  • 子程序结构

请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值