null第3章 汇编语言程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
基础 第3章 汇编语言程序设计基础 3.1 汇编语言的注释与指令格式
3.2 汇编语言程序的需求
3.3 EXE文件的初始化
3.4 源程序的实例 3.1 汇编语言的注释与指令格式3.1 汇编语言的注释与指令格式 3.1.1 汇编语言注释栏
注释的使用可增强程序的可读性,尤其是对一组令人费解的汇编语言指令。注释栏是以分号(;)开始的,当程序中出现分号时,汇编程序就把右侧的所有字母视为注释。注释栏可以使用包括空格在内的任何可显示的字母、符号和数字。
null 注释栏可跟在同一行指令的右侧或自成一行,如下面例子所示:
(1) ;This entire line is a comment.
(2) ADD AX, BX ;Comment on same line as instruction.
注释栏只出现在汇编语言的源程序中,并不产生机器码,所以它不影响程序的执行。在本章中汇编语言指令是以大写字母来编写的,这样做的目的是使程序更容易阅读。
null 3.1.2 汇编语言的语句格式
汇编语言符号指令的一般格式如下所示:
[名称] 助记符 操作数(一个或多个)
名称(若存在的话)、助记符、以及操作数之间至少要使用一个空格或跳格(Tab)分隔。虽然一行最多可容纳132个字符,但由于屏幕显示为80个字符,因此一般人还是以80个字符来处理一行,方括号表示该项是可选择项。 null下面是两个例子:
名 称 助记符 操作数 注释
COUNT DB 1 ;变量名,操作码,一个操作数 MOV AX , 0 ;操作码,两个操作数
null1. 名称
汇编语言的名称可用下列的字符来组成:
字母: A~Z与 a~z
数字: 0~9
特殊字符:?,· ,@,-,$
null 名称的第一个字符必须是字母或是特殊字符,其最大长度限制在31个字符。例如,CONT、PGE25以及$E10皆为合法的名称。而且应尽量使用具有意义与可描述的名称。寄存器名称,诸如AX、DI与AL是保留字,专门用来表示寄存器名,不能作为名称使用。所以,像下面这条指令:
ADD AX,BX
null 汇编程序会自动知道AX与BX是寄存器。然而像下面这条指令:
MOV REGSAVE,AX
则只有在数据段内定义过REGSAVE后,汇编程序才能识别这个名称。
注意:名称使用在数据段中时被称为变量名,若是用在指令段(即程序)中则称标号名,简称标号,用在过程中时又称为过程名。当作为标号使用时,必须以冒号(:)结束。如:
START:MOV AX,DATA null 2. 助记符(操作码)
助记符表示所要执行的操作,也被称为操作码。在数据段中,操作码则定义了一个工作区或常数。而在指令段中,操作码则表示了一个诸如MOV或ADD的操作。
null 3. 操作数
操作码(即助记符)表示了要执行何种操作,而操作数则指出被操作的对象。操作数在数据段中一般为变量的初值,在指令段中一般为操作的对象。下面的例子在数据段,定义了变量COUNTR,其操作数表示所定义的值为0。
名称 操作码(助记符) 操作数 注释
COUNTR DB 0
;COUNTR定义了一个值为0的字节
null 在指令段中,一个操作数可以包含1个、2个或0个项目,项与项之间用逗号隔开。下面有三个例子:
操作码(助记符) 操作数 注释
没有操作数 RET ;返回
一个操作数 INC CX
;递增CX,即(CX+1)→ CX
两个操作数 ADD AX,12
;把12加入AX中
null 名称(变量名、标号)、操作码以及操作数不需要从特定的列开始。然而,这些项目一般均从相同的列开始编写,以提高程序的易读性。DOS EDIT编辑软件提供了Tab键,它能在每隔8个字符的位置停住。 3.2 汇编语言程序的需求3.2 汇编语言程序的需求 当汇编程序对汇编语言源程序进行汇编时,必须得到一些指示才能进行。汇编语言提供了一些伪指令,可以满足汇编程序的需求。这些伪指令只能在汇编程序对汇编语言源程序的汇编过程中产生作用,并不会产生任何可执行的机器指令码。下面将介绍一些常用的伪指令。
null 1. SEGMENT 段定义伪指令
任何一个汇编语言源程序至少含有一个指令段,以容纳可执行的机器指令码。某些程序同时也定义堆栈段作为堆栈存储使用,以及定义数据段来定义变量的初值。定义段的汇编语言伪指令为SEGMENT,其格式如下所示:
名称 操作码(助记符) 操作数
段名 SEGMENT [选择项]
…
段名 ENDSnull 此格式必须含有段名,且是唯一的。除此之外,段名称必须符合汇编语言的名称命名规则。ENDS指示段的结束,并且与SEGMENT含有相同的段名。SEGMENT的选择项含有下列三种:起始边界类型、结合类型与分类(Class)。
1) 起始边界类型
此项指示段的起始边界地址,一般是PARA。其作用是使得段的起始地址与节边界位置地址对齐。即它的物理地址能被16整除(nnnn0)。若没有此选择项,汇编程序就将它默认为PARA。
null 2) 结合类型
此项指示当汇编后进行链接时,是否需要与其他段结合。其类型有STACK、COMMON、PUBLIC、AT
expression以及MEMORY。例如:
STACK_ SEGMENT PARA STACK
你可以使用PUBLIC、COMMON以及MEMORY将各个已独立汇编过的程序链接起来。若程序无需与其他程序结合时,就可省略这个选择项。
3) 类型
此项目用引号括起来。当链接时,它会把相关的段集合在一起,如下所示:
STACK_ SEGMENT PARA STACK ‘stack’null 2. PROC 过程定义伪指令
指令段内含程序的机器指令码。此段同时也含有一个或数个由PROC伪指令所定义的程序段,称为过程(Procedure)。下面是仅含有一个过程的指令段。
段名 SEGMENT PARA
过程名 PROC FAR
;一个包含在指令段内的过程
…
RET ;返回DOS
过程名 ENDP
段名 ENDS null 过程也必须有名称,且是唯一的。除此之外,此过程名必须符合汇编语言名称的命名规则。操作数FAR告诉DOS的装载程序,PROC是此程序的执行进入点。
ENDP伪指令指示一个过程的结束,它与PROC具有相同的过程名。一个指令段可以同时含有数个过程。
null 3. ASSUME 段指定伪指令
微处理器使用SS寄存器作堆栈段的定址,以DS寄存器定址数据段,且以CS寄存器定址指令段。你必须告诉汇编程序,每一段所对应的段寄存器是哪个。ASSUME伪指令可以完成此工作,它在指令段中的编程格式如下所示:
助记符 操作数
ASSUME SS:堆栈段名,
DS:数据段名,CS:指令段名
null 例如,SS:堆栈段名,表示汇编程序将使SS寄存器指向堆栈段。操作数项可依任意的顺序出现。除此之外,它也可以含有ES寄存器项,若程序中没有使用到ES寄存器,则可将ES项省略或写成ES:NOTHING。
null 4. END 伪指令
如前所述,ENDS伪指令结束一个段,ENDP伪指令结束一个过程。而END伪指令可用来结束整个源程序,其格式如下:
操作码(助记符) 操作数
END [过程名]
若程序不用执行,则操作数项可为空白。对于仅含有一个模块的典型程序,END的操作数应为PROC的名称,即类型为FAR的过程名。
3.3 EXE文件的初始化3.3 EXE文件的初始化 EXE与COM为两种可执行磁盘文件。在本节中,我们将探讨EXE文件的程序格式,而在以后的学习中再介绍COM文件的程序格式。在DOS环境下,对汇编语言EXE文件的程序初始化,有四项需求,分别为:① 告知汇编程序哪些段寄存器指向哪些段;② 当程序开始执行时,把DS的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
压入堆栈中;③ 将一个0地址压入堆栈中;④ 把数据段的起始地址装入DS。
null 当退出一个程序并返回DOS时,可以利用RET指令实现返回。图3-1说明了启动与退出EXE文件程序的全部。
—————————————————————————————————————————————
DATASG SEGMENT PARA ‘Data’
;定义数据段
…
DATASG ENDS
;数据段结束
; —————————————————————
nullCODESG SEGMENT PARA ‘CODE’ ;定义代码段
BEGIN PROC FAR ;定义过程
1. ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
2. PUSH DS ;DS 压入堆栈
3. SUB AX , AX ;AX清0000
PUSH AX ;堆栈压入0000
4. MOV AX , DATASG ;数据段起始地址送入DS
null MOV DS,AX
…
5. RET ;返回DOS
BEGIN ENDP ;过程结束
CODESG ENDS ;代码段结束
END BEGIN ;源程序结束
图3-1 EXE程序的初始化1null (1) ASSUME伪指令告诉汇编程序,将哪些段寄存器指向哪些段。图3-1中,CS指向CODESG、DS指向DATASG,SS指向STACKSG。在此例子中并没有定义STACKSG,若定义则将写成下列的形式:
STACKSG SEGMENT PARA STACK Stack ‘Stack’
…
STACKSG ENDS
null 借助使用段寄存器指向段,汇编程序就能够计算出每个项的差距值(偏移地址)。例如,指令段中每一条指令都有特定的长度,第一条指令位于差距0处,若其长度为一个字,则第二条指令就位于差距为2的地址,其余依次类推。
null (2) 存储器中,在可执行程序之前的256(十六进制100)个字节区域,称为程序段前缀区(PSP)。DOS装载程序时使用DS寄存器来建立PSP的起点。你的程序必须将此地址“压入”堆栈存储起来,以供后面的RET指令利用这个地址返回DOS。
(3) 系统要求堆栈中的下一个地址值为0。为了达到这个目的,可以利用SUB指令把AX清成0,再把0值压入堆栈。
null (4) DOS装载程序会正确地把堆栈的起始地址存放在SS寄存器中,并把指令段的起始地址置入于CS寄存器中。因为装入程序已经把DS作别的用途,所以你必须按如图3-1所示的方式,利用MOV指令设置DS的初值,使DS指向DATASG数据段的起始地址。在下一节的源程序例3.1中,将详细地介绍DS的初始化。
(5) 借助开始压入堆栈中的地址(PUSH DS和PUSH AX),RET指令将使控制权退出程序而返回到DOS。另一种退出程序返回DOS的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
是使用MOV AH,4CH和INT 21H指令,其特点是程序不通过过程实现执行,程序格式如图3-2所示。 null DATASG SEGMENT PARA ‘Data’ ;定义数据段
…
DATASG ENDS ;数据段结束
; —————————————————————
CODESG SEGMENT PARA ‘CODE’ ;定义代码段
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
null START: MOV AX , DATASG
;数据段起始地址送入DS
MOV DS,AX
…
MOV AH,4CH ;返回DOS
INT 21H
CODESG ENDS ;代码段结束
END START ;源程序结束图3-2 EXE程序的初始化23.4 源程序的实例3.4 源程序的实例 例3.1 把前面所介绍的EXE文件程序架构,编写成一个汇编语言源程序。此程序包含了一个称为STACKSG的堆栈段与一个称为CODESG的指令段。
STACKSG包含了一项DB(定义字节),它重复定义了“STACK SEG”12次。以后的程序不会再用此方式来定义堆栈段,但当你使用DEBUG来观察汇编、链接过的程序时,此定义将有助于你找到堆栈段的位置。 nullEXE程序格式的源程序清单如下:
;L31.ASM
;—————————————————————
STACKSG SEGMENT PARA STACK ‘stack’
DB 12 DUP (‘STACKSEG’)
STACKSG ENDS
;—————————————————————
CODESG SEGMENT PARA ‘Code’
nullBEGIN PROC FAR
ASSUME SS:STACKSG , CS:CODESG , DS:NOTHING
PUSH DS ;push ds onto stack
SUB AX , AX ;push zero offset
PUSH AX ;onto stack
MOV AX , 0123H ;Move hex 0123 to ax
null ADD AX , 0025H ;Add hex 25 to ax
MOV BX , AX ;Move AX to bx
ADD BX , AX ;Add AX to bx
MOV CX , AX ;Move CX to ax
MOV AX , AX ;Move AX to ax
NOP
RET
BEGIN ENDP
CODESG ENDS
END BEGIN
null CODESG包含了程序中所有可执行的指令,但第一条陈述ASSUME并不产生可执行指令码。ASSUME伪指令指定了STACKSG给SS寄存器以及CODESG给CS寄存器。实际上,此程序告诉汇编程序使用SS寄存器的值来对STACKSG定位,以及使用CS寄存器的值来对CODESG定位。当系统将程序装入到内存储器中执行时,它会设定实际的地址给SS与CS寄存器。因为此程序并没有定义数据,故它没有数据段,所以ASSUME无需指定DS寄存器。
null 紧接在ASSUME之后的指令——PUSH、SUB与PUSH是初始化的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
操作,它先把DS寄存器的内容压入堆栈,其次再把一个0压入堆栈。因为通常是从DOS执行一个程序,所以这些指令使得在程序执行后能够正确地返回DOS。例3.1的程序没有显示功能,汇编、链接后生成的 .EXE程序直接执行时会看不到结果,你可以使用DEBUG执行该程序,方法可参考第2章的2.4.1和2.4.3小节。 null例3.2 用MOV AH,4CH和INT 21H返回DOS的EXE格式的源程序。源程序清单如下:
;L32.ASM
;—————————————————————
DATASG SEGMENT PARA ‘Data’
DATAW1 DW 0123H ;dataw1=0123H
DATAW2 DW 0025H ;dataw2=0025H
DATAW3 DW ? ;dataw3预留一个字单元
DATASG ENDSnull;—————————————————————
STACKSG SEGMENT PARA STACK ‘stack’
DB 12 DUP (‘STACKSEG’)
STACKSG ENDS
;—————————————————————
CODESG SEGMENT PARA ‘Code’
ASSUME SS:STACKSG , CS:CODESG , DS:DATASG
nullSTART: MOV AX,DATASG
MOV DS,AX
MOV AX , DATAW1 ;Move hex 0123 to AX
ADD AX , DATAW2 ;Add hex 0025 to AX
MOV DATAW3 , AX ;Mov AX to dataw3
NOP
MOV AH,4CH
INT 21Hnull CODESG ENDS
END START
例3.2不同于例3.1的地方有两点,一是采用第二种程序格式,二是数据被定义在数据段内。