汇编语言程序结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简化段定义
宏汇编语言中包括三类语句:
机器指令语句:
汇编后形成机器代码,在执行时引起机器操作
伪指令语句:
不形成机器代码,只在汇编过程中起作用
宏指令语句:
汇编语言语句格式 指令的格式:
[标号:] 操作码项 [操作数项] [;注释项]
伪指令格式:
[变量名] 伪指令助记符 [操作数项] [;注释项]
ARRAY1 DB 1, 3, 4, 5, 6 COUNT1 EQU $-ARRAY1 …… MOV CX, COUNT1 ARRAY2 DW 1,3,4,5,6 COUNT2 EQU ($-ARRAY2)/2 …… MOV CX, COUNT2 $
运算符与表达式
表达式是由一些常数、标号、变量和运算符组合而成
例: MOV CX,SIZE FEES 汇编时回送200(200个字节), 表明从FEES开始,分配给FEES变量200个字节
汇编语言程序结构
汇编语言程序的基本结构
完整段定义框架
STACK SEGMENT …… STACK ENDS DATA SEGMENT …… DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
简化段定义框架
.MODEL SMALL .386 .STACK ;堆栈段 .DATA ……
注意: 单引号和双引号作用相同
重复操作符 DUP
格式: 重复次数 DUP(操作数,…,操作数)
例1: ARRAY DW 100 DUP(?) 功能:从ARRAY开始保留100个字类型存储缓冲区 (共200个字节)
ARRAY DB 2 DUP(0,1,2,?)
等价于ARRAY DB 0,1,2,?,0,1,2,?
修改:
MOV AX,WORD PTR OPER1 ;执行后AX内容0201H MOV AL,BYTE PTR OPER2 ;执行后AL内容34H
变量
变量经常在操作数段出现,是数据的存储单元地址。 变量有三种属性 段 定义变量的段起始地址,此值必须在一个段寄 存器(DS、ES、SS)中 偏移 变量的偏移地址是16位无符号数,它代表从段 起始地址到定义变量的位置之间的字节数。 类型 例:A1 DB 1,2,3,4,5,8,90,67,23,100 COUNT EQU $-A1
可以用数据定义伪指令定义一个表(数组) 或一个字符串
POWER1 DB 1,4,8,19,27,46,23 POWER2 DB 0,0,0,0,0,0,0,0,0,0 POWER3 DB ‘How are you ?’ ;每个字符占一个字节,存其ASCII码
变量和数据都具有段和偏移属性,同时也隐 含着类型属性。 如:
变量 标识符
最多由31个字母、数字及规定的特殊字符 (?@ _ $)等组成,不能用数字开头。
定义原则:
不能以数字开头 不能单独使用特殊字符 不能使系统的保留字,如指令名、寄存器 名和伪指令名等。 例:FFFFH 是标识符 0FFFFH 是十六进制数
变量定义及存储器分配伪指令
为数据项分配存储空间
如果是变量,则汇编程序将返回该变量以字节数表 示的类型值:
DB为1、DW为2、DD为4、 DF为6、DQ为8、DT为10
如果是标号,则汇编程序将回送标号类型值:
NEAR为-1、FAR为-2
ARRAY DW 1,2,3 ADD SI,TYPE ARRAY ;汇编时回送值2 汇编后:ADD SI,2
FEES DW 1,2,3,4,5….;100个数 MOV CX,LENGTH FEES 汇编后: MOV CX,1 例:
SIZE 回送字节数
格式: SIZE 变量 操作: 回送分配给该变量的字节数 SIZE =LENGTH×TYPE 单元数 类型值
注意:
SIZE 和LENGTH只有对DUP定义的变量有意义
内存空间表达式 ?
汇编后,这些单元的初值为任意
例: ONE DB ? ;为变量ONE分配一个字节的空间
TWO DW ?,?,? ;为变量TWO 分配了3个字单元空间
THREE DD ? ; 为变量THREE分配了一个4字节的存储单元
为存储单元定义数据:用数值初始化存储单元
例: A1 DB 10 A2 DW 01100100B,100H A3 DW OFFSET NEXT ;标号NEXT的偏移地址值0028存入A3单元 ADD1 DD NEXT ;标号NEXT的32位地址指针存入ADD1单元 B1 DW A1 ;B1中存储A1的偏移地址 …… 3000: 0028 NEXT:MOV BX,AX …… 标 号
例:
LENGTH 回送单元数
格式: LENGTH 变量
注意:
只对内存变量符号名有效,不能对标号操作 当变量中使用DUP情况,汇编程序将回送分配给该变量的单元数 而对于其它情况则回送值1 FEES DW 1,2,3,4,5….;100个数 MOV CX,LENGTH FEES 汇编后:MOV CX,1 例: FEES DW 100 DUP(0) MOV CX,LENGTH FEES 汇编后:MOV CX,100 例:
数组求和
完整段定义
.MODEL SMALL .DATA ARRAY DB 1,4,6,9,2 SUM DW ? .STACK DW 100DUP(?) .CODE .STARTUP MOV AX, 0 MOV SI, 0 MOV CX, 5 AGN: ADD AL, ARRAY[SI] ADC AH, 0 LOOP AGN INC SI MOV SUM, AX .EXIT END
格式:
[变量名] 助记符 [操作数 ] [; 注释]
用符号地址表示, 注意后边不跟冒号
一个或多个,多 个参数之间逗号 分隔
用来对伪指令进行 说明
助记符
助记符
DB DW DD DQ DF DT
数据类型
字节 字 双字 四字 六字节 十字节
字节个数
1 2 4 8 6 10
注意:存储顺序均为
低位在前(低地址处) 高位在后(高地址处)
例:COUNT EQU 100 ;数值赋予符号名 NUM1 EQU COUNT+100 ;表达式值200赋予NUM1 DATA EQU HEIGHT+12 ;地址表达式本身赋予符号名 PORT1 EQU CX
;PORT1是CX的代名词,即CX本身赋以符号名
CBD EQU DAA ;指令助记符本身赋予符号名 B EQU [BP+8] ;相对变址引用本身赋予符号名
类型属性
用来指明该标号是在本段内引用,还是在其它段中引用。如 在段内引用则称NEAR,指针长度为 2字节;如在段外引用 则称FAR,指针长度为4字节。
赋值伪指令
格式:符号名 EQU 表达式 功能:给表达式赋予一个名字,使EQU两边等价 表达式可以是: 有效的操作数形式 能求出常数值的表达式 有效的助记符
注意:表达式的运算是在汇编的过程中完成的

算术运算符 逻辑运算符 关系运算符 数值回送操作符 属性操作符
算术运算符:
+ - × / MOD(模除、取余) 注意: 在数字表达式中,可以使用这5种运算符 在地址表达式中,可以使用+- 例如: SUM和SUM+1单元的字节操作数相加。 MOV AL,SUM ADD AL,SUM+1 ;地址表达式,直接寻址 在汇编时将计算出SUM+1的值。
MOV BX,((PORT LT 5)AND 20) OR ((PORT GE 5)AND 30)
此运算汇编时完成 当 PORT<5时 汇编后 MOV BX,20 当PORT≥5时 汇编后 MOV BX,30
数值回送运算符
TYPE、LENGTH、SIZE、OFFSET、SEG
格式: TYPE 变量/标号
;数据段
START:MOV AX,DATA MOV DS,AX …… MOV AX,4C00H INT 21H CODE ENDS END START
.CODE .STARTUP ;代码段 …… .EXIT ;返回DOS END
DATA SEGMENT ARRAY DB 1,4,6,9,2 SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SATRT: MOV AX, DATA MOV DS, AX MOV AX, 0 MOV SI, 0 MOV CX, 5 AGN: ADD AL, ARRAY[SI] ADC AH, 0 LOOP AGN INC SI MOV SUM, AX MOV AH, 4CH INT 21H CODE ENDS END START
标号:在代码段中定义,后跟冒号:
(这是标号和变量的重要区别) 标号经常出现在转移指令或CALL指令的操作数项,用 以表示转移地址。 标号有三种属性 段属性
定义标号的段起始地址,此值必须在一个段寄存器中,而标 号的段则总是在CS寄存器中。
偏移属性
标号的偏移地址是16位无符号数,它代表从段起始地址开始 到定义标号的位置之间的字节数。
当前位置计时器 $ $:当前地址的偏移值
X1 DB 1, 2, 3, 5 LEN1 EQU $-X1 ;LEN1=4 X2 DW 1234H LEN2 EQU $-X2 ;LEN2=2
X1 1000:2000H 01H 02H 03H 05H X2 1000:2004H 34H 12H
实际应用:求数组的长度
功能:执行OUT指令时,(AL)该端口中 执行结果:
当PORT端口号为偶数时,输入端口与输出端口是一个 当PORT端口号为奇数时,输入端口比输出端口大1
关系运算符
EQ(等于)、NE(不等于)、LT(小于)、 GT(大于)、LE(小于等于)、GE(大于等于)
计算结果为逻辑值:
关系成立, 结果为真,值为1 关系不成立,结果为假,值为0 例:
DUP操作符可以嵌套
A1 DB 3DUP(1,2,3,2DUP(‘ABC’),3DUP(8,7,2DUP(?))) 分配给A1的数据缓冲区共多少个字节?
OPER1 DB 1,2 OPER2 DW 1234H,5678H … MOV AX, OPER1 ;类型不匹配,出错 MOV AL, OPER2 ;类型不匹配,出错
等号伪指令(=)
最主要的区别 用EQU定义的符号,在一个程序中不能再定义 “=”伪指令可以重定义 例: EMP EQU 6 EMP=6 “=”伪操作中可以多次定义: 如: ….. EMP=6 ….. EMP=EMP+1 ….. 说明:在EQU或“=”右边表达式中如果有变量或 标号的话,则在该语句前应该给出它们的定义。
汇编语言的数据
常量
整数: 二进制数:01100100B 数字0、1 十进制数:64或64D 数字0~9 八进制数:376Q或376O 数字0~7 十六进制数:8FFFH、0C800H 数字0~9、A~F、a~f 字符与字符串常数: ‘A’ 值41H 一个字节 ‘1234’ 值31323334H 四个字节 符号常量: 常量名 EQU 表达式 X EQU 100
例1: 把首地址为BLOCK的字数组的第5个字送到AX中 MOV AX, BLOCK+(5-1)*2 例2: 将数组长度存到CX中 ARRAY DD 1,2,3,4,5,6,7 COUNT DW ? …… MOV CX,(COUNT-ARRAY)/4
COUNT EQU ($-ARRAY)/4 COUNT DW ($-ARRAY)/4
DA1 DB 1,2,3,4,5 DA2 DW 1,2,3,4,5 DA3 DD 1,2,3,4,5
用DB伪指令定义字符串操作数时,可以分别写 多个字符,也可以写一个多字符的串形式。
STRING1 DB ‘H’,‘E’,‘L’,‘L’,‘O’ STRING2 DB ‘HELLO’ STRING3 DB “HELLO”
逻辑运算符
AND OR XOR NOT SHL SHR 注意: 是运算符,不是操作码,要认真加以区别。 逻辑运算符是按位操作的。运算在汇编过程完成 只能用于数字表达式中。
例:IN AL,PORT ; 这是外设端口地址的符号名 OUT PORT AND 0FEH, AL
;此逻辑运算在汇编时完成,结果是某一端口号
相关文档
最新文档