




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序
设计——第三章第三章汇编语言程序格式要求1掌握并能使用汇编语言的常用伪操作符及伪指令语句2掌握汇编语言源程序格式计算机实现步骤3学会编写简单的汇编语言程序3.1汇编程序功能计算机上运行汇编语言程序的步骤是:(1)用编辑程序建立ASM源文件(2)用MASM程序把ASM文件转换成OBJ文件(3)用LINK程序把OBJ文件转换成EXE文件(4)用DOS命令键入文件名运行该程序编辑程序P.ASM汇编程序P.OBJ连接程序P.EXE汇编语言程序的建立及汇编过程汇编程序的主要功能(1)检查源程序(2)检查源程序中的语法错,并给出错误信息(3)产生源程序的目标程序,并给出列表文件(4)展开宏指令汇编语言程序的语句除指令以外,还可以由伪指令和宏指令组成汇编语言源程序的框架DATAS
SEGMENT
;定义数据段FIVEDB5;定义字节单元DATAS
ENDS
;数据段定义结束STACKS
SEGMENT
;定义堆栈段
DB128DUP(?);128个字节的栈空间STACKS
ENDS
;堆栈段定义结束CODES
SEGMENT
;定义代码段
ASSUMECS:CODES,DS:DATAS,SS:STACKS
;对各段进行说明下面是一个典型的.EXE程序的源程序框架ASSUME伪指令只是指明了段寄存器与段之间的关系,但并没有对段寄存器初始化START:;程序开始
MOVAX,DATAS
MOVDS,AX;对段寄存器DS初始化
MOVAL,FIVE;(AL)=5
ADDAL,3;(AL)=8
ADDAL,30H;(AL)=38H
MOVDL,AL;(DL)=38H
MOVAH,2
INT21H;调用int21H的2号-打印功能
MOVAH,4CH
INT21H;调用int21H的4CH号-退回DOSCODES
ENDS;代码段定义结束
END
START;程序结束编写的源程序要经过汇编程序转换成目标文件,这时源程序要告知编译器数据区的定义、指令系统的选择、段的定义、程序的开始和结束等信息这类工作由伪指令完成。1、什么是伪指令?2、伪指令和指令语句有什么区别?伪指令语句是一种汇编程序在汇编时用来控制汇编过程以及向汇编程序提供汇编相关信息的指示性语句。与指令语句的区别指令语句:汇编程序对源程序进行汇编时,将指令语句翻译成机器指令,指令语句与机器指令一一对应,机器指令在程序执行期间执行.伪操作:汇编程序对源程序进行汇编时,由汇编程序执行伪指令语句其本身并不直接产生可供计算机硬件执行的机器目标代码,它仅是一种非执行语句。典型的.EXE程序的源程序框架总结一个完整的源程序由几个段构成。XXXXSEGMENTXXXXENDS各段具有各自不同的功能。数据段中存放着数据、代码段中存放着程序、堆栈段为保存数据提供了空间。每个段由数目不等的语句行组成。每行语句都是各种符号的组合,符号之间由空格分隔开。3.2伪操作段定义伪指令变量定义伪指令符号定义伪指令调整偏移量伪指令伪操作(又称伪指令)的作用是指导汇编程序如何汇编源程序。3.2.1段定义伪指令段名合法标识符,首尾段名要一致;区别于变量和标号;段体数据段中主要为数据定义伪指令;代码段中主要为汇编指令。段名SEGMENT[对齐类型][组合类型][类别]
…… ;段体段名ENDS格式段说明伪指令ASSUME功能:
指明段和段寄存器的对应关系。例如:ASSUMECS:CODE1,DS:DATA1,ES:DATA2取消段指定:
ASSUME段寄存器名:NOTHINGASSUME
段寄存器名:段名[,段寄存器名:段名,…]格式关于堆栈段若源程序中不定义堆栈段,系统会自动指定一个64KB的区域作为堆栈段,但连接时会产生一个警告信息:
warningxxxx:nostacksegment
此警告信息不影响程序正常运行。STACK1SEGMENTSTACK
DW256DUP(?)
STACK1ENDS堆栈段的定义3.2.2简单的变量定义伪指令[变量名]助记符操作数[;注释]指令格式合法的标识符即每个操作数在内存中存放所占的字节数DB(字节)、DW(字)、DD(双字)DF(三字)、DQ(四字)、DT(十字节)可以是常量数据,也可以是表达式,或是字符、字符串;可以为变量只分配存储空间,而不赋具体的数值;可以使用复制说明符定义一段连续的存储空间;变量定义伪指令举例1——常数和表达式例1.变量定义伪指令的操作数可是常数,也可是表达式,但在内存中保存的均为二进制补码形式的常数。
A1DB10A2DW100,100H,-1A3DD4*8
内存分配情况如右:…………A1A2A310100100H-14*8=32=20H0A64000001FFFF20000000内存变量定义伪指令举例2
——字符、字符串例2.操作数是字符或字符串时,以ASCII码的形式存放。
STR1DB‘A’,’B’
STR2DW‘AB’ STR3DD‘BA’
STR4DB‘ABCD’…………STR1STR2STR3STR4**一般,在定义字符串时,经常使用DB来定义,以使字符按存放顺序。414242414142414243440000在对文档进行编辑之前,需新建文档。超过两个字符的字符串只能用DB伪指令定义。内存变量定义伪指令举例3
——只分配存储空间例3.若在汇编期间只需要为变量分配存储空间,而不赋初值,则可以使用“?”作为操作数。
BUF1DB5,6,?
BUF2DW100H,?
…………BUF1BUF20506--0001----例4.操作数中可以使用DUP复制说明符,定义重复数据,分配连续的存储空间。内存变量定义伪指令举例4
——分配连续的存储空间0000…00DATA1100个020202070202020702020207DATA2重复次数nDUP(重复数据表)该说明符可嵌套使用DUP复制说明符DATA1DB100DUP(0)DATA2DB3DUP(3DUP(2),7)内存变量定义伪指令练习请写出下列变量定义伪指令的内存分配情况。
DATA1DB01H,’A’,’123’,’BCD’ DB 1,2DUP(2,3) DATA2DW0AB1CH,?,0 DW20,14H,-1 DATA3DD234H,?…01413132334243440102030203…DATA1…1CAB----000014001400FFFF…DATA2…34020000--------…DATA3标识符标识符的类型变量:指向存放某个操作数的存储单元;标号:指向存放某个指令存储单元;子程序名:指向存放子程序的起始存储单元;构成标识符的符号集合英文字母(a~z,不区分大小写)数字(0~9)特殊符号(?、@、_、$)在程序中定义,可作为符号地址使用标识符的构成规则不可以以数字开头;不能使用单独的“?”作为标识符;取名尽量有含义,但不能采用汇编语言的保留字;最大长度为31个字符。例如: ABCDH 标识符
0ABCDH 立即数助记符、定义符、寄存器名称等3.2.3符号定义伪指令1等值伪指令EQU2等号伪指令=3符号名定义伪指令LABEL符号定义伪指令——等值伪指令EQU<标识符> EQU <表达式>等值伪指令EQU用左边的标识符来代替右边的表达式功能DATAEQU2;定义一个常数NUMEQUDATA+2;定义一个数值表达式PLUSEQUADD;定义一个可执行命令举例该语句仅为标识符来赋值,并不会分配存储空间,汇编程序会将源程序中的标识符替换成对应的数值;EQU语句在同一程序中,对一个符号名只能定义一次。类似于C语言里面的预处理命令:#definepi3.14等值伪指令举例DATASGSEGMENTPORT1EQU100PLUSEQUADDNUMEQUPORT1+20NEWEEQUNUMCOUNTEQUCXDATASGSEGMENTMOVAX,PORT1PLUSAX,NUMMOVAX,NEWEMOVCOUNT,AXMOVAX,AX,MOVAX,MOV,AXPORT1PLUSNEWECOUNT100ADD120NUM120CX符号定义伪指令——等号伪指令=<标识符> = <常数表达式>等号伪指令与EQU语句相似,但在同一程序中可对一个符号名重复定义。功能DATA=2
DATA=DATA+2举例等号伪指令举例DATASGSEGMENTPORT1=100PORT1=PORT1+20NEWE=PORT1DATASGSEGMENTMOVAX,PORT1MOVCX,NEWEMOVAX,MOVCX,PORT1NEWE120120由等值伪指令和等号伪指令定义的符号名,程序中任何位置出现该符号名,汇编程序在翻译时首先用其对应的表达式对代替,然后检查代替后的结果是否有语法错误;被定义的符号名不占据内存空间;符号定义伪指令注意点符号定义伪指令——符号名定义伪指令WDATALABELWORDBDATADB12H,34HLOOP1
LABELFARLOOP2:MOVAX,BX<符号名>LABEL<类型>符号名定义伪指令LABEL定义一个变量或标号,并指定其类型;功能常用于一个变量定义伪指令,或带标号的指令之前,为一个变量或指令指定两个不同类型的名称;用法符号名定义伪指令举例DATASGSEGMENTB_ARRAYLABELBYTEW_ARRAYDW10(DUP(1234H))DATASGSEGMENT执行指令后,AX、DL中的值分别是什么?MOVAX,W_ARRAYMOVDL,B_ARRAY表示将20个字节中的第一个字节的地址赋予两个不同类型的变量:字节类型变量B_ARRAY和字节型变量W_ARRAY执行指令MOVAX,W_ARRAY是将具有10个字数据的数组中的第一个字数据1234赋值给AX。指令MOVDL,B_ARRAY是将具有10个字数据的数组中的第一个字节数据34H赋值给DL.3.2.4调整偏移量伪指令调整数据或代码存放的起始位置。使用目的为使系统的访存操作更为有效。为什么要调整常用的调整偏移量伪指令偶对齐伪指令EVEN调整偏移量伪指令ORG偏移量计数器引用符号$对齐伪指令ALIGN3.2.4调整偏移量伪指令B1DB12HEVENW1DW4567H偶对齐伪指令EVEN100H101H102H103H12HB1
67H45HW1将其后的变量或指令从下一个偶地址单元开始存放。功能例如:如下变量定义伪指令伪指令格式EVEN定位伪指令ORGORG100H
X1DW23H
DB23H
ORG200H
X2DB‘ABC’,0DH,0AH
X3DB?100H101H102H200H201H202H203H204H205H
23HX100H23HX2…41H42H43H0DH0AHX3—将其后的变量或指令从“数值表达式”所指定的位置开始存放。功能ORG<数值表达式>对齐伪指令ALIGNALIGN<number>number必须是2的幂,例如:2、4、8、……功能将其后的变量或指令从下一个能被number整除的地址开始存放ORG100HD1DB12HALIGN4B1DB43H100H101H102H103H104H105H106H107H108H12HD143HB1空出7个单元使得下个地址开始于4的倍数偏移量计数器引用符号$ORG100HD1DB12HW1DW$,$ORG$+3B1DB43H100H101H102H103H104H105H106H107H108H12HD101H01HW103H01H43HB1空出3个单元$[±Imm]其值表示当前偏移量计数器的值±Imm的立即数用于构成地址或数据表达式功能3.3操作符与表达式属性操作符表达式表达式是由运算符、操作符、常量和变量等构成的式子属性操作符是面向变量或标号的3.3.1属性操作符变量和标号是在数据定义和编写程序中设置的标识符;变量:表示数据的地址
B1DB12H标号:表示指令的地址
LOOP1:MOVAX,BX属性操作符是面向变量或标号的;属性操作符的类型返回值型:获取变量或标号的相关属性返回值;强制转换型:强制改变变量或标号的相关属性;段属性操作符SEG例如:
MOVAX,SEGNEXT
MOVBX,SEGDATA若(CS)=1000H,(DS)=2000H,
则以上指令执行后,
(AX)=1000H,(BX)=2000H…………NEXTDATA代码段CS数据段DSSEG<标识符>返回标识符所在段的段地址;功能偏移量属性操作符OFFSET例如:数据段定义如下:
X1 DW 12H,100H
X2 DD 0
X3 DB ?,‘A’若执行指令:MOVAX,OFFSETX1
MOVBX,OFFSETX3
则(AX)=0000H,(BX)=0008H1200000100000000--41……X1X2数据段0000H0001H0002H0003H0004H0005H0006H0007H0008H0009HX3OFFSET<标识符>功能返回该标识符的段内偏移地址;类型属性操作符TYPE类型值变量:每个变量所占的字节数标号:标号的NEAR、FAR类型标识符类型TYPE值字节(DB)1字(DW)2双字(DD)4近标号(NEAR)-1远标号(FAR)-2TYPE<标识符>功能返回变量和标号的类型值类型属性操作符举例例如:数据段定义如下:
X1 DW 12H,100H
X2 DD 0
若执行指令:MOVAX,TYPEX1
MOVBX,TYPEX2
则(AX)=0002H,(BX)=0004H1200000100000000……X1X2数据段0000H0001H0002H0003H0004H0005H0006H0007H长度属性操作符LENGTH该操作符只用于变量,返回值由变量的第一个表达式决定。变量的第一个表达式若用DUP定义,则返回重复次数n;变量的第一个表达式若是常数等数值,则返回1。LENGTH<标识符>功能返回变量所定义的数据个数;该运算符只对用dup定义的数据起作用,其他情况均返回1。长度属性操作符举例例如:数据段定义如下:
X1 DB 12H,10H
X2 DB 3DUP(0)请指出以下指令执行后的结果:
MOVAL,LENGTHX1MOVBL,LENGTHX2(AL)=01(BL)=03容量属性操作符SIZE该操作符只用于变量;SIZE=LENGTH*TYPESIZE<标识符>功能返回变量的所占存储单元的数目;容量属性操作符举例例如:数据段定义如下:
X1 DB 12H,10H
X2 DW 3DUP(0)请指出以下指令执行后的结果:
MOVAL,SIZEX1MOVBL,SIZEX2(AL)=01(BL)=06取数操作符LOW和HIGHMOVAL,LOW1234HMOVBL,HIGH1234H(AL)=34H(BL)=12HLOW/HIGH<常数或表达式>功能取常数或表达式的低/高字节;强制属性操作符PTR常用的类型:BYTE、WORD、DWORD、NEAR、FAR<类型>PTR<标识符>功能将标识符的类型属性强制为指定的类型强制属性操作符举例例如:数据段定义如下:
X1 DW 12H,100H
X2 DD 1234H
X3 DB 10,‘A’请问以下指令是否正确:
MOVAX,X1
MOVAX,X2
MOVAX,X312000001341200000141……X1X2X3字字双字字节字节正确,(AX)=0012HMOVAX,WORDPTRX2MOVAX,WORDPTRX3(AX)=1234H(AX)=4101H存储单元别名操作符THIS该操作符用于变量定义或指令之前,其功能类似于LABEL符号名定义伪指令;例如:BDATAEQUTHISBYTEWDATADW1234HMOVAL,BDATAMOVBX,WDATATHIS<类型>功能指定下一个变量或标号的类型;3.3.2表达式表达式是由运算符、操作符、常量和变量等构成的式子;表达式是要在程序的汇编过程中计算出具体数值的,其各个部分需要在汇编期间完全确定;注意:表达式中不能出现寄存器,因为在汇编期间寄存器中的数值不确定!!表达式又可分为数值表达式和地址表达式。数值表达式表示数据,可作为立即数使用;地址表达式表示地址,一般由符号地址等构成。数值表达式数值表达式可以代替立即数使用;数值表达式的组成部分常量:立即数,可为任何数制;算术运算符:+、-、*、/、MOD关系运算符:EQ、NE、LT、GT、LE、GE逻辑运算符:AND、OR、NOT、XOR、SHL、SHR属性操作符:SEG、OFFSET、TYPE、LOW、HIGH…算术运算符运算符类型+(正号)、-(负号)+(加)、-(减)、*(乘)、/(除)、MOD(取模)算术运算符与常量、括号等构成数值表达式。注意:数值表达式中,变量不能参与算术运算。例如:120+(321-90)mod3 322*5/32=120+231mod3=120+0=120=78H=1610/32=50=32H关系运算符运算符类型EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)关系运算符可与常量、变量、括号等构成数值表达式。关系运算的返回值只能有0(假)和0FFFFH(真)两个。例如:120LT100H 21EQ21H=0FFFFH=0逻辑运算符运算符类型AND(与)、OR(或)、NOT(非)、XOR(异或)SHL(左移)、SHR(右移)逻辑运算符可与常量、括号等构成数值表达式。注意:数值表达式中,变量不能参与逻辑运算。例如:1SHL3 47HAND0FH NOT56H=08H=40H=0A9H属性操作符运算符类型SEG(段地址)、OFFSET(偏移地址)、TYPE(类型值)LENGTH(长度)、SIZE(容量)HIGH(高字节)、LOW(低字节)属性操作符可作用于变量构成数值表达式;例如:HIGH(1234H+100H) LOW1234H=13H=34H运算符的优先顺序LENGTH、SIZE、()SEG、OFFSET、TYPE*、/、MOD、SHL、SHRHIGH、LOW+、-EQ、NE、LT、GT、LE、GENOTANDOR、XOR优先权依次降低地址表达式地址表达式是由标号、变量名、运算符(+、-)构成的,用于表示存储单元的地址;例如:数据段定义如下:
X1 DW 12H,100H
X2 DD 1234H
X3 DB 10,‘A’地址表达式
MOVAX,X1+2
MOVAX,X1+1
MOVAL,BYTEPTRX2-2
MOVAL,X3+1注意:地址表达式的类型与标识符的类型相同。12000001341200000141……X1X2X3(AX)=0100H(AX)=0000H(AL)=00H(AL)=41H3.1判断下列标识符的合法性。code 合法Data 合法A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医生签劳务合同范本
- 化工燃料合同范本
- 单位水电维护合同范本
- 包企业厨房合同范本
- 医疗耗材维修合同范本
- 科学城项目投资与资金筹措方案
- 传感器市场区域分析
- AI在健康管理与疾病预测中的应用
- 南京2025年江苏南京师范大学附属中学雨花台学校招聘编外教师笔试历年参考题库附带答案详解
- 家电租赁合同范本
- 基于Matlab的并行计算课件
- 2021年熔化焊与热切割基础知识课件
- 沥青试验讲解精品课件
- 秒的认识 完整版PPT
- 创新药产业链研究培训框架
- 燃气业务代办授权书模板
- (完整PPT)半导体物理与器件物理课件
- 大音希声话古韵——古琴曲《流水》课件
- 《中国人阅读书目(三)——中国初中生基础阅读书目-导赏手册》新书简介2014.8.14 (1)
- 智利国家英文介绍PPT精选文档
- 金蝶K3 Cloud 产品安装指南
评论
0/150
提交评论