1、 汇编语言程序的格式汇编语言程序的格式 汇编语言程序的上机过程汇编语言程序的上机过程 伪指令语句伪指令语句 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 了解汇编语言程序的基本格式,及了解汇编语言程序的基本格式,及其上机过程。其上机过程。熟练掌握数据定义伪指令、段定义熟练掌握数据定义伪指令、段定义伪指令、符号定义伪指令、过程定伪指令、符号定义伪指令、过程定义伪指令。义伪指令。熟练掌握汇编语言程序设计的一般熟练掌握汇编语言程序设计的一般步骤以及顺序程序、分支程序、循步骤以及顺序程序、分支程序、循环程序、子程序设计的方法。环程序、子程序设计的方法。伪指令伪指令NoImage5.1 5.1
2、汇编语言与汇编程序汇编语言与汇编程序5.1.1 汇编语言的基本概念汇编语言的基本概念1 机器语言与汇编语言机器语言与汇编语言(Machine Language and Assembly Language)由二进制代码由二进制代码0 0,1 1表示的指令称为表示的指令称为机器机器指令指令,相应的程序称为机器语言程序,相应的程序称为机器语言程序。用指令助记符表示的用指令助记符表示的指令称为指令称为汇编语言汇编语言指令指令,对应的程序称为汇编语言程序。,对应的程序称为汇编语言程序。NoImage 例例5-1 将将4位二进制数转换为位二进制数转换为ASCII码字码字符。当数在符。当数在0000B-10
3、01B时,对应的时,对应的ASCII码码为为09;当数在;当数在1010B1111B时,对应的时,对应的ASCII码为码为AF。设待转换的数据已在累加器设待转换的数据已在累加器AL中中(低(低4位)。位)。编制的机器语言程序与汇编语言编制的机器语言程序与汇编语言程序如下表所示。程序如下表所示。NoImage地地 址址机器代码机器代码对应的汇编指令对应的汇编指令E380:000024 0FAND AL,0FHE380:00023C 0ACMP AL,0AHE380:000472 02JB NUME380:000604 07ADD AL,07HE380:000804 30NUM:ADD AL,30
4、HE380:000AC3RETNoImage2 2汇编语言与高级语言汇编语言与高级语言(Assembly Language Assembly Language and Computer-independent Language)and Computer-independent Language)汇编语言汇编语言是一种依赖于计算机微处理器的语言是一种依赖于计算机微处理器的语言 汇编语言汇编语言一般不具有通用性和可移植性一般不具有通用性和可移植性 进行进行汇编语言汇编语言程序设计必须熟悉机器的硬件资程序设计必须熟悉机器的硬件资 源和软件资源源和软件资源 高级语言高级语言是面向过程的语言是面向过程的
5、语言 高级语言高级语言具有很好的通用性和可移植性具有很好的通用性和可移植性 NoImage5.1.2 汇编语言源程序的组成汇编语言源程序的组成 1 1汇编语言源程序的结构汇编语言源程序的结构(Program Structure)Program Structure)例例5-2 5-2 完整的汇编语言源程序示例。完整的汇编语言源程序示例。NAME HEXTOASC;*DATA SEGMENT ;数据段定义开始数据段定义开始 HEX DB 5AH ASC DB 2 DUP(?)DATA ENDS ;数据段定义结束数据段定义结束;*NoImage;*STACK SEGMENT ;堆栈段定义开始堆栈段定
6、义开始 DB 256 DUP(S)TOP EQU$-STACK STACK ENDS ;堆栈段定义结束堆栈段定义结束;*;*CODE SEGMENT ;代码段定义开始代码段定义开始 ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA ;主程序开始主程序开始NoImage MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP MOV BX,OFFSET ASC MOV AL,HEX MOV AH,AL MOV CL,4 SHR AL,CL CALL NEAR PTR CONVERT HLT ;主程序结束主程序结束
7、NoImageCONVERT PROC ;过程过程(子程序子程序)定义开始定义开始 AND AL,0FH CMP AL,10 JB NUM ADD AL,7 NUM:ADD AL,0 RET CONVERT ENDP ;过程过程(子程序子程序)定义结束定义结束 CODE ENDS ;代码段定义结束代码段定义结束;*END START ;程序结束程序结束NoImage要点总结:汇编语言源程序由汇编语言源程序由段结构段结构组成。组成。一个段由一个段由 “SEGMENTSEGMENT”(段定义开始)和段定义开始)和“ENDSENDS”(段定义结束)语句来定义。段定义结束)语句来定义。每个段都有唯一的
8、每个段都有唯一的段名段名,前后一致。,前后一致。不同段的段名不能相同。不同段的段名不能相同。数据段、堆栈段和代码段的作用各不相同。数据段、堆栈段和代码段的作用各不相同。各个段都由一系列各个段都由一系列语句语句组成。组成。语句包括语句包括指令指令语句和语句和伪指令伪指令语句。语句。NoImage2 2汇编语言的语句格式汇编语言的语句格式(Statement Formats)Statement Formats)汇编语言程序的每行语句由汇编语言程序的每行语句由14个部分组成。个部分组成。指令语句和伪指令语句在格式上稍有区别,指令语句和伪指令语句在格式上稍有区别,指令指令语句的标号后有冒号语句的标号后
9、有冒号“:”,而,而伪指令伪指令语句的标号语句的标号后则没有冒号。后则没有冒号。指令语句的格式为指令语句的格式为LABEL:OPERATION OPERAND ;COMMENT标号域标号域 指令助记符域指令助记符域 操作数域操作数域 注释域注释域NoImage伪指令语句的格式为伪指令语句的格式为LABEL OPERATION OPERAND ;COMMENT标号域标号域 伪指令助记符域伪指令助记符域 操作数域操作数域 注释域注释域 注注:指令助记符前面还可以有指令助记符前面还可以有 前缀前缀。汇编语言程序语句中的四项,均可以用汇编语言程序语句中的四项,均可以用大写大写、小写小写或或混合编写混合
10、编写。语句的各部分之间至少用一个语句的各部分之间至少用一个空格空格分开分开NoImage3.3.标号标号(Label)Label)(含数据变量标号和程序位含数据变量标号和程序位置标号置标号)标号标号是一个自行设计的标识符或名称,是一个自行设计的标识符或名称,最多可由最多可由31个字母、数字和特别字符个字母、数字和特别字符(?、?、-、$)等组成。但等组成。但 不能用数字开头。不能用数字开头。不能为汇编语言的保留字不能为汇编语言的保留字。注:保留字指有专门用途的字符或字符串,注:保留字指有专门用途的字符或字符串,如如CPU的寄存器名、指令助记符、伪的寄存器名、指令助记符、伪指令助记符等。指令助记
11、符等。NoImage(1)数据变量标号的三种属性数据变量标号的三种属性 段值:段值:即所在段的段地址。即所在段的段地址。偏移量:偏移量:即数据变量所在位置的地址与即数据变量所在位置的地址与其段地址之差值。其段地址之差值。类型:类型:指该数据变量是字节、字还是双字。指该数据变量是字节、字还是双字。(2)程序位置标号的两种类型属性程序位置标号的两种类型属性 NEAR段内调用或转移标号。段内调用或转移标号。FAR段间调用或转移标号。段间调用或转移标号。NoImage4.4.操作数操作数域域(Operand Fields)Operand Fields)操作数可以是操作数可以是常数、变量、标号、寄存常数
12、、变量、标号、寄存器名器名或或表达式表达式(1)常数常数:二进制、八进制、十进制、十六进:二进制、八进制、十进制、十六进制或制或ASCII码字符串。码字符串。(2)寄存器名寄存器名、标号标号、变量变量 指令:指令:MOV AL,HEX 中,中,AL为寄存器为寄存器名,名,HEX为变量名。为变量名。NoImage(3)表达式表达式:由:由运算符运算符连接起来的式子叫表达式,连接起来的式子叫表达式,按一定的规则对表达式进行运算后按一定的规则对表达式进行运算后得到一个数值或一个地址。得到一个数值或一个地址。表达式可分为表达式可分为算术表达式算术表达式、逻辑表达式逻辑表达式、关关系运算表达式系运算表达
13、式、分析运算表达式分析运算表达式和和合成运算合成运算表达式。表达式。NoImage用算术运算符用算术运算符+、-、*、/和和MOD连接的表连接的表达式。达式。算术表达式算术表达式用逻辑运算符用逻辑运算符AND、OR、XOR和和NOT连接的表达式。连接的表达式。逻辑表达式逻辑表达式例如:例如:5 5*8+308+30,128/100 128/100,206 206 MOD 128 MOD 128 等算术等算术表达式。表达式。NoImage 逻辑表达式的结果可能为逻辑表达式的结果可能为8 8位或位或1616位二进制位二进制数,视参加运算的数的字长而定。数,视参加运算的数的字长而定。逻辑运算指令中可
14、以包含有逻辑表达式,如逻辑运算指令中可以包含有逻辑表达式,如指令指令 AND AL,10101010B AND 0FH 左边第一个左边第一个AND为逻辑运算指令,第二个为逻辑运算指令,第二个AND为逻辑运算符,为逻辑运算符,B AND 0FH 为逻辑表达为逻辑表达式,其结果在汇编时即已确定,为式,其结果在汇编时即已确定,为B,故上述指故上述指令等价于令等价于AND AL,00001010BNoImage用用EQ、NE、LT、GT、GE和和LE连接的表连接的表达式。若条件成立,其值为达式。若条件成立,其值为1,否则为,否则为0。关系运算表达式关系运算表达式分析运算表达式把存储器操作数分解为几分析
15、运算表达式把存储器操作数分解为几个组成部分;而合成运算式是把这些组成部分个组成部分;而合成运算式是把这些组成部分综合为存储器操作数。综合为存储器操作数。分析运算表达式和合成运算表达式分析运算表达式和合成运算表达式例如:指令例如:指令 MOV BX,5 GT 3 等价于等价于 MOV BX,0FFFFH NoImage 分析运算表达式和合成运算表达式的操作对象分析运算表达式和合成运算表达式的操作对象都为都为存储器操作数存储器操作数。存储器操作数表示变量、符号地址、存储单元存储器操作数表示变量、符号地址、存储单元等与存储器等与存储器地址地址有关的量。有关的量。分析运算表达式把存储器操作数分析运算表
16、达式把存储器操作数分解分解为几为几个部分,如分解出段值、偏移量、类型等;个部分,如分解出段值、偏移量、类型等;合成运算表达式则把这些组成部分合成运算表达式则把这些组成部分综合综合为存为存储器操作数。储器操作数。NoImage5.2 5.2 伪指令伪指令指令语句:指令语句:汇编程序把它们翻译成机器代码,命汇编程序把它们翻译成机器代码,命令令80868086执行对应操作。执行对应操作。伪指令语句伪指令语句:汇编程序并不把它们翻译成机器代汇编程序并不把它们翻译成机器代码,只是用来指示、引导汇编程序码,只是用来指示、引导汇编程序在汇编时做一些操作,它本身不占在汇编时做一些操作,它本身不占用存储单元。用
17、存储单元。NoImage5.2.1 段定义伪指令段定义伪指令SEGMENT/ENDS1.SEGMENT和和ENDS 定义方式:定义方式:段名段名 SEGMENT定位方式定位方式组合方式组合方式类别名类别名 语句语句1 语句语句2 段名段名 ENDSNoImage 段名段名是赋予该段的一个名称,是赋予该段的一个名称,SEGMENT与与ENDS成对出现,且前后的段名要相同,段成对出现,且前后的段名要相同,段名的取法与文件名、标号及变量名等相同。名的取法与文件名、标号及变量名等相同。(1)段名段名NoImageLINK程序除完成段与段的联合操作以程序除完成段与段的联合操作以外,还把联合后得到的各个段
18、互相衔接起来,外,还把联合后得到的各个段互相衔接起来,段与段的段与段的衔接方式衔接方式叫做定位方式,共叫做定位方式,共4种。种。(2)定位方式定位方式NoImage WORD(字字):表示段从地址是一个最低位:表示段从地址是一个最低位为为0的二进制数开始。的二进制数开始。PAGE(页页):表示段从一个页的边界,即十:表示段从一个页的边界,即十六进制数表示地址时最低两位均为六进制数表示地址时最低两位均为0处开始。处开始。PARA(缺省缺省):表示段从一个节的边界,即:表示段从一个节的边界,即用十六进制数表示地址时最低位为用十六进制数表示地址时最低位为0处开始。处开始。BYTE(字节字节):表示段
19、可从任一地址开始。:表示段可从任一地址开始。NoImage BYTEXXXX XXXX XXXX XXXX XXXX B WORDXXXX XXXX XXXX XXXX XXX 0 B PARAXXXX XXXX XXXX XXXX 0 0 0 0 B PAGEXXXX XXXX XXXX 0 0 0 0 0 0 0 0 B X表示可取表示可取0或或1定位类型定位类型 起起 始始 地地 址址NoImage2.GROUP伪指令伪指令格式:格式:组名组名 GROUP 段名段名 ,功能功能:用来把模块中若干不同名的段集合用来把模块中若干不同名的段集合成一个组,使其装入成一个组,使其装入同一个物理段同
20、一个物理段中,组内各段之间的跳转可视为中,组内各段之间的跳转可视为段段内跳转内跳转。注注:组名与段名是一样的取名规则,是代组名与段名是一样的取名规则,是代表该组的段地址,格式中的段名也可表该组的段地址,格式中的段名也可用表达式用表达式SEG变量变量或或SEG标号标号。NoImage5.2.2 位置计数器位置计数器$和定位伪指令和定位伪指令ORG 1.1.位置位置计数器计数器$汇编程序专门设置了一个表示汇编程序专门设置了一个表示当前位置当前位置的的计数器,称计数器,称位置计数器位置计数器$。正常情况下,汇编程。正常情况下,汇编程序每扫描一个字节,位置计数器的值便加序每扫描一个字节,位置计数器的值
21、便加1 1。语句:语句:TOP EQU$-STACK 含义:含义:当前位置计数器的值当前位置计数器的值$减去减去STACKSTACK代表的起始代表的起始位置的值,然后把两者的差值赋予符号常量位置的值,然后把两者的差值赋予符号常量TOPTOP。语句:语句:JMP$含义:含义:程序跳转到本条指令执行。程序跳转到本条指令执行。NoImage格式:格式:ORG 数据表达式数据表达式功能功能:把位置计数器的值设置为表达式的值。把位置计数器的值设置为表达式的值。ORG后面的一条指令性语句或数据区后面的一条指令性语句或数据区定义命令即从指定的位置处进行汇编。定义命令即从指定的位置处进行汇编。2.2.ORG伪
22、指令伪指令NoImage格式:格式:ASSUME 段寄存器段寄存器:段名段名,段寄存器段寄存器:段名段名,功能功能:用于告知汇编程序,段寄存器用于告知汇编程序,段寄存器CS、DS、ES和和SS的内容的内容将被将被设定为那设定为那些段或组的些段或组的段址段址。5.2.3 段寻址伪指令段寻址伪指令ASSUME NoImage注注:(1)段名段名可以是已定义过的任何可以是已定义过的任何段名段名或或组名组名,也可以是表达式,也可以是表达式SEG 变量变量或或SEG 标号标号,还可以是,还可以是NOTHING。(2)除除CS外,外,DS、ES、SS的设置必须的设置必须通过指令性语句来完成。通过指令性语句
23、来完成。例例 CODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:NOTHING MOV AX,DATA MOV DS,AX ;设置设置DS MOV AX,STACK MOV SS,AX ;设置设置SS CODE ENDSNoImage5.2.4 过程定义伪指令过程定义伪指令PROC/ENDP 过程过程即是即是子程序子程序。汇编语言规定必须对过程。汇编语言规定必须对过程进行定义,以确定过程的三种属性。过程的属性进行定义,以确定过程的三种属性。过程的属性确定之后,就可对调用指令确定之后,就可对调用指令CALLCALL进行正确汇编,进行正确汇编,决定是产生
24、近调用指令还是远调用指令。决定是产生近调用指令还是远调用指令。1.1.过程的三种属性过程的三种属性 段段属性:过程所在段的段地址。属性:过程所在段的段地址。偏移量偏移量属性:过程所处位置的段内偏移地址。属性:过程所处位置的段内偏移地址。类型类型属性属性(NEAR或或FAR)。过程为过程为NEARNEAR或或FARFAR类类型。型。NoImage使用格式:过程名使用格式:过程名 PROC NEAR/FAR RET 过程名过程名 ENDPNEAR-近过程。该过程与调用指令近过程。该过程与调用指令CALLCALL处在同处在同 一个代码段中(段名相同)。一个代码段中(段名相同)。FAR-远过程。该过程
25、与调用指令远过程。该过程与调用指令CALLCALL处在不同处在不同的代码段中(段名不同)。的代码段中(段名不同)。2.2.过程的定义过程的定义NoImage功能功能:把具有一定功能的程序段设计成为一个过:把具有一定功能的程序段设计成为一个过程程(子程序子程序),便于实现模块化的程序设计。,便于实现模块化的程序设计。注注:(1)CALL指令中过程名起着标号的作用。指令中过程名起着标号的作用。有段属性、偏移量属性和类型属性有段属性、偏移量属性和类型属性(NEAR和和FAR)。(2)子程序中至少有一个子程序中至少有一个RET。过程名是为该过程指定的一个名称,与变量、过程名是为该过程指定的一个名称,与
26、变量、标号的定义法相同。标号的定义法相同。NoImage任何变量均有下列三种属性。任何变量均有下列三种属性。(1)段属性即变量所使用的段;段属性即变量所使用的段;(2)段内偏移属性;段内偏移属性;(3)变量的类型:字节、字、双字等。变量的类型:字节、字、双字等。5.2.5 数据定义伪指令与存储器分配数据定义伪指令与存储器分配 1.变量的三种属性变量的三种属性DB定义字节型变量定义字节型变量,每个变量分配每个变量分配1 1个存储单元个存储单元DW-定义字型变量定义字型变量,每个变量分配每个变量分配2 2个存储单元个存储单元 DD-定义双字型变量定义双字型变量,每个变量分配每个变量分配4 4个存储
27、单元个存储单元NoImage2 2变量定义及存储器申请伪指令变量定义及存储器申请伪指令DB/DW/DD (1)格式格式1:变量名变量名 DB/DW/DD表达式表达式功能功能:定义一变量,并为其分配一定数量定义一变量,并为其分配一定数量的存储单元,变量的初值由表达式的存储单元,变量的初值由表达式的值指定。若初值可任意,则用问的值指定。若初值可任意,则用问号(号(?)表示。变量名相当于符号)表示。变量名相当于符号地址,可省地址,可省。HEX DB 5AH ;定义定义字节字节变量变量VWORD DW 1234H;定义定义字字变量变量NoImage注:注:在存放字变量时,低字节在前,高字节在后。在存放
28、字变量时,低字节在前,高字节在后。BUFFER DW 1,0,-1 ;定义了三个定义了三个字字单元单元 STR DB Program ;定义了一个定义了一个字符串字符串 注:注:在存放字符串时,存储的是字符的在存放字符串时,存储的是字符的ASCIIASCII码。码。HEX_OFF DW HEX ;定义了一个定义了一个字字单元,单元,其初值为已定义变量其初值为已定义变量HEX的偏移量。的偏移量。DVAR DD 12345678H ;定义了一个定义了一个双字双字单元单元 NoImageASC DB 2 DUP(?)功能:分配功能:分配2个字节单元,初值任意个字节单元,初值任意 BUF DW 100
29、 DUP(0)功能:分配功能:分配100个字单元,初值为个字单元,初值为0 ZIP DB 3 DUP(0,2 DUP(1)功能:存储单元依次初始化为:功能:存储单元依次初始化为:0,1,1,0,1,1,0,1,1。(2)格式格式2:变量名变量名 DB/DW/DDDUP 表达式表达式NoImage 变量经过定义及存储器申请之后,在程序变量经过定义及存储器申请之后,在程序中即可像高级语言一样使用。中即可像高级语言一样使用。MOV AL,HEX ;取变量取变量HEX的内容送的内容送AL寄存器。寄存器。MOV ASCBX,AL ;取变量取变量ASC的偏移的偏移地址,再与地址,再与BX寄存器的内容相加,
30、得到寄存器的内容相加,得到存储存储器操作数的有效地址器操作数的有效地址EA,再将再将AL寄存器的寄存器的内容送入该单元。内容送入该单元。3 3变量的使用变量的使用NoImage1.EQU伪指令伪指令格式:符号名格式:符号名 EQU 数值表达式数值表达式功能功能:为常量、变量、表达式或其他符号定:为常量、变量、表达式或其他符号定义一个名字,但不申请分配内存。义一个名字,但不申请分配内存。如如:THREE EQU 3 TOP EQU$-STACK 5.2.7 符号定义伪指令(符号定义伪指令(EQU、LABEL)NoImage “=”“=”伪操作与伪操作与EQUEQU相似,其区别是前者相似,其区别是
31、前者可重复定义而后者不能。可重复定义而后者不能。使用使用EQUEQU可使程序简单明了和便于修改。可使程序简单明了和便于修改。注:注:EQUEQU可用可用PURGEPURGE解除。解除。NoImage2.LABEL伪指令伪指令格式:变量名格式:变量名/标号标号 LABEL 类型类型功能功能:为当前存储单元定义一个指定类型:为当前存储单元定义一个指定类型的变量名或标号,其的变量名或标号,其类型类型为为BYTE、WORD、DWORD、结构名、记录结构名、记录名、名、NEAR和和FAR。NoImageBYTE_ARRAY LABEL BYTE;定义定义字节型字节型数数 组标号组标号 WORD_ARRA
32、Y DW 50 DUP(?);定义定义字型字型数组数组如定义不同类型的数组:如定义不同类型的数组:程序中的用法:程序中的用法:MOV AL,BYTE_ARRAY2;将将2号号字节字节单元内容送单元内容送AL MOV AX,WORD_ARRAY0;将将0号号字字单元内容送单元内容送AXNoImage又如:又如:TRANS_N LABEL NEAR TRANS PROC FAR 这样这样TRANS不仅适合不仅适合远程调用和转移远程调用和转移,也,也可用新名可用新名TRANS_N适合适合近程调用和转移近程调用和转移。NoImage5.3 5.3 汇编语言属性操作符汇编语言属性操作符1.分析操作符(数
33、值返回操作符)分析操作符(数值返回操作符)5.3.1 分析操作符(分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)返回的是变量或标号的返回的是变量或标号的段地址段地址,偏移偏移地址地址及及类型类型的属性值。的属性值。格式格式:分析运算符:分析运算符 变量或标号变量或标号其运算的结果为一常数其运算的结果为一常数NoImage(1)SEG取段址算符取段址算符(2)OFFSET取偏移地址算符取偏移地址算符功能功能:分离出该变量或标号的段址:分离出该变量或标号的段址 如:如:MOV AX,SEG BUF功能功能:分离出该变量或标号的偏移地址:分离出该变量或标号的偏移地址 如:如:M
34、OV SI,OFFSET BUFNoImage(3)TYPE取类型算符取类型算符(4)LENGTH取变量所含元素的个数取变量所含元素的个数功能功能:分离出该变量所含元素的个数。:分离出该变量所含元素的个数。功能功能:分离出该变量或标号的类型的字节数。:分离出该变量或标号的类型的字节数。变量类型为变量类型为BYTE、WORD和和DWORD时,时,返回的值分别为返回的值分别为1、2和和4;标号类型为标号类型为NEAR或或FAR时,则返回时,则返回-1或或-2。NoImage注意注意:在定义该变量时,数据定义伪指令后面:在定义该变量时,数据定义伪指令后面的第一个表达式的形式为的第一个表达式的形式为“
35、n DUP(n DUP(表达表达式式)”)”时,取值为时,取值为n n,否则为否则为1 1。如:如:BUF1 DB 100 DUP(0)BUF2 DW 10,5 DUP(2)BUF3 DD 5 DUP(1,2 DUP(0)则则 LENGTH BUF1=100,LENGTH BUF2=1 LENGTH BUF3=5。NoImage(5)SIZE取变量所含存储区的总字节数。取变量所含存储区的总字节数。功能功能:SIZE=LNGTH*TYPE SIZE BUF1=100(因为因为TYPE BUF1=1)SIZE BUF2=2(因为因为TYPE BUF2=2)SIZE BUF3=20(因为因为TYPE
36、 BUF3=4)NoImage格式格式:类型类型 PTR 表达式表达式类型类型:表达式表达式:是变量、标号或数值:是变量、标号或数值 变量的类型有:变量的类型有:BYTE、WORD和和DWORD;标号的类型有:标号的类型有:NEAR和和FAR;结构名称结构名称*5.3.2 属性修改操作符(属性修改操作符(PTR、THIS、SHORT)1.PTR操作符操作符 PTR操作符用于操作符用于暂时暂时修改变量或标号的原有属性。修改变量或标号的原有属性。NoImage功能功能:PTR把它左边的属性指派给它右边的变量、把它左边的属性指派给它右边的变量、标号或数值,使之产生一个新的存储器地址标号或数值,使之产
37、生一个新的存储器地址操作数。操作数。如:如:(1)INC BYTE PTR BX (2)ADD DX,WORD PTR FOOB20 新存储器操作数的段地址和段内偏移量与新存储器操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应量相同。运算符右边的操作数的对应量相同。PTR给已分配的存储器一个另外的定义但给已分配的存储器一个另外的定义但并不重新分配存储器。并不重新分配存储器。NoImage2.SHORT操作符操作符SHORT用于条件转移、循环和调用指用于条件转移、循环和调用指令中,指出其转移的相对位移量不超过一令中,指出其转移的相对位移量不超过一个字节所能表达的范围。个字节所能表达的范
38、围。NoImage3.THIS操作符操作符 THIS操作符与操作符与PTR操作符有类似的功能,操作符有类似的功能,但新的属性放在但新的属性放在THIS的的右边右边。格式:格式:THIS 类型类型/距离距离其中类型是其中类型是BYTE、WORD和和DWORD,距离是距离是NEAR和和FAR属性。属性。功能功能:与:与PTR类似建立一个新的存储器地址类似建立一个新的存储器地址操作数,但不分配存储器,其类型由操作数,但不分配存储器,其类型由THIS指定。指定。(1)FOOB EQU THIS BYTE(2)FAR-OUT EQU THIS FAR如:如:NoImage 5.4 5.4 汇编语言程序的
39、上机过程汇编语言程序的上机过程 5.4.1 5.4.1 汇编语言程序上机运行的软件环境汇编语言程序上机运行的软件环境 DOS操作系统下操作系统下,编辑、修改和运行汇编语言编辑、修改和运行汇编语言程序,需要用文本编辑软件、宏汇编程序、连接程序,需要用文本编辑软件、宏汇编程序、连接程序和调试程序。程序和调试程序。文本编辑软件:文本编辑软件:EDIT.EXE等等 宏汇编程序:宏汇编程序:MASM.EXE,TASM.EXE等等 连接程序:连接程序:LINK.EXE,TLINK.EXE等等 调试程序:调试程序:CV.EXE,TD.EXE等等 NoImage5.4.2 源程序的编辑与汇编源程序的编辑与汇编
40、1.编辑源程序编辑源程序 C:ASMEDIT HEXTOASC.ASM(回车)回车)2.汇编源程序汇编源程序 C:ASMTASM HEXTOASC(回车)回车)在汇编中,如果有语法错误,会给出提示信在汇编中,如果有语法错误,会给出提示信息,指出错误的类型、行号。当汇编无错之后,息,指出错误的类型、行号。当汇编无错之后,会自动生成目标文件(文件会自动生成目标文件(文件扩展名扩展名为为OBJ)。注:待编辑的文件扩展名必须为注:待编辑的文件扩展名必须为 ASM。NoImage5.4.3 目标程序的连接目标程序的连接 C:ASMTLINK HEXTOASC(回车)回车)连接成功后,将生成可执行程序连接
41、成功后,将生成可执行程序HEXTOASC.EXE。5.4.4 程序的调试与运行程序的调试与运行 1调试可执行程序调试可执行程序 利用利用Turbo Debuger(TD)对可执行程序进行调对可执行程序进行调试,以检查程序可能存在的各种错误:试,以检查程序可能存在的各种错误:C:ASMTD HEXTOASC.EXE(回车)回车)程序在存储区中程序在存储区中存放的逻辑地址存放的逻辑地址源程序部分源程序部分程序执行后各寄存器、程序执行后各寄存器、标志位的结果标志位的结果数据段中存放的数据段中存放的40个个“A”及对应的及对应的ASCII码码DEBUG调试环境如下:调试环境如下:NoImage2运行可
42、执行程序运行可执行程序 C:ASMHEXTOASC(回车)回车)NoImage5.5 5.5 汇编语言程序设计的基本技术汇编语言程序设计的基本技术 5.5.1 简单程序设计简单程序设计 例例6-3 编写程序段,完成下面公式的计算编写程序段,完成下面公式的计算(其中:变量其中:变量X和和Y是是32位无符号数,变量位无符号数,变量A,B和和Z是是16位无符号数位无符号数):(X-Y-29)/Z的商的商A,(X-Y-29)/Z的余数的余数BDATA SEGMENT X DD 453921F0H Y DD 123A6825H Z DW 0A86CH A DW?B DW?DATA ENDS定义数据段定义
43、数据段:NoImageCODE SEGMENT MOV AX,WORD PTR X ;取X的低位字 MOV DX,WORD PTR X+2 ;取X的高位字 SUB AX,WORD PTR Y ;与Y的低位字相减 SBB DX,WORD PTR Y+2 ;与Y的高位字相减,并考虑低位的借位 SBB AX,29D ;结果的低位与29D相减 SBB DX,0 ;可能产生借位,再减去借位 DIV Z ;32位无符号数(DX:AX)除以16位无符号数Z MOV A,AX ;商在AX中,保存商 MOV B,DX ;余数在DX中,保存余数 CODE ENDS定义代码段定义代码段:NoImage程序中根据各种
44、可能出现的情况及相程序中根据各种可能出现的情况及相应的处理方法分成若干支路,运行时,根应的处理方法分成若干支路,运行时,根据不同情况有选择地执行相应处理程序。据不同情况有选择地执行相应处理程序。例例5-6 5-6 试编写程序段,实现符号函数。试编写程序段,实现符号函数。101(x)sign y当当x 0时时当当x=0时时当当x 0时时5.5.2 分支程序设计分支程序设计 相应的程序段为;相应的程序段为;SIGN:MOV AX,BUFFER ;(BUFFER)=X AND AX,AX ;做一次做一次“与与”运算,以便把运算,以便把X ;的特征反映到标志位的特征反映到标志位 MOV BX,0 ;预
45、置预置X=0的标志的标志0到到BX JE NEXT ;若若X确实为确实为0,则转则转NEXT JNS PLUS ;X为正数,则转为正数,则转PLUS MOV BX,-1 ;X为负数,则为负数,则1送送BX JMP NEXT PLUS:MOV BX,1 NEXT:NoImage例例5-7 5-7 在数据段中定义了在数据段中定义了256256个子程序的入口地址(段个子程序的入口地址(段地址:偏移地址),试根据地址:偏移地址),试根据ALAL中的值,决定调用中的值,决定调用256256个子个子程序中的哪一个。程序中的哪一个。分析:每个子程序的入口地址占用分析:每个子程序的入口地址占用4个字节,需将个
46、字节,需将AL的值乘以的值乘以4,再加上入口地址表首的偏移地址,即可,再加上入口地址表首的偏移地址,即可得到某子程序入口地址在表中的偏移地址,将该地址送得到某子程序入口地址在表中的偏移地址,将该地址送入入BX,利用段间间接调用指令实现子程序调用。这种处利用段间间接调用指令实现子程序调用。这种处理方法,类似于第理方法,类似于第9章中将要介绍的中断向量表的处理。章中将要介绍的中断向量表的处理。BX=入口地址表首偏移地址入口地址表首偏移地址+AL*4DATA SEGMENTTABADD DD SUB0 ;0#子程序入口地址子程序入口地址 DD SUB1 ;1#子程序入口地址子程序入口地址 DD SU
47、B255 ;255#子程序入口地址子程序入口地址DATA ENDSSTACK SEGMENT PARA STACK STACK DB 100 DUP(?)STACK ENDSCODE1 SEGMENT ;代码段代码段CODE1实现查表转移的程序段实现查表转移的程序段 ASSUME CS:CODE1,DS:DATA,SS:STACK XOR AH,AH ;AH清清0 MOV CL,2 SHL AX,CL ;AX左移左移2次相当于乘以次相当于乘以4 MOV BX,OFFSET TABADD ;取表首的偏移地址取表首的偏移地址 ADD BX,AX ;加上加上AL*4 CALL DWORD PTR B
48、X ;段间间接调用子程序段间间接调用子程序 CODE1 ENDS ;代码段代码段CODE2定义定义256个子程序(过程):个子程序(过程):CODE2 SEGMENTASSUME CS:CODE2SUB0 PROC FAR RETSUB0 ENDPSUB1 PROC FAR RETSUB1 ENDP SUB255 PROC FAR RETSUB255 ENDPCODE2 ENDSNoImage一段程序有时重复执行多次,就牵涉一段程序有时重复执行多次,就牵涉到循环程序结构,其组成部分为:到循环程序结构,其组成部分为:1.循环体循环体即要求重复执行的程序段部分,包括即要求重复执行的程序段部分,包括
49、循环工作部分和循环控制部分。循环工作部分和循环控制部分。2.循环初态循环初态循环开始时往往要置初态,赋初值,循环开始时往往要置初态,赋初值,包括循环工作部分初态和结束条件初态。包括循环工作部分初态和结束条件初态。5.5.3 循环程序设计循环程序设计 NoImage3.循环结束条件循环结束条件在循环程序中必须给出循环结束条件,在循环程序中必须给出循环结束条件,否则就会进入死循环,结束条件有好多种,否则就会进入死循环,结束条件有好多种,最常见的有:最常见的有:(1)用计数器控制循环用计数器控制循环(2)按问题的条件控制循环按问题的条件控制循环(3)用开关量控制循环用开关量控制循环(4)多重循环多重
50、循环NoImage例例5-85-8 分类统计字数组分类统计字数组ARRAYARRAY中正数、负中正数、负数和零的个数,并分别存入内存字变量数和零的个数,并分别存入内存字变量POSTPOST、NEGANEGA和和ZEROZERO中,数组元素个数保存中,数组元素个数保存在数组的第一个字中。在数组的第一个字中。分析:将字变量与分析:将字变量与0 0比较,然后判断是比较,然后判断是大于大于0 0(JGJG)、)、等于等于0 0(JEJE)还是小于还是小于0(0(JL)JL),以分别对相应的计数器加以分别对相应的计数器加1 1。DATA SEGMENT ARRAY DW 8 ;元素个数元素个数 DW 2