第3章 汇编语言程序设计

更新时间:2024-03-29 21:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第3章 汇编语言程序设计

3.1 汇编的语句种类及其格式 一、语句类型

8086汇编语言有三种基本语句:指令语句、伪指令语句和宏指令语句。 1、指令语句

指令系统中的指令均为指令语句。有对应的机器码和操作的指令。 2、伪指令语句

为汇编程序和连接程序提供一些必要控制的管理性语句。伪指令语句的标号后面SUM SUM是标号,它代表由伪指令3、宏指令语句将多条语句定义成一条语句,此语句称为宏指令语句。二、汇编语句的格式三、汇编语言程序的格式 8086源程序中的标号和变量等的段内偏移地址是在汇编过程中排定的,整个原程序以语句

例:利用执行过程为:① 利用② 利用③ 利用

DB ?

DB定义的单元的符号地址,也叫做变量名。

名字 操作符 操作数

因此,ENDS作为段的结束,两者都必须有名字,且名字相同。END作为结束。

和0AH功能调用,实现人机会话。

显示“What is your name?等待键盘输入姓名; 显示“My name is XXX”。1

;注释

8086的汇编语言的源程序的编写必须SEGMENT作为段

而段地址是在

”; 不能有冒号。例如 的存储空间是分段管理的。遵照分段管理的规定,分段进行编写。每个段有一个名字,以符号的开始,以语句连接过程中确定的。汇编过程中形成的目标模块把源程序中由段定义语句提供的信息传递给连接程序,连接程序为各段分配段地址并把它们连成一体。09H09H0AH09H

DATA SEGMENT BUF DB 20

DB ?

DB 20 DUP('$')

STR1 DB 'What is your name? $' STR2 DB 'My name is $' DATA ENDS

STACK SEGMENT STACK 'STACK'

DB 100 DUP(?) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV AX,STACK MOV SS,AX

MOV DX,OFFSET STR1 MOV AH,09H INT 21H

MOV DX,OFFSET BUF MOV AH,0AH INT 21H MOV DL,0AH MOV AH,02H INT 21H MOV DL,0DH MOV AH,02H INT 21H

MOV DX,OFFSET STR2 MOV AH,09H INT 21H

MOV DX,OFFSET BUF+2 MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS

END START①编辑程序

汇编语言的源程序应存为文本文件,扩展名为dosC:\\masm\\>edit EDIT”.asm↙

;定义数据段

;定义堆栈段 ;设置显示指针;设置显示指针.ASM,编辑工具可使用2

WindowsMOV DS,AX

四、运行汇编语言程序的步骤的“记事本”或环境下的“

文件名

②汇编

方法:dos环境下

C:\\masm\\>masm 文件名.asm↙ 汇编后生成三个文件:列表文件(.lst)、交叉索引文件(.crf)和目标文件(.obj) ③连接

方法:dos环境下

C:\\masm\\>link 文件名.obj↙

连接后生成可执行文件,其扩展名为.exe ④运行

方法:dos环境下

C:\\masm\\>文件名.exe↙

例:编写一个一位数的加法程序)。

提示:两次DOS功能调用ASCII字符转换为数,然后计算再转换为A=_

B=_ A+B=x :

DATA SEGMENT

A DB 0dh,0ah,'A=$' B DB 0dh,0ah,'B=$' C DB 0dh,0ah,'A+B=$' DATA ENDS

STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA

MOV DS,AX LEA DX,A MOV AH,9 INT 21H MOV AH,1 INT 21H SUB AL,30h PUSH AX LEA DX,B

(即分别提示输入两个一位数,然后自动计算显AH=1(等待输入一个字符,并放入AL),将获得ASCII显示。 3

示结果的两个运行结果设计: 程图

MOV AH,9 INT 21H MOV AH,1 INT 21H SUB AL,30h POP BX ADD AL,BL PUSH AX LEA DX,C MOV AH,9 INT 21H POP AX MOV ah,0 MOV bl,10 DIV BL PUSH AX MOV DL,AL ADD DL,30H MOV AH,2 INT 21H POP AX MOV DL,AH ADD DL,30H MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS

END START

3.2 语句行的构成 语句的格式:

名字 1、名字

名字表示本条语句的符号地址。也称为。

(1)名字的命名规则名字通常由字母、数字组成,第一个字符必须是字母。汇编程序对

4

31 操作符 操作数 ;注释

标号(指令语句的名子)或变量(伪指令的名子)

个以后的字符不予理会。

(2)指令语句和伪指令语句中名字的区别是指令语句的名字后有冒号。 (3)标号和变量的属性

标号和变量都具有三种属性:段、偏移及类型。其段属性一般由ASSUME语句和赋值语句体现。标号的类型有NEAR(段内)和FAR(段间);变量的类型属性由定义变量的伪指令DB、DW或DD确定。

2、操作符

操作符可以是指令、伪指令或宏指令的肋记符。 3、操作数

操作数一般有常数、寄存器、存储器、标号、变量和表达式等 (1)常数 ①二进制常

例如:10110101B ②十进制常数

后跟D或不跟任何字母的数字。例如:12345D或12345 ③十六进制常数

④八进制常数:用数字0~7表示,数字后跟字母Q或字母O。 ⑤串常数:由单引号‘’括起来的一串字符。

以单引号括起来的字符串,由各字符的ASCII码值组成。 (2)表达式

表达式由常数、寄存器、标号、变量与一些运算符组合而成。一般有数字表达式和地址表达式二种。运算符有算术运算符、逻辑运算符、关系运算符、分析运算符和综合运算符共5种。

①算术运算符

算术运算符有:+、-、*、/、MOD(求余)、SHL(左移)和SHR(右移)。对数字可进行以上七种运算,但对地址,只能用加法和减法,且地址应在同一段内。

例: MOV AL,BUFFER+3 MOV AH,3*2-5 MOD 3 MOV BH,0101B SHL 4

②逻辑运算符

逻辑运算符有:AND、OR、XOR和NOT。逻辑运算符对其操作数进行按位操作。

③关系运算符

关系运算符有:EQ(相等)、NE(不相等)、LT(小于)、 GT(大于)、LE(小于或等于)、GE(大于或等于)。关系运算对象只能是两个性质相同的项目。运算结果当关系成立进为全1,否则为全0。

④分析运算符

分析运算符是对存储器地址进行运算的。分析运算符有:SEG、OFFSET、TYPE(标号: -1、-2;变量:多少个字节)、SIZE、LENGTH。SIZE和LENGTH只对由DUP

5

定义变量才有意义,LENGTH给出变量的个数,SIZE给出变量的总字节数。

TYPE加在变量、结构的名字前,可求出其类型的字节数。 例: VAR1 DW 2000H,3000H 则:TYPE VAR1=2

例:STUDENT STRUC NAME1 DB ‘ABCD’ NO DB ? ENGLISH DB ? MATHS DB ? PHYSICS DB ? STUENT ENDS 则:TYPE STUENT=8 ⑤综合运算符

这种运算符为存储吕地址操作数临时指定一个新的属性,算符。有六个综合运算符:PTR、段属性前缀、SHORT、PTR用来生成一个新的存储器地址操作数。例如: VAR1 DW 2030H

VAR2 EQU BYTE PTR VAR1

THIS跟PTR类似,可以用来建立一个特殊类型的存储器地址操作数。用建立的存储器地址操作数的段和偏移量部分与目前所能分配的下一个存储单元的段偏移量相同。例如:

VAR2 EQU THIS BYTE VAR1 DW 2030H

GO1 EQU THIS FAR GO: MOV AX,0203H ?? ?? ??

JMP GO

HIGH和LOW被称为字节分离符。它将一个16位的数的高字节和低字节分离出来。例如:

COUNT EQU 2A3BH MOV AH,HIGH COUNT MOV AL,LOW COUNT

3.3伪指令

在IBM宏汇编中有以下几种指示性语句 ①赋值伪指令(符号定义语句)

6

所以又称为属性修改运THIS、HIGHLOW。

THIS和 ②定义变量伪指令(数据定义语句) ③LABEL(标号定义语句)

④段定义伪指令(程序块定义语句) ⑤过程定义伪指令 ⑥结构定义语句 ⑦记录定义语句

一、赋值伪指令(符号定义语句) 1、等值语句EQU

EQU语句的作用是把该语句右边的值等价赋给它左边的符号。格式: 符号名 EQU 表达式

其中,表达式可以是一个常数,一个可以求出

例如: COUNT EQU 20

COUNT1 EQU COUNT+10 C EQU CX CBD EQU AAD

说明:EQU语句在未解除前,不能重新定义。2、等号语句=

此语句的功能与EQU语句类似,区别是可以重复定义。 EMP=6 EMP=7

在EQU语句中不允许标号出现,但等号语句可以。 LAB2 EQU LAB1+10 LAB2 = LAB1+10 3、解除语句PURGE

已经用EQU定义的符号,若以后不再用了就可以用格式: PURGE 符号1,符号2,??符号二、定义变量伪指令(数据定义语句)

7

的表达式,一个寄存器名或 PURGE语句来解除。n - 常数值一个指令。 ;错误 ;正确 这类语句有:DB、DW、DD、DQ和DT,它们的作用是0A 将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存10 储单元。DQ定义四字;DT定义十个字节。 41 例: DATA SEMENT 42 DATA1 DB ? 43 DATA2 DB 10,10H 03 STR1 DB ‘ABC’ 00 ADRR1 DW OFFSET STR1 COUNT =$-DATA1 DATA ENDS

重复操作符DUP

格式: 变量名 DB/DW/DD/DQ/DT <表达式> DUP (表达式)

DUP左边的表达式表示要重复的次数,右边圆括号中的表达式表示要重复的内容。例:

DATA SEGMENT

ARRAY1 DB 2 DUP(0,1,?)

ARRAY2 DB 20 DUP(0,1,2 DUP(2),5) DATA ENDS 三、LABEL

本条伪指令用定义标号名称和属性,它和下一条指令共享存储单元地址。 格式: 名字 LABEL 类型

例: BYTE_ARRAY LABEL BYTE

WORD_ARRAY DW 100 DUP(?)

四、段定义伪指令(程序块定义语句)

8086的1MB存储空间的分段管理是由程序块定义的伪指令实现的,当指导一个程序分成若干段时,应给每个段定义一个段名,以便在汇编和连接时,控制段的定位、组合和连接。程序块定义的伪指令有:SEGMENT/ENDS、ASSUME、ORG。

1、段定义语句SEGMENT/ENDS

格式: 段名 SEGMENT [定位类型] [组合类型] [‘类别’] <段内语句序列> 段名 ENDS

(1)段名:由编程者任取,定位类型、组合类型和类别是赋给段名的属性,它们可以缺省。

(2)定位类型:用来规定对段起始边界的要求,有以下四种:

8

PAGE:段起始地址的最低8位必须为0,即从一页的起点开始。 PARA:段起始地址的最低4位必须为0。此为缺省值。 WORD:段起始地址的最低1位必须为0,即为偶地址。 BYTE:段起始地址为任意。

(3)组合类型:表示本段与其它段的关系,它是为连接程序提供信息的,可以有6种选择。

NONE:表示本段与其它段逻辑上不发生关系。此为缺省值。

PUBLIC:连接程序首先将本段与其它同名同类别的段相邻地连接在一起,然后为所有这些PUBLIC段指定一个共同的段基址,连接的先后次序由连接命令指定。STACK:与PUBLIC同样处理,但此段作为堆栈段。当多个程序模块连接在一起时,各模块中至少得有一个模块内有一个指向第一个所遇到的STACK段。

COMMON:连接程序为本段和其它同名同类别的段指定相同的段基址。因而这些段是相互重叠的。

AT表达式:连接程序把本段装在表达式的值所指定的段地址上。这种方式不能用来指定代码段。

MEMORY:连接程序把本段定位在被连接在一起的其它所有段之上。若有多个MEMORY段,汇编程序认为所遇到的第一个为(4)类别:这是编程者给各段赋与的一种名字信息。连接程序将类别名相同的段组成一个段组,用它们共同的类别名字作为这个段组的名字。2、ASSUME

ASSUME是用来设定各实际段与各段寄存器之间的关系。汇编程序将利用ASSUME给出的信息,检查程序中使用的变量和标号,对于某些产生段超越的变量,汇编程序将为它们产生相应的段超越前缀。3、ORG

ORG用于规定段内的起始地址。例如: ORG 0200H 五、过程定义指令 在程序设计中,往往将一些重复出现的语句组定义为子程序。可由CALL指令来调用。过程定义的格式如下:过程名 PROC [NEAR]/FAR <语句序列> RET 过程名 ENDP 说明:

(1)过程名在程序中可以作为标号使用。(2)PROC和ENDP必须成对出现。(3)过程的类型有NEAR和FAR若为FAR过程,则可由段间程序调用。

STACK段。如果有多个,MEMORY,其余为是否可以通过段寄存器来寻址。

NEAR过程,则只能被本代码段调用,9

则初始化时,COMMON

SS

子程序又称为过程,。若为

例:在屏幕右上角显示时间“分:秒”,按任一键停止。 提示:

显示中断功能调用(INT 10H) 1.显示字符(AH=0EH)

AL字符ASCII码,BL前景色(可设为7) 2.置光标位置(AH=2)

BH_页号 DH__行号(0~24)、DL_列号(0~79) 3.取光标位置(AH=3)

BH_页号 返回DH、DL_ 行、列号

DATA SEGMENT

TIME DB 'Time=00:00$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA GO: MOV AX,DATA MOV DS,AX

LP: MOV AH,2CH ; 取时间CX:DX,CH时;CL分 INT 21H MOV BL,10 ;转换”分” MOV AH,0 MOV AL,CL DIV BL ;ax/10 ADD AL,30H MOV TIME+5,AL ADD AH,30H MOV TIME+6,AH MOV BL,10 ; 转换”秒” MOV AH,0 MOV AL,DH DIV BL ; ax/10 ADD AL,30H MOV TIME+8,AL ADD AH,30H MOV TIME+9,AH

MOV BH,0 ;定光标位置

10

MOV DX,0040H MOV AH,2 INT 10H

MOV DX,OFFSET TIME ; 显示 MOV AH,9 INT 21H

MOV AH,0BH ; 检测按键 INT 21H CMP AL,0

JZ LP ;无按键,则继续 MOV AH,4CH INT 21H CODE ENDS END GO

例:计数器。按空格键计数(从00开始),其它键退出。

DATA SEGMENT TIME DB '00$' DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

GO: MOV AX,DATA

MOV DS,AX

LP: MOV DX,OFFSET TIME

MOV AH,09H INT 21H MOV DL,0DH MOV AH,02H INT 21H MOV AH,08H INT 21H CMP AL,20H JNE DONE INC TIME+1 CMP TIME+1,3AH JL LP

MOV TIME+1,30H INC TIME CMP TIME,3AH JL LP

11

MOV TIME,00H JMP LP

DONE:MOV AH,4CH INT 21H CODE ENDS END GO

12

本文来源:https://www.bwwdw.com/article/qalr.html

Top