第4章1汇编语言程序组织_第1页
第4章1汇编语言程序组织_第2页
第4章1汇编语言程序组织_第3页
第4章1汇编语言程序组织_第4页
第4章1汇编语言程序组织_第5页
已阅读5页,还剩170页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章汇编语言程序设计主要内容4.0

绪论汇编语言、机器语言、高级语言实模式和保护模式下的汇编语言程序设计汇编语言源程序结构汇编语言语句格式常用伪指令汇编语言的表达式汇编语言程序上机过程调用ROM

BIOS或DOS中断实现数据的输入输出机器语言、汇编语言、高级语言程序设计语言包括:1)机器语言:直接用二进制代码的机器指令表示的语言。

用机器语言书写的程序叫做机器语言源程序,计算机可以直接运行机器语言源程序。机器语言程序的执行效率高。2)汇编语言:用指令助记符、符号地址、标号等符号书写程序。用汇编语言书写的程序叫做汇编语言源程序,计算机不能直接运行汇编语言源程序。汇编语言程序的执行效率高。3)高级语言:接近英语自然语言和数学表达式。用高级语言书写的程序叫做高级语言源程序,计算机不能直接运行高级语言源程序。高级语言程序易于编写,开发周期短,可移植性好。但得到的目标代码容量大。例子:要求编写程序实现:123+456SUM⑴用C语言实现main(

){int

a,b,sum;a=123;b=456;sum=a+b;}它与人类语言和数学表示很相似,容易书写和读懂。(2)

用80X86

汇编语言实现code

segmentorg

100hassumecs:code,ds:codemainproc

nearmovaddmovmovIntdwdwdwendpendsendax,aax,bsum,axax,4c00h21h123456?absummaincodemain反汇编出来的代码部分:A10F01

MOV

AX,[010F]ADD

AX,[0111]12F8:010012F8:12F8:010712F8:010A12F8:010DA31301B8004CCD21MOV

[0113],AXMOV

AX,4C00INT

21用a、b、sum名字定义的数据在机器中显示为:12F8:010f 7B

00

C8

01

43

02(3)用IBM

PC(采用80x86CPU)机器语言实现用DEBUG环境下的E命令把机器指令及数据输入内存。①键入程序代码:-e

cs:100

a1

0f

01

03

06

11

01a3

13

01

b8

00

4c

cd

21②为数据分配空间:-e

ds:10f

7b

00

c8

01

00

00这里需要考虑:

a.给代码和数据分配内存空间。

b.熟悉机器指令及其格式。

c.熟悉数据在内存中的存放顺序。

d.把十进制数转换成十六进制数。123的十六进制数表示为007b,在内存中占用一个字456的十六进制表示形式01c8,在内存中占用一个字③运行并得到结果:12F8:0113 43

020243是加法和579的十六进制表示形式汇编语句与机器语句一一对应,把每条指令及数据用便于记忆的符号书写。汇编语言是一种符号化了的机器语言,2.汇编语言特点先比较上例各个程序占用的字节数,见下表。程序设计语言可执行程序占用字节数高级语言(C)CSUM.EXE4330汇编语言(MASM)ASMSUM.COM21机器语言(IBMPC)MACHINE.COM21汇编语言特点:1)与高级语言相比,汇编更接近机器语言,能够直接控制硬件,代码占用内存空间少、执行速度快.2)不容易掌握、且可移植性差。3.汇编语言应用场合空间、时间中断处理程序模块驱动程序关键部分

工业控制核心4.使用汇编语言编程需要具备的基础知识

编程者应熟悉机器的内部结构及与编程相关的硬件知识,例如CPU的寄存器组、存储器结构、外设、中断系统等。节CPU数据总线宽度地址总线宽度寻址能力工作模式808616201MB字节实模式80888201MB字节实模式80286162416MB字节实模式、保护模式80386SX162416MB字实模式、保护模式80386DX32324GB字节实模式、保护模式80486DX32324GB字节实模式、保护模式Pentium643264GB实模式、保护模式Intel80x86系列微处理器三种运行模式从80386开始,Intel的CPU具有3种运行模式:实模式、保护模式和虚拟8086模式。实模式保护模式虚拟8086模式Reset复位Reset复位、修改CR0LMSW指令、修改CR0中断或异常Reset复位IRETD指令、任务转换CPU的3种运行模式及其转换关系图1.实地址模式CPU复位(Reset)或加电(PowerOn)时以实模式启动,为保护模式所需要的数据结构做准备。在实模式下,存储器管理、寻址方式及中断处理机制和8086相同。由16位段寄存器的内容乘以16当做基地址,加上16位偏移地址形成20位的存储器物理地址。在实模式下,所有的段都是可以读、写和可执行的。存储器中保留两个固定区域

FFFF0H~FFFFFH, 00000~003FFH。2.保护模式是PENTIUM的本性工作方式。在保护模式下,CPU提供的功能:支持多任务支持内存分段分页管理,支持虚拟内存段的大小可以设置为4GB,段内的偏移量为32位。支持4个特权级和配套的特权检查机制,实行特权级保护设置4个特权级:编号为0~3。最高的是特权级0,其次是1,2,3。Windows只使用了特权级0和特权级3。特权级0中运行的是操作系统内核和各种硬件驱动程序;特权级3中运行的是各种应用程序。Windows采用保护机制主要为了检查和防止应用程序的越权操作。这些功能是Windows/Linux等现代操作系统的基石。实模式和保护模式的本质区别在实模式下:应用程序可以执行任何的CPU指令,读写所有的内存,操作系统不能控制应用程序的行为,应用程序可以做任何事情,没有任何限制。实模式下不支持处理器级多任务切换.在保护模式下:通过设置特权级和内存的分段分页,应用程序只能读写属于它自己的内存空间,而不能破坏其他应用程序和操作系统。如果没有CPU保护模式的支持,操作系统的许多功能根本无法实现。多核64位保护模式汇编--开发操作系统内核系统开机或复位后,先进入实模式完成初始化,然后转到保护模式。实模式下没有特权级的概念,相当于所有的指令都工作在特权级0,即最高的特权级。它可以执行所有特权指令,包括读写控制寄存器CR0等。Windows/Linux操作系统就是通过在实模式下初始化控制寄存器、GDTR、LDTR、IDTR、TR等寄存器以及页表,然后再通过置CR0的保护模式位(PE位)为1而进入保护模式的。实模式和保护模式的关联虚拟8086模式在保护模式下,可通过软件切换到虚拟8086模式。支持多任务,支持任务切换虚拟8086模式是CPU工作于多任务状态下的某一个任务对应的方式,可使8086软件有效的在32位系统中运行。每个任务的寻址空间为1MB存储器在分段基础上又分页,每页4KB。在CPU上可以同时支持由多个真正的CPU任务和多个虚拟8086任务。80X86汇编语言程序设计实模式下的汇编语言程序设计保护模式下的汇编语言程序设计程序可见寄存器组程序可见寄存器组:是汇编语言程序设计员在应用程序设计期间可以使用的,可以在指令中出现;包括多个8位、16位和32位寄存器,阴影部分只对80386(含80386)以上CPU有效。通用寄存器段寄存器控制寄存器程序不可见寄存器组:指在应用程序设计时不能直接被寻址,但系统程序

系统运行程序期间可能要用到的寄存器。8086~Pentium

CPU程序可见寄存器组1615CH

CL(CH)

CX

(CL)(AH)

AX

(AL)EAXEBXECXEDX(DH)

DX

(DL)位08731AH

ALSPESPAH

ALBPEBPAH

ALSIESIDIEDIIPEIP(BH)

BX

(BL)FLAGS数据寄存器堆栈指针基址指针源变址目的变址指令指针标志指针寄存器变址寄存器控制寄存器通用寄存器FLAGSGSCSSSDSESFS代码段寄存器堆栈段寄存器数据段寄存器附加段寄存器段寄存器汇编语言程序设计的步骤根据实际问题抽象出数学模型,确定算法画出程序框图(流程图)分配内存单元和寄存器根据框图编写源程序,存成.ASM文件对源程序汇编,生成.OBJ目标文件把.OBJ文件连接成.EXE执行文件运行、调试汇编语言上机过程YYN有错?Y有错?N有错?N结束汇编

输入(修改)源程序连接

运行

查错

开始文本编辑器编辑源程序。源程序存为.ASM文件用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM<源文件名.ASM>;用LINK连接程序进行连接。连接后生成.EXE可执行文件。命令格式:LINK<目标文件名.OBJ>;用TD、DEBUG等调试程序进行调试。①能够编写简单的、完整的汇编语言源程序。②掌握汇编语言程序上机过程,汇编程序调试手段。本章基本要求汇编开发软件1)MASM微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。MASM版本至今在不断的更新,推荐使用新版本进行开发。2)Masm

for

Windows

集成实验环境Masmforwindows集成实验环境是从事一线教学的教师针对汇编语言初学者的特点开发的一个简单易用的汇编语言学习与实验软件,支持32位与64位的WINDOWS

7,支持DOS的16/32位汇编程序和

Windows下的32汇编程序(并提供调试通过的35个WINDOWS汇编程序实例源代码),它具有错误信息自动定位、关键字实时帮助并且在帮助中动画演示汇编指令的执行过程、语法着色、无限次撤消与恢复、WORD式的查找、替换、定位、支持中文、长文件名等功能。4.1

汇编语言源程序结构汇编语言编程可以使用两种基本格式: 使用完整段定义使用简化段定义完整段定义格式需要较复杂的语法,但它可以提供完整的控制,是大多数汇编程序通用的,也是软件开发中经常使用的。本节介绍使用完整段定义格式书写的汇编语言源程序。汇编语言源程序:通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段——堆栈段——堆栈区域代码段——存放程序指令stack

SEGMENT

PARA

‘stack‘DB 100

DUP(

?)stack

ENDSdata

SEGMENT<数据、变量在此定义>data

ENDScode

SEGMENTMAIN

PROC

FARASSUME

CS:code,

DS:data,

ES:data

,

SS:stackstart:

PUSH

DSXOR

AX,AXPUSH

AXMOV

AX,

dataMOV DS,

AXMOV ES,

AX<此处加入你自己的程序段>RETMAIN

ENDPSUBR1

PROC

NEAR<此处加入子程序段>SUBR1

ENDPcode

ENDSEND

start堆栈段数据段代码段汇编语言程序框架参考一:stack

SEGMENT

PARA

‘stack‘DB 100

DUP(

?)stack

ENDSdata

SEGMENT<数据、变量在此定义>data

ENDScode

SEGMENTMAIN

PROC

FARASSUME

CS:code,DS:data,ES:data,

SS:stackstart:

MOV AX,

dataMOV DS,AXMOV ES,AX<此处加入你自己的程序段>MOV AX,4C00HINT

21HMAIN

ENDPSUBR1

PROC

NEAR<此处加入子程序段>SUBR1

ENDPcode

ENDSEND

start堆栈段数据段代码段汇编语言程序框架参考二:例.编程实现123+456→SUM单元的功能。(程序4.1)STSGSEGMENTSTACK

‘S’;①DW32

DUP(?)STSGENDSDATASEGMENTADW123BDW456SUMDW?DATAENDSCODESEGMENTMAINPROCFAR;③ASSUMECS:CODE,DS:DATA,SS:STASG,ES:NOTHING;②START:MOVAX,DATA;⑤MOVDS,AXMOVAX,

STSGMOVSS,AXOPTADD:MOVAX,AADDAX,BMOVSUM,AXMOVAX

,4C00HINT21H

;⑥MAINENDPCODEENDSENDSTART

;④4.2

汇编语言语句格式汇编语句:指令、伪指令、宏指令。每条指令语句都生成机器代码,各对应一种CPU操作,在程序运行时执行。伪指令语句由汇编程序在汇编过程中执行,它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。宏指令是用户按照宏定义格式编写的一段程序,可包含指令、伪指令、甚至其他宏指令。汇编语言语句格式:[名字]

助记符

<操作数>其中带[

]的内容是可选的。[;注释]1

名字域名字域是语句的符号地址,命名规则:组成:A-Z(不分大小写),

0-9,?@

_

$等不能以数字开头,长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义过程名、段名等标号-只能出现在指令性语句前,标号后应加上冒号标号代表指令的符号地址,用来代表指令在存储器中的地址。变量名,只能出现在指示性语句中,名字后不加冒号用来代表操作数在存储器中的符号地址。名字具有三属性:段基址、偏移量和类型。标号的类型有NEAR型和FAR型,变量的类型有字节、字、双字、四字等。有三个属性:段基址:即标号所在段的段基址;偏移量:标号所代表存储单元的段内偏移地址;类型:NEAR或FAR:标号通常作为转移指令或CALL指令的转移地址。NEAR—表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。FAR—标号所在语句与转移指令/调用指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。标号—指令所在内存单元的符号地址变量变量—即堆栈段、数据段中的数据单元。变量名—是存储单元的符号地址。变量的三个属性:段基址—变量所在段的段基址偏移量—变量单元地址与段首地址之间的位移量。类型—有BYTE、WORD和DWORD等。变量在程序中作为存储器操作数被引用。助记符域给出操作的符号表示,包括指令助记符、伪指令助记符等。例如:MOV

ADD

CALL。操作数域由一个或多个表达式组成,多个操作数项之间用逗号分隔:指令语句:操作数项给出操作数或操作数的地址;伪指令、宏指令:操作数项给出所要求的参数;注释域用以说明本条语句在程序中的功能,要简单明了。注释以分号;开始。4.3

汇编语言常用伪指令程序框架类伪指令数据定义伪指令符号定义伪指令微处理器伪指令简化段定义伪指令1.段定义伪指令汇编语言程序是按段来组织程序和数据的。汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。

三类段:代码(程序)、数据、堆栈基本格式:段名

SEGMENT[定位类型][组合类型][’类别’]...段名

ENDS功能:定义一个段。4.3.1

程序框架类伪指令说明:SEGMENT定义一个段的开始,ENDS定义该段的结束。[]中内容是可选的,定位类型确定段的起始边界,组合类型说明段之间的关系,类别说明本段归于哪一类,类别名由用户自己起,并用单引号括起来。例.CODESEGMENT...CODEENDS程序4.1的①定义了堆栈段STSG,有三个可选参数。2.ASSUME伪指令格式:ASSUME段寄存器名:段名[……]功能:说明段寄存器和段之间的关系。说明:ASSUME语句并不给段寄存器赋值,它应放在引用段寄存器之前,通常放在代码段或主过程的第一个语句位置。例程序4.1中的语句②。语句中的CODE和DATA为段名。这个语句说明:CS将指向名字为CODE的代码段DS将指向名字为DATA的数据段注意:ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句MOV

AX,DATAMOV DS,

AX将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。代码段基地址不需要程序员装入CS寄存器,而由OS负责装入。3.过程定义伪指令格式:过程名

PROC

[类型]...过程名

ENDP功能:定义一个过程。说明:汇编语言中无论是主程序还是子程序都以过程形式出现。

过程名由用户自己起。类型选项指明该过程的类型,可以是:NEAR(或缺省)—说明该过程是近型的,只能在段内被调用FAR—说明该过程是远型的,可以在段间被调用,也可以在段内被调用。一个代码段可以含有多个过程,具有.EXE结构的主过程必须是FAR型。例:程序4.1中的语句③,只定义了一个FAR型过程,其过程名为MAIN。4.程序结束伪指令格式:END第一条指令的标号功能:表示源程序结束。说明:过程名指示程序执行起始地址。只有主过程模块的END后可带过程名,它必须是主程序名。若一个程序由多个模块组成,则除主模块外,其他模块的END语句不能带过程名。例如.END

START程序4.1中语句④,程序从START处开始执行。5.使DS指向用户程序的数据段在用户程序运行过程中,DS应指向程序自己的数据段以便访问其中内容,例如我们要访问A、B和SUM变量。同理ES等也应设置为正确的位置。为此,应在程序中用指令为

DS等段寄存器赋值。见程序4.1的⑤。6.如何返回DOS见程序4.1汇编语言源程序把主程序建立为过程,由DOS调用该过程,程序结束如何返回DOS?用RET指令返回DOS使用编号为4CH的系统功能调用返回DOS返回码→AL,正常返回时返回码为0。典型的.COM文件结构.COM文件是一种可执行程序,它的总长度不能超过

64KB,整个文件只能由一个段组成。它没有文件头,只包含程序本身的二进制代码。

这种结构代码紧凑,与实现同功能的.EXE文件相比,占用内存更少,速度更快,因此适合编制较小的程序,例如DOS的外部命令SYS、FORMAT等都是.COM结构。CODESEGMENTORG

100H;程序4.2ASSUME

CS:CODE,DS:CODEMAINPROC

NEARJMP

STARTDW

123DW

456DW

?MOVADDMOVABSUMSTART:AX,AAX,BSUM,

AXMAINCODEENDPENDSEND

MAIN7

ORG伪指令ORG规定了其后的指令或数据存放的起始地址(偏移地址)格式:

ORG

<表达式>表达式的值即为开始地址,从此地址起连续存放指令或数据。说明:在汇编程序对源程序汇编的过程中,使用地址计数器保存当前正在汇编的语句的地址(段内偏移量)ORG伪指令设置地址计数器内容为数值表达式的值。例1.ABCSEGMENTORG

100Hbegin:

……ABC

ENDS返回指令从100H开始存放可以直接用$来表示地址计数器的值:当$用在指令中,表示本条指令的第一个字节的地址例

CCC:JNE

$+

6例

ORG

$+6;跳过6个字节的存储区域SEGMENTDW

1,2,3,4,5,6,7,8,9,10;数组元素个数;数组和的地址DATAARYCOUNT DW

($-ARY)/2SUM DW

?DATA

ENDS4.3.2

数据定义伪指令格式:[变量名]

助记符

操作数功能:为变量分配单元,并为其初始化或者只预留空间说明:①②变量名是可选的,需要时由用户命名。助记符是数据类型的符号表示。助记符数据类型一个数据项字节数DB(BYTE)字节型1DW(WORD)字型2DD(DWORD)双字型4DQ(QWORD)四字型8DF(FWORD)六字节型6DT(TBYTE)10字节型10操作数形式数字常量

字符串常量数值表达式地址表达式?<n>DUP(操作数,……)a.数字常量十进制数:以D结尾,汇编语言中缺省值是十进制数,

D可以省略不写。有效数字是0~9。二进制数:以B结尾,有效数字是0、1。例如:10100011B,10100011b。十六进制数:以H结尾,有效数字是0~9和A(a)~F(f)。若第一位数字是字母形式,则必须在前边加上0。例如:2H,12h,0AB56H,0ab56h。八进制数:以Q或O(字母)结尾,有效数字是0~7。例如:352Q。b.字符串常量

c.数值表达式、地址表达式d.

?操作数?用来保留存储空间,但不存入数据e.<n>DUP(操作数,……)例.M1M2DBDB15,67H,11110000B,?‘15’,’AB$’M3DW4*5M4DD1234HM5DB2

DUP(5,’A’)M6DWM2

;M2的偏移量设以上数据自1470:0000开始存放,则为:0F

67

F0

00

31

35

41

42

24

14

0034

12

00 00

05

41

05

41

04

00M3M4汇编后的内存分配情况M1

DB

15,67H,11110000B,?

M20FH67HF0H00H31H35H41H42H24H14H00H34H12H00H00HM1M2DB‘15’,’AB$’M3DW4*5M4DD1234HM5DB2

DUP(5,’A’)可直接通过变量名引用变量,但要注意类型匹配。例如:MOVAL,M1;(AL)=15MOVBX,M3;(BX)=20ADDM3,6;(M3)=26MOVAL,M2;(AL)=’1’=31HMOVBL,M2+2;(BL)=’A’=41HMOVM1+3,BL;(M1+3)=

41H4.3.3

符号定义伪指令1.EQU符号等值伪指令格式:符号名

EQU

表达式功能:用符号名代表表达式或表达式的值。说明:表达式可以是任何有效的操作数格式。例如常数、数值表达式、另一符号名或助记符。注意:用EQU定义的符号在同一个程序中不能再定义。例.CREQU0DH;回车符的ASCII值LFEQU0AH;换行符的ASCII值BELEQU07H;响铃符的ASCII值PORT_BEQU61H;定义PORT_

B端口BEQU[BP+6]

;[BP+6]用B表示程序中可以通过符号引用这些值,例如:;等价于MOV AL,

0DH;等价于ADD

BL,[BP+6])MOV

AL,CRADD

BL,BOUT

PORT_B,AL;输出到61H端口EQU用途:增加程序可读性、

缩短程序书写长度、避免因为某些修改而带来的程序不一致性。

EQU伪指令与$配合,得到变量分配的字节数。如下所示:MSG

DB

‘This

is

firststring.’Count

equ

$-msgMovcl,count

;(CL)=MSG的串长=21注意:用EQU定义的符号在同一个程序中不能再定义。以下语句是错误的:CT

EQU

1CT

EQUCT+12.=

等号伪指令格式:符号名=数值表达式功能:用符号名代替数值表达式的值说明:等号伪指令与EQU伪指令功能相似,区别是:等号伪指令的表达式只能是常数或数值表达式,用“=”定义的符号在同一个程序中可以再定义。通常在程序中用“=”定义常数。例.DPL1

20HK

1K

K+14.3.4

微处理器伪指令由于向下兼容,所以在Pentium机器上仍然可以使用.386伪指令。常用的选择微处理器伪指令有以下几种:伪指令功

能.286选择80286微处理器指令系统.386选择80386微处理器指令系统.486选择80486微处理器指令系统.586选择80586微处理器指令系统.8087选择8087数字协处理器指令系统.287选择80287数字协处理器指令系统.387选择80387数字协处理器指令系统4.3.5

简化段定义伪指令简化段定义是MASM

5.0版以后提供的,它较容易使用,和高级语言连接也比较容易。本节简介简化段定义常用结构及与其有关的伪指令。完整段定义1.简化段定义常用结构程序4.8给出简化段定义常用结构。程序4.8.MODELSMALL;定义内存模式为小模式.586;选择处理器.STACK512;定义堆栈段及其尺寸为512字节.DATA;数据段开始;数据在此处定义.CODE.STARTUP;代码在此处定义.EXITEND;代码段开始;加载后程序入口点;返回DOS或父程序;整个程序结束2.简化段定义常用结构中的伪指令(1)定义存储模型伪指令常用格式:.model

存储模型功能:定义存储模型。常用的存储模型有:①

TINY②

SMALL③

MEDIUM④

COMPACT⑤

LARGE⑥

HUGE⑦

FLAT(2)选择处理器伪指令.586但之前必须有定义存储模型伪指令.model(3)定义堆栈段尺寸伪指令格式:.stack

size功能:建立一个堆栈段并定义其大小说明:若不指定size参数,则使用缺省值1KB,这对大部分程序来讲足够用。4.简化段定义举例例.在屏幕上显示一串字符。源程序设该程序名为simp.asm,则对其汇编可以使用以下命令:c>ml

/Fl

simp.asm汇编连接后生成simp.lst和simp.exe文件,运行simp.exe后屏幕显示“Hello!”。.MODEL

SMALL.586.STACK

64.DATA'HELLO!',0DH,0AH,'$'.CODE.STARTUPMOV

AH,9LEA

DX,HIINT

21H.EXITENDHI

DB返回与完整段定义相比,.startup和.exit伪指令的引入方便程序设计人员。注意:当.386等选择处理器伪指令出现在.model伪指令之前时不能用.startup和.exit,否则汇编时出错。4.4

汇编语言的表达式汇编语言语句格式:[名字]

助记符

<操作数> [;注释]操作数项由1个或多个表达式组成:指令语句:操作数项给出操作数或操作数的地址伪指令、宏指令:操作数项给出所要求的参数;什么是汇编语句的表达式?表达式:常数、寄存器、标号、变量常数、寄存器、标号、变量通过操作符相组合的序列有数字表达式和地址表达式两种:表达式的值可为数值或地址汇编时按优先规则对表达式进行计算,从一个表达式得到一个值:具体的数值或地址。程序运行时不再改变。操作数表达式中的运算符算术、逻辑、关系、取地址、属性、杂类。在汇编程序汇编

。数值表达式,例:MOV

AX,4*1024汇编后的形式为:MOV

AX,4096地址表达式,例:MOV

BL,M2+21)算术运算符——+、-、*、/,MODM3M4汇编后的内存分配情况M1

DB

15,67H,11110000B,?

M20FH67HF0H00H31H35H41H42H24H14H00H34H12H00H00HM1M2DB‘15’,’AB$’M3DW4*5M4DD1234HM5DB2

DUP(5,’A’)2)逻辑运算符——AND、OR、XOR、NOT逻辑运算符只能对常数进行运算。例:MOV CL,

36H

AND

0FH经汇编后:MOV

CL,06H注意,不要把逻辑运算符与逻辑运算指令混淆:例:AND AX,

3FC0H

AND

0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX,3F00H等价。关系运算的结果是一个逻辑值:真或假关系为真,结果为全1关系为假,结果为全0例:

MOV BX,PORT

GT

300H若PORT的值大于300H,则汇编后为:MOV

BX,0FFFFH否则汇编后为:MOV

BX,03)关系运算符——EQ、NE、LT、GT、LE、GESEG:OFFSET:例:VAR取变量/标号的段地址

取变量/标号的偏移地址DB

12H……MOV

BX,OFFSETMOV

AX,SEG

VAR注意,以下指令等价:VAR

;取变量VAR的偏移地址;取变量VAR的段地址MOV BX,

OFFSET

VARLEA BX,

VAR4)取地址运算符——SEG、OFFSETTYPELENGTHSIZE取变量的类型(1,2,4)取所定义变量中元素的个数取所定义存储区的字节数(=TYPE*LENGTH)VAR

DW

1,2,3,4,5例:则TYPE VAR

=

2LENGTH VAR

=5SIZE

VAR =105)取值运算符——TYPE、LENGTH、SIZE6)属性运算符——PTR用来指定地址操作数的类型。格式:<类型> PTR

<操作数>

类型∈{BYTE,

WORD,

DWORD,NEAR,FAR}BYTE、WORD、DWORD用于描述数据存储单元(变量)的类型NEAR、FAR用于描述转移、调用的目的地址的类型例:MOVMOVBYTE

PTR[DI],0;字节类型

WORD

PTR[DI],0;字类型PTR也可用来进行强制类型转换例:STR1

DW

?MOV

AX,STR1;STR1定义为字类型;合法MOV

AL,STR1 ;非法MOV AL,BYTE

PTR

STR1;合法4.5

汇编语言程序上机过程汇编语言源程序,需经过以下过程,才能实现功能

1)建立、编辑源程序2)汇编3)连接4)运行、调试1.建立汇编语言源程序文件可以用任何一种文本编辑器建立、编辑汇编语言源程序。例如DOS提供的EDIT。启动EDIT的常用命令格式是:EDIT [文件名]其中文件名是可选的。汇编语言源程序,文件名的扩展名部分必须是.ASM例如:

D:\MASM>EDITADD1.ASM则屏幕显示:File

Edit

Search

View

Options

Help|--------

D:\masm\ADD1.ASM

-------|若EDIT是从Windows环境的MS-DOS方式进入的,则在DOS提示符后键入exit返回Windows。(以DOS平台为例)2.汇编汇编程序:功能:

1)把用汇编语言书写的源程序翻译成机器语言的目标代码2)检查用户源程序中的语法错误且显示出错信息3)生成列表文件等。汇编后目标程序中的地址部分是可浮动的相对地址,而不是可执行的绝对地址。使用较普遍的汇编程序是MASM和TASM。下边是Microsoft公司MASM5.X版的汇编操作。首先在DOS提示符后键入MASM命令:D:\MASM>MASM屏幕显示:Microsoft

(R)

Macro

Assembler

Version

5.10...Source

filename

[.ASM]:ADD1

(输入源文件名ADD1,不必输入扩展名)Object

filename

[ADD1.OBJ]:

(要求回答目标文件名,可直接按Enter确认)Source

listing [NUL.LST]:

ADD1

(列表文件名,需要时输入名字部分)Cross-reference

[NUL.CRF]:

(交叉引用文件名,缺省情况不产生)51058

+

421678

Bytes

symbol

space

free0WarningErrors0SevereErrors用命令行的形式按顺序对四个提示予以回答,格式:MASM

源文件名,目标文件名,列表文件名,交叉引用文件名;若只想对部分提示给出回答,则在相应位置用逗号隔开,若不想对剩余部分作答,则用分号结束。例如以下命令行与前边的分行回答等效:D:\MASM>MASM

ADD1

,

,ADD1;ADD1.LST文件的内容为:;偏移量……0000目标码DATA汇编格式SEGMENT0000007BADW

123……Segmentsand

Groups:NameLengthAlignCombineClassCODE……0014PARANONEDATA……0006PARANONESTSG……0040PARASTACK‘S’3.连接程序被汇编通过后,需要经过连接才能执行。连接程序的功能:连接分别产生的目标模块、解决外部交叉调用、产生一个可重定位的装入模块、以及产生可选的内存映象文件等。较普遍的连接程序:

LINK和TLINK。下边是Microsoft

Linker的连接操作。D:\MASM>LINKObject

Modules

[.OBJ]:

ADD1(输入由汇编产生的.OBJ目标文件名)Run

File

[ADD1.EXE]:(直接回车确认系统给出的默认可执行文件名)List

File

[NUL.MAP]:ADD1(输入内存映象文件名,缺省不产生)Libraries

[.LIB]:(直接按回车键)ADD1.OBJ经连接后在当前目录下产生了ADD1.EXE和ADD1.MAP文件。ADD1.MAP文件的内容为:StartStopLengthNameClass00000H0003FH00040HSTSGS00040H00045H00006HDATA00050H00063H00014HCODEProgram

entry

point

at0005:0000可以用命令行的形式按顺序对四个提示予以回答。格式:LINK

目标文件名,可执行文件名,内存映象文件名,库文件名;不必给出扩展名,连接程序会按照缺省情况使用。若只想对部分提示给出回答,则在相应位置用逗号隔开;若不想对剩余部分作答,则用分号结束。经过建立、汇编和连接,关于ADD1.ASM生成以下文件:ADD1ASM1,16411-09-0121:06ADD1.ASMADD1LST2,62911-09-0121:06ADD1.LSTADD1OBJ15211-09-0121:06ADD1.OBJADD1MAP23211-09-0121:07ADD1.MAPADD1EXE61211-09-0121:07ADD1.EXE5

file(s)4,789

bytes从6.0版以后,Microsoft公司把MASM和LINK的功能由一个ML.EXE程序完成,一个命令就可把源程序汇编、连接生成.EXE文件。ML.EXE的命令格式:ML

[/Fl][/Fm][/Fr][/c]

source_filename.asm其中source_filename.ext为汇编语言源程序的文件名,扩展名不能省略。 []中的F必须大写,l(字母)、m、r和c必须小写,各可选项含义如下:/Fl:产生.lst列表文件,缺省不产生/Fm:产生.map内存映象文件,缺省不产生。/Fr:产生.sbr交叉参考文件,缺省不产生。/c:只产生.obj文件,不产生.exe文件。缺省只产生.exe文件。例.ML

/Fl

TEST.ASM以上命令会对已存在的TEST.ASM文件汇编且连接,当前目录下生成一个列表文件TEST.LST和一个可执行文件TEST.EXE。4.运行例.D:\MASM>ADD1D:\MASM>DEBUG

ADD1.EXE-5.调试(1)用反汇编命令U显示可执行代码-u1307:00001EPUSHDS1307:000133C0XORAX,AX1307:000350PUSHAX1307:0004B80613MOVAX,13061307:00078ED8MOVDS,AX1307:0009A10000MOVAX,[0000]1307:000C03060200ADDAX,[0002]1307:0010A30400MOV[0004],AX1307:0013CBRETF(2)用R命令显示寄存器值-rAX=0000BX=0000CX=0064DX=0000SP=0040BP=0000SI=0000DI=0000DS=12F2ES=12F2SS=1302CS=1307IP=0000NVUPEIPLNZNAPONC1307:0000

1E

PUSH

DS以上为程序装入后寄存器初始设置,注意DS和ES的值,它们现在指向PSP的段基址。标志位值的符号表示:标志位OFDFIFSFZFAFPFCF(=1)OVDNEINGZRACPECY(=0)NVUPDIPLNZNAPONC(3)用G命令执行正在被调试的程序到断点-g9AX=1306

BX=0000

CX=0064

DX=0000SP=003C

BP=0000

SI=0000

DI=0000DS=1306

ES=12F2

SS=1302

CS=1307IP=0009 NV

UP

EI

PL

ZR

NA

PE

NC1307:0009

A10000

MOV

AX,[0000]

DS:0000=007B(4)用D命令查看数据-d

ds:0

f1306:0000 7B

00

C8

01

00

00

00

00-00

00

00

00

0000

00

00

...............(5)用T命令跟踪执行程序-tAX=0243BP=0000BX=0000SI=0000CX=0064DI=0000DX=0000DS=1306SP=003CES=12F2SS=1302CS=1307IP=0010NVUPEIPLNZACPONC1307:0010A30400MOV

[0004],AXDS:0004=0000-tAX=0243BX=0000CX=0064

DX=0000SP=003CBP=0000SI=0000DI=0000

DS=1306ES=12F2SS=1302CS=1307IP=0013NVUPEIPLNZACPONC1307:0013CBRETF(6)在返回前用D命令看程序的执行结果-d

ds:0

f1306:0000 7B

00

C8

01

43

02

00

00-00

0000

00

00

00

00

00

{...C...........1306:0004单元中的4302是结果579的十六进制逆序表示形式。(7)用Q命令退出DEBUG返回到操作系统-qD:\MASM>①建立文件:editprog4_3.asm②汇编:masmprog4_3;③连接:linkprog4_3;④转换:exe2bin

prog4_3.exe⑤删除.exe文件:del

prog4_3.exe⑥执行文件:⑦调试:prog4_3debug4.5.2

结构文件上机过程可以看出,它与.EXE文件上机过程类似,只是在连接后所生成的.EXE文件不能直接运行,而需要使用DOS命令

EXE2BIN把.EXE转换成.COM文件,然后删除连接所生成的.EXE文件,执行和调试均是对转换后的.COM文件进行操作。4.6

调用ROM

BIOS或DOS中断实现数据的输入输出返回ROM

BIOS中断硬件DOS中断ROM

BIOS和DOS中断层次图1.键盘中断调用16H16H中断服务子程序提供了多个功能,每个功能对应一个功能号。调用它们的方法是:①功能号→AH②

INT16H4.6.1

使用ROM

BIOS中断调用主要功能简述如下:功能号功能返回参数0等待从键盘读字符AL=字符的ASCII值,AH=扫描码1读键盘缓冲区字符若ZF=1,表示缓冲区空;否则表示缓冲区不空,则AL=ASCII值,AH=扫描码2返回键盘状态字节AL=键盘状态字节说明:对于2号功能,AL中返回的键盘状态字节各位含义如下:位7

6

5

4

3

2

1

01=按下右Shift键1=按下左Shift键1=按下Ctrl键1=按下Alt键1=Scroll

Lock状态改变1=Num

Lock状态改变

1=Caps

Lock状态改变1=Insert状态改变例1.从键盘接收一个字符,并送入CHAR变量。CHAR

DB

?MOV

AH,0INT

16H;等待从键盘接收一个字符MOV

CHAR,AL;接收到的字符保存也可以用1号功能完成上述功能,如下所示:CHARDB?LOP:MOVAH,1INT16H

;读键盘缓冲区JZLOP;若缓冲区无字符可取则循环等待MOV

CHAR,AL;接收到的字符保存例2.设启动时初始化键盘为改写状态。编写能够实现以下要求的程序段:若按了

Insert键,则转入插入处理,否则继续处于改写状态。MOVINTTESTJNZAH,216HAL,80HINSERT......INSERT:;插入处理2.显示器中断调用10H计算机的显示器有单色和彩色之分,它们可以工作于文本方式和图形方式。本节只介绍与文本方式有关的部分功能。显示器在文本方式下可以工作于40×25、80×25等显示方式。字符的属性确定了每个要显示字符的特性,例如字符是否闪烁、彩色字符的颜色等。下图是彩色文本显示的属性字节。背景色前景色闪烁彩色文本属性字节返回7

6

5

4

3

2

1

0BLRGBIRGB下表给出了16种字符颜色的组合,它也适用于图形方式。当前景和背景选择相同颜色组合时,字符便无法看见。返回颜色IRGB颜色IRGB黑0000灰1000蓝0001浅蓝1001绿0010浅绿1010青0011浅青1011红0100浅红1100品红0101浅品红1101棕0110黄1110白0111亮白1111彩色文本显示方式的属性字节⑴设置显示模式功能号:0调用参数:AL=显示模式。返回模式类型列×行分辨率颜色数0文本40×252(黑白)1文本40×25162文本80×2523文本80×25164图形320×20045图形320×20026图形640×20027文本80×2540DH图形320×200160EH图形640×200160FH图形640×350410H图形640×3501611H图形640×480212H图形640×4801613H图形320×200256常用显示模式例1.设置显示器为80×25彩色文本模式。MOVMOVINTAH,0AL,310H⑵初始化窗口或窗口内容向上卷动功能号:6调用参数:AL=上卷行数BH=空白区属性

CH=窗口左上角行号

CL=窗口左上角列号

DH=窗口右下角行号

DL=窗口右下角列号例2.清屏,并设置为蓝底白字属性。MOVAH,6MOVAL,0MOVBH,1FH

;蓝底白字属性MOVCX,0MOVDH,24MOVDL,4FHINT10H例3.开一个窗口,并设置属性为白色背景黑色前景。MOVAH,6MOVAL,0MOVBH,70H;白色背景黑色前景MOVCH,10;左上角行号MOVCL,20;左上角列号MOVDH,20;右下角行号MOVDL,60;右下角列号INT10H⑶设置光标位置功能号:2调用参数:BH=页号,DH=光标行号DL=光标列号例4.设置光标在10行20列。MOVAH,2;设置光标MOVBH,0MOVDH,10MOVDL,20INT10H⑷读光标位置功能号:3调用参数:BH=页号返回参数:CH=光标开始行,CL=光标结束行,DH=光标所在行号,DL=光标所在列号例5.取光标当前位置MOVMOVINTAH

,3BH

,010H⑸在当前光标位置显示属性和字符功能号:9调用参数:AL=字符的ASCII码,BL=字符的属性,BH=页号,CX=字符重复个数例6.在当前光标位置显示一个黑底黄*。MOVAH,9MOVAL,'*'MOVBH,0MOVBL,0EHMOVCX,1INT10H⑹以TTY(电传打字机)方式显示字符功能号:0EH调用参数:AL=字符的ASCII码BH=页号例7.当出现错误需要发声警告时,可以输出响铃字符。MOVMOVINTAH

,0EHAL,7;响铃字符的ASCII值10H⑺显示字符串及属性功能号:13H说明:此功能对8086/8088无效。调用参数:ES:BP=串首地址,CX=串长度,BH=页号,BL=属性(AL=2或3有效),DH=起始行号,DL=起始列号,AL=写字符方式AL=0:显示字符串,且光标返回起始位置。AL=1:显示字符串,光标跟随移动

AL=2:显示字符串和属性,且光标返回起始位置。AL=3:显示字符串和属性,光标跟随移动。当AL=2或3时,串的组成是:字符,属性,字符,属性……返回例8.键盘及显示器中断调用综合举例。程序4.6是10H和16H中断调用的应用实例。它可以实现清屏、开窗口、设置光标、窗口内容上卷、显示字符和属性、显示字符串等功能。为运行时方便观察,例如能够看到字符显示、窗口上卷及光标移动等情况,程序中用两个INT16H功能,以便停下来观察,并等待击键后继续执行。程序4.6WWidth=40WLeftTopLine=10WLeftTopRow=20WRightBottomLine=20;窗口宽度;左上角行号;左上角列号;右下角行号WRightBottomRow=WLeftTopRow+WWidth-1;右下角列号Collor=70HCR=0DHLF=0AHSTACKSG;白色背景黑色前景;回车;换行

SEGMENT

STACK

'S'DW

64

DUP('ST')ENDSSTACKSGDATASTRINGSEGMENTDB

'example

to

call

interrupt

10H';要显示的字符串CTDATACODEEQU$-STRINGENDS

SEGMENT;串长ASSUME

CS:CODE,DS:DATA,ES:DATA,

SS:STACKSGMAINPROCMOVMOVMOVFARAX,DATADS,AXES,AX;ES、DS指向同一个段MOVMOVAH,0AL,3;置为80×25彩色文本方式INT10HMOVAH,6;清屏MOVAL,0MOVBH,1FHMOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论