汇编语言源程序

image.png

  • 汇编语言源程序:用助记符编写
  • 汇编程序:源程序的编译程序

    程序执行过程

    image.png

    语句类型和格式

    语句类型

  • 指令性语句:CPU 执行的语句,能够生成目标代码

  • 指示性语句:CPU 不执行,由汇编程序 (编译器) 执行的语句,不生成目标代码

    语句格式

    指令性语句:
    [标号:]\quad[前缀]\quad 助记符 \ quad[操作数],[操作数]\quad[; 注释][标号:][前缀]助记符 quad[操作数],[操作数][;注释]

  • 串操作指令的助记符前面可以加前缀,前缀不是指令,它表示一种循环重复执行的概念,和助记符连在一起可构成循环体

    • 无条件重复前缀
    • 条件重复前缀
  • 标号代表指令的符号地址
  • 标号后要有冒号

指示性语句:
[名字]\quad 伪指令助记符 \ quad 操作数 [, 操作数,···]\quad[; 注释][名字]伪指令助记符 quad操作数[,操作数,⋅⋅⋅][;注释]

  • 名字是变量的符号地址,其后不加冒号

    语句中的操作数

  • 寄存器

  • 存储器单元
  • 常量

image.png

  • 变量或标号

image.png

  • 表达式
    • 算术运算:加减乘除、取模
    • 逻辑运算:与或非异或
    • 关系运算
    • 取值运算和属性运算
    • 其他运算

image.png image.png

  • LENGTHOF 运算符:计算数组中元素的个数
  • TYPE 运算符返回变量单个元素的大小,这个大小是以字节为单位计算

    伪指令

  • 伪指令:由汇编程序 (编译器) 执行的“指令系统”

  • 作用: 帮助计算机理解指令性语句

    • 定义变量;
    • 分配存储区
    • 定义逻辑段;
    • 指示程序开始和结束;
    • 定义过程

      数据定义伪指令

  • 用于定义数据区中变量的类型及其所占内存空间的大小

  • 格式:

image.png

  • 数据定义伪指令助记符:
    • DB(Define Byte):定义的变量为字节型
      • 每一个操作数占一个字节单元
    • DW(Define Word):定义的变量为字类型
      • 每一个操作数占一个字单元
    • DD(Define Double Word):定义的变量为双字型
    • DQ(Define Quadword):定义的变量为四字型
    • DT(Define Tenbytes):定义的变量为十字节型

定义字符串必须用 DB 伪指令助记符
【例】数据定义伪指令定义的变量在内存中的分布
image.png image.png

  • 重复操作伪指令助记符:用于分配存储区

image.png

  • ?“的作用:

image.png
【例】变量在内存中的存储分配
image.png image.png

符号定义伪指令

image.png

  • 作用类似 C 语言中的宏

    段定义伪指令

    image.png

  • 用来定义一个逻辑段

  • 逻辑段的段名就是段基地址 (一个数)

【例】段定义伪指令
image.png

设定段寄存器伪指令

image.png

  • 用段寄存器标识逻辑段是什么段

    • 数据段
    • 附加段
    • 堆栈段
    • 代码段

      结束伪指令

      image.png
  • 标号通常是第一条指令性语句前的标号

    源程序基本结构

    image.png
    【例】一个完整源程序结构
    image.png

  • 段寄存器初始化后次系统才会分配前面定义的内存空间

    过程定义伪指令

    image.png

  • 用来定义一个子程序

  • 过程名是子程序第一条指令性语句在内存的符号地址
  • 若为近过程,NEAR可省略
  • 过程体的最后一条指令必须是RET

【例】过程定义及调用
image.png

  • 子程序用到的寄存器,为了不影响调用程序的寄存器原来的值,需要在执行子程序之前,将调用程序原来寄存器的值保存到堆栈,在执行子程序结束后,将调用程序原来寄存器的值从堆栈恢复(先进后出)

    宏命令伪指令

    image.png

  • 与子程序的不同:不能通过编译链接,成为一个独立的程序,只能是源程序的一部分,不能被其他源程序调用

【例】宏定义与宏调用
image.png

  • 该宏的作用:X+Y 赋给 Z

    调整偏移量伪指令

    image.png
    image.png

    流程控制伪指令

    .REPEAT 伪指令执行循环体,然后测试 .UNTIL 伪指令后面的运行时条件:

    1. .REPEAT
    2. statements
    3. .UNTIL condition

    .WHILE 伪指令在执行循环体之前测试条件:

    1. .WHILE condition
    2. statements
    3. .ENDW

    INVOKE 伪指令

  • 将参数入栈并调用过程

  • INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:

    1. INVOKE procedureName [, argumentList]
  • ArgumentList 是可选项,它用逗号分隔传递给过程的参数