返回

微机原理笔记04-汇编语言程序设计

汇编语言源程序

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

程序执行过程

语句类型和格式

语句类型

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

语句格式

指令性语句:

$$[标号:]\quad[前缀]\quad助记符\quad[操作数],[操作数]\quad[;注释]$$

  • 串操作指令的助记符前面可以加前缀,前缀不是指令,它表示一种循环重复执行的概念,和助记符连在一起可构成循环体
    • 无条件重复前缀
    • 条件重复前缀
  • 标号代表指令的符号地址
  • 标号后要有冒号

指示性语句:

$$[名字]\quad伪指令助记符\quad操作数[,操作数,···]\quad[;注释]$$

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

语句中的操作数

  • 寄存器
  • 存储器单元
  • 常量
  • 变量或标号
  • 表达式
    • 算术运算:加减乘除、取模
    • 逻辑运算:与或非异或
    • 关系运算
    • 取值运算和属性运算
    • 其他运算
  • LENGTHOF运算符:计算数组中元素的个数
  • TYPE运算符返回变量单个元素的大小,这个大小是以字节为单位计算

伪指令

  • 伪指令:由汇编程序(编译器)执行的“指令系统”
  • 作用: 帮助计算机理解指令性语句
    • 定义变量;
    • 分配存储区
    • 定义逻辑段;
    • 指示程序开始和结束;
    • 定义过程

数据定义伪指令

  • 用于定义数据区中变量的类型及其所占内存空间的大小
  • 格式:
  • 数据定义伪指令助记符:
    • DB(Define Byte):定义的变量为字节型
      • 每一个操作数占一个字节单元
    • DW(Define Word):定义的变量为字类型
      • 每一个操作数占一个字单元
    • DD(Define Double Word):定义的变量为双字型
    • DQ(Define Quadword):定义的变量为四字型
    • DT(Define Tenbytes):定义的变量为十字节型

定义字符串必须用DB伪指令助记符

【例】数据定义伪指令定义的变量在内存中的分布

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

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

符号定义伪指令

  • 作用类似C语言中的宏

段定义伪指令

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

【例】段定义伪指令

设定段寄存器伪指令

  • 用段寄存器标识逻辑段是什么段
    • 数据段
    • 附加段
    • 堆栈段
    • 代码段

结束伪指令

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

源程序基本结构

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

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

过程定义伪指令

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

【例】过程定义及调用

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

宏命令伪指令

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

【例】宏定义与宏调用

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

调整偏移量伪指令

流程控制伪指令

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

1
2
3
.REPEAT
  statements
.UNTIL condition

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

1
2
3
.WHILE condition
  statements
.ENDW

INVOKE伪指令

  • 将参数入栈并调用过程
  • INVOKE 是 CALL 指令一个方便的替代品,因为,它用一行代码就能传递多个参数。常见语法如下:
1
INVOKE procedureName [, argumentList]
  • ArgumentList 是可选项,它用逗号分隔传递给过程的参数
Built with Hugo
Theme Stack designed by Jimmy