汇编程序设计
2018-03-30 18:03:41 1 举报
AI智能生成
汇编语言程序设计知识点
作者其他创作
大纲/内容
汇编程序功能
主要功能
检查汇编语言源程序
给出源程序中的出错信息
产生源程序的目标程序
展开宏指令
框架
代码段
数据段
附加段
堆栈段
伪指令
是说明性语句
类型
处理器选择伪指令
段定义伪指令
定位类型
PARA:指定段的起始地址必须从小段边界开始,起始地址为16的倍数
BYTE: 指定段可以从任何地址开始
WORD:指定段必须从字的边界开始
PAGE:指定段必须从页的边界开始时,也就是该地址的最低两个16进制数必须为0
组合类型
PRIVATE: 连接是将不与其他模块种的同名分段合并
PUBLIC: 连接时可以把不同模块种同名分段连接而形成一个段。连接次序由连接命令指定
COMMON:
AT expression
MEMORY
STACK
使用类型
USE16 使用16位寻址方式
USE32 使用32位寻址方式
类别
在引号中定义段的类别名。同类别名的分段的位置靠在一起
格式
ASSUME sreg: segment name,....,sreg:segment name
程序开始和结束伪指令
开始
NAME module_name || TITLE text
结束
END [label]
数据定义及存储器分配伪指令
格式
[Variable] Menmonic Operand,...,Operand [;Comments]
助记符字段
DB
OK DB 'OK'
占两个字节,顺序就是 'O','K'
DW
OK DW 'OK'
占一个字,也是两个字节,但是是字序,即'K’,'O'
DD
DQ 四个字
DT 十个字节
DF 六个字节
操作数
常数
表达式
字符串
?
变量或标号
类型属性
PTR
LABEL
不分配空间,所以需要让一段空间以另一种类型访问时需要它
表达式赋值伪指令
EQU
不允许重复定义
=
允许重复定义、
地址计数器与对准伪指令
ORG
给汇编程序设置位置指针 ,指定下面语句的起始偏移地址
基数控制伪指令
汇编语言程序格式
[name] operation operand [;comment]
名字项
标号,有冒号
段属性:标号所在段的段基址
偏移属性:从段基地址到定义标号的位置之间的字节数。用16/32位的无符号数表示
类型属性:用来指定改标号是在本段内应用(NEAR),还是在其他段引用。
变量,无冒号
段属性:变量所在段的段基址
偏移属性:从段基址到定义变量的位置之间的字节数。用16/32位的无符号数表示
类型属性:定义该变量所占的字节数。如BYTE,WORD,DWORD
常量
操作数项
算术运算
逻辑和移位运算
关系运算
数值回送运算
TYPE variable or label
变量
BYTE返回1,WORD返回2,DWORD返回4
标号
则near标号回送-1,far标号回送-2
常量
回送0
LENGTH variable
对于DUP定义的变量,回送分配的单元数
其他情况回送1
SIZE variable
回送分配给该变量的字节数(length*type)
OFFSET variable/label
回送变量或标号的偏移地址
SEG variable/label
回送变量或标号所在段的起始地址(段基址)
LOW/HIGH
分别返回低字节和高字节
属性操作
type PTR variable/label
变量或标号被强制声明为type
mov [BX] ,10h;错误,不知道只字还是字节
其他
汇编语言的开发过程
COM文件
EXE文件
DOS系统
mov ax,4c00h
int 21h
int 21h
读入并回显
单个字符
mov ah 01h
int 21h
int 21h
结果在AL
多个字符,终结与回车(0DH)
mov ah 0ah
ds:dx=缓冲区首址
ds:dx=缓冲区首址
显示
单个字符
mov ah 02h
int 21h
int 21h
数据在DL
字符串
mov ah 09h
ds:dx=字符串首地址(以$结束)
ds:dx=字符串首地址(以$结束)
EXE文件
程序结构基本概念
顺序结构
循环结构
分支结构
子程序结构
复合结构
循环程序设计
初始状态
循环体
循环控制
分支程序设计
转移指令时实现基础
倚靠标志位体现
倚靠标志位体现
switch
mov bx,offset table
mov al,item
shl al,1 ;x2
xor ah,ah
add bx,ax
jmp word ptr[bx]
子程序设计
子程序的定义方式
procedure_name PROC NEAR/FAR
...
procedure_name ENDP
...
procedure_name ENDP
子程序调用和返回
调用:call near/far ptr sub
段内调用只压IP
子程序定义在调用过程之外
子程序定义在调用过程之内
段间调用还要压CS
保存和回复寄存器
原则:子程序中被破坏的寄存器均需要保存
注意:将寄存器保存和恢复放在调用程序中不是好的编程风格
参数传递方法
通过寄存器传送参数
特点:参数传递快,但参数个数受寄存器数量限制
要显示出来的数据放在DL中
读入的数据放在AL中
通过存储器传送变量
特点:适合参数较多的情况,但是尽量避免直接使用变量传递参数,会造成子程序过度依赖具体变量而影响子程序的通用性
在子程序中使用DATA中的变量地址访问
相当于操作全局变量
有很多局限性
通过地址表传送参数地址
table里放各种参数
通过堆栈传送参数或参数地址
调用之前将参数压入堆栈,子程序通过访问堆栈空间获得参数。
参数是局部的
子程序的递归调用
子程序的嵌套定义
与高级语言的接口
宏汇编
宏:源程序中一段有独立功能的程序代码
宏定义:macro_name MACRO [哑元表]
......
ENDM
......
ENDM
宏调用:macro_name [实元表]
宏中标号的使用
LOCAL列出所有的标号
宏展开是会为每个局部标号建立唯一的符号
与子程序的区别
节省代码性
子程序是call和ret指令的执行结果,是在程序执行过程中处理的。子程序的多次调用比不用子程序更节省代码
宏是汇编过程中展开的效果,但不节省代码
多次调用
子程序在程序执行期间被调用,只占用自身大小的一段空间
宏调用是在汇编期间被展开,没调用一次就展开一次
特点
子程序
优点:模块化,目标代码较短,可被多次调用
缺点:额外开销大,增加了执行时间。适用于子功能代码较长、调用比较频繁的情况
宏调用
优点:参数传送简单,编程灵活,执行速度没有改变。
缺点:不缩短目标代码长度,适用于子功能代码较短、传参较多的情况
0 条评论
下一页