预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共63页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

微机原理与接口技术本章内容4.1概述-程序设计语言4.1概述-汇编程序4.2汇编语言的格式与语法4.2.1源程序的结构4.2.1源程序的结构4.2.1语句的格式标号:指令的符号地址,用来代表指令在存储器中的地址 符号:段、过程、变量的名字,用来代表它们在存储器中的地址 指令助记符:8086指令助记符、伪指令助记符 操作数:即指令的操作对象 对指令性语句:0,1,2个 对指示性语句:根据需要而定 操作数之间以逗号分隔 操作数可以由标号、常量、变量、表达式、寄存器操作数和存储器操作数等构成 例如:AX,[DI+BX+10],DATA,200,16*8+TABLE,等等注释:以分号开头,可放在指令后,也可单独一行。注意注释的写法,要写指令(或程序段)在程序中的作用,而不要写指令的操作。 例如:以下为同一条指令写的注释 1)MOVCX,100;传送100到CX 2)MOVCX,100;循环计数器置初值 显然,第二种写法要比第一种写法要好4.2.3语句的操作数4.2.3.1常量变量:指存储器存储单元中的数据,数据运行时可改变 变量名:是存储单元的符号地址 变量在程序中作为存储器操作数被引用 变量有三个属性: 段地址:变量所在段的段地址 偏移地址:变量所在存储单元的偏移地址 类型:有BYTE、WORD和DWORD等 例:MOVAX,VAR PUSHVAR标号:指令所在存储单元的符号地址 标号的三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类型:NEAR或FAR: NEAR:段内转移或段内调用 FAR:段间转移或段间调用 标号通常作为转移指令的转移地址 JMPlabel JNZnon_zero组成:A-Z(不分大小写),0-9,?@._$ 不能以数字开头,句号(.)只能作为首字符 长度小于31个字符 不能与保留字(指令助记符、伪指令、预定义符号等)重名 不能重复定义 例如: 正确的:LP1,AGAIN,NEXT,_GO,OK_1 错误的:4M,LOOP,AAA,#HELP,+ONE4.2.3.3表达式算术运算符包括:加:+,减:-,乘:*,除:/,取模:MOD 例:MOVAX,4*1024汇编后的形式为:MOVAX,4096 逻辑运算符包括:与:AND、或:OR、异或:XOR、非:NOT 例:MOVCL,36HAND0FH经汇编后:MOVCL,06H 逻辑运算符只能用于数字表达式中。 注意,不要把逻辑运算符与逻辑运算指令混淆: 例:ANDAX,3FC0HAND0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与以下指令等价: ANDAX,3F00H 分析运算符包括:SEG、OFFSET SEG:取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 例:VARDB12H MOVBX,OFFSETVAR;取变量VAR的偏移地址 MOVAX,SEGVAR;取变量VAR的段地址 SEG、OFFSET运算符在汇编过程取相应地址4.2.3.3表达式—属性运算符PTR例:MOV [DI],0;类型不定 MOV BYTEPTR[DI],0;字节类型 MOV WORDPTR[DI],0;字类型4.2.3.3表达式—属性运算符PTR4.2汇编语言的格式与语法4.2.4伪指令4.2.4伪指令—数据定义伪指令DATA1_BDB10 DATA2_BDB5 DATA3_BDB10H DATA1_WDW100H DATA2_WDW-4 DATA_DDD0FFFBH 汇编后的内存分配情况 如右图所示。操作数可以是字符串,使用DB,DW 例 STR_DBDB‘HELLO’ STR_DWDW‘AB’,‘CD’ 汇编后的情况如图:?用来分配存储空间,但不置初值 例1:RSVDB? 复制操作符DUP: 重复的数据可以使用复制操作符DUP,如上面RSV亦可写成: 例2: STRDB10DUP(‘A’) DATADB10DUP(30H,9DUP(20H)) 若操作数中若使用$,则表示的是地址计数器的当前值。 例3BUFDW0A32H,$,$+3 数据元素的初值:ADDR+1,(ADDR+2)+3例:TABLEDB10DUP(?) BUFFERDWTABLE,$+3 设TABLE的偏移地址为0080H,则汇编后如下图所示:4.2.4伪指令—符号定义伪指令:EQU4.2.4伪指令—段定义伪指令SEGMENT和ENDS成对出现,二者前面的段名应一致 伪指令SEGMENT说明了一个段的开始 伪指令ENDS说明了一个段的结束 数据段用于对程序中使用的变量进行定义,堆栈段用于对堆栈进行定义,数据段和堆栈段由指示性语句构成;代码段由指令性语句构成。 例如:data_segSEGMENT <汇编语句> data_segENDS4