您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 96第四章 汇编语言程序设计
第四章汇编语言程序设计4.1概述4.2汇编语言的程序结构与语句格式4.3汇编语言的伪指令语句4.4*汇编语言程序设计4.5*模块化程序设计4.6*实用程序设计举例第4章汇编语言程序设计4.1概述机器语言(MechineLanguage):二进制表示的指令和数据。汇编语言(AssenblyLauguage):用助记符来编写指令,地址和数据也可用符号表示。用汇编语言编写的程序必须翻译成机器语言目标程序(或目标代码)才能执行,这种翻译过程称为汇编。(图4-1,P141)高级语言:不针对某个具体的计算机,通用性强。但高级语言编写的源程序同样必须“翻译”成机器语言,计算机才能执行,所用的系统软件称为编译程序或解释程序。第4章汇编语言程序设计4.2汇编语言程序结构与语句汇编语言源程序例子DATASEGMENT;定义数据段DATA1DB0F8H,60H,0ACH,74H,3BH;被加数DATA2DB0C1H,36H,9EH,0D5H,20H;加数DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA;告诉汇编程序段范围START:MOVAX,DATAMOVDS,AX;初始化DSMOVCX,5;循环次数送CXMOVSI,0;置SI初值为零第4章汇编语言程序设计汇编语言源程序的例子CLC;清CF标志LOOPER:MOVAL,DATA2[SI];取一个字节加数ADCDATA1[SI],AL;与被加数相加INCSI;SI加1指向下一字节DECCX;计数器CX减1JNZLOOPER;不等于零,转LOOPERMOVAH,4CH;停止(INT21H)INT21H;返回DOSCODEENDS;代码段结束ENDSTART;源程序结束,指定起始地址标号第4章汇编语言程序设计汇编语言源程序标准格式DATASEGMENT…...DATAENDSSTACKSEGMENTSTACK…...STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:PUSHDS;MOVAX,0;与DOS的接口PUSHAX;称为标准序MOVAX,DATA;MOVDS,AX;重新设置DS……RET;如果不用标准序,此处为MOVAH,4CH;INT21HCODEENDSENDSTART0000h:INT20h程序段前缀(PSP)程序段……堆栈段DS,ES第4章汇编语言程序设计汇编语言语句的组成和类型指令性语句:可以产生相应的机器码LOOPER:MOVAL,DATA[SI]指示性语句(伪操作指令):不产生机器码。DATA1DB0F8H,60H,0ACH,74H宏指令:以宏名字定义的一段指令序列语句的格式:[名字]操作码/伪操作[操作数];[注释]第4章汇编语言程序设计名字:变量和标号变量名/段名/过程名:伪指令语句中的名字。内存单元的名字,由DB/DW/DD定义。BUFDB?•变量的三种属性:段值SEG偏移量OFFSET类型BYTE/WORD/DWORD标号:指令语句中的名字。指令存放单元的符号地址。LOOPER:MOVAL,DATA[SI]•标号的三种属性:段值SEG偏移量OFFSET类型NEAR/FAR注:对于汇编程序来说,变量和标号都是存储单元的符号地址。只是标号对应的存储单元中存放的是指令,而变量所对应的存储单元存放的是数据。第4章汇编语言程序设计助记符和伪操作指令助记符:MOV,ADD,….指示性(伪指令)操作符:DB,DW,SEGMENT,ENDS,ASSUME,END,….保留字:SEGMENTENDSOFFSETSIZEDBDWDDMOVPUSHADDSUBMULDIVINCDECLOOPPROCENDPCALLRETEND第4章汇编语言程序设计操作数常数/寄存器/存储器操作数(标号/变量)/表达式表达式:数值表达式(只有大小)和地址表达式(有段属性、偏移量属性和类型属性)•算术运算符•逻辑运算符•关系运算符•分析运算符•合成运算符•其它运算符(表4-1P146)第4章汇编语言程序设计运算符之一:算术运算符•+、-、*、/、MOD、SHL、SHR都可应用于数字运算。•+、-可以用于表示存储器操作数的地址,或两个存储器单元(同一段内)的地址偏移量之差。例:SUM-2CYCLE-GO第4章汇编语言程序设计运算符之二:逻辑运算符•AND、OR、XOR、NOT按位的逻辑运算例:INAL,PORT_VALOUTPORT_VALAND0FEH,ALANDDX,PORT_VALAND0FEH第4章汇编语言程序设计运算符之三:关系运算符•EQ、NE、LT、GT、LE、GE用于数字或存储器操作数运算,结果为数字(0或0FFFFH)。例:MOVBX,PORTLT5MOVBX,((PORT_VALLT5)AND20)OR((PORT_VALGT5)AND30)第4章汇编语言程序设计运算符之四:分析运算符•SEG变量/标号(返回段基址)•OFFSET变量/标号(返回偏移量)•TYPE变量/标号(返回元素字节数)变量返回类型:1字节、2字、4双字标号返回类型:-1NEAR、-2FAR•LENGTH变量(返回变量单元数)•SIZE变量(返回变量总字节数)第4章汇编语言程序设计运算符之四:分析运算符DATA_TABLESSEGMENTBUFFER1DB100DUP(?)BUFFER2DW200DUP(?)BUFFER3DD100DUP(?)DATA_TABLESENDS-----------------------------------------------------------------------------------MOVAX,SEGBUFFER1(或BUFFER2,BUFFER3)MOVDS,AX-----------------------------------------------------------------------------------MOVBX,OFFSETBUFFER1MOVSI,OFFSETBUFFER2MOVDI,OFFSETBUFFER3MOV[BX],ALMOV[SI],CXMOVWORDPTR[DI],DXLENGTHBUFFER1=100LENGTHBUFFER2=200LENGTHBUFFER3=100SIZEBUFFER1=100SIZEBUFFER2=400SIZEBUFFER3=400第4章汇编语言程序设计运算符之五:合成运算符•PTR(修改类型属性)类型PTR表达式STUFFDD?MOVBX,WORDPTRSTUFF•THIS(指定类型属性)THIS类型ABCEQUTHISBYTEEFGDW100DUP(?);可以将100字的EFG按200字节的ABC来使用•SHORT(短转移说明)JMPSHORT短标号•HIGH和LOW:(高低字节分离)HIGH1234H=12HLOW1234H=34H•段超越运算符“:”ES:[BX]第4章汇编语言程序设计运算符之六:其它运算符•圆括号()(改变运算符优先级)•方括号[](下标或间接寻址)•各种运算符运算的顺序(表4.2)•优先级高的先运算•优先级相同的按从左到右运算•圆括号提高优先级第4章汇编语言程序设计4.3汇编语言的伪指令语句符号定义伪指令数据定义伪指令段定义伪指令过程和宏定义伪指令模块定义与通信*条件汇编伪指令*列表伪指令第4章汇编语言程序设计伪指令之一:符号定义伪指令EQU:将表达式的值赋予一个名字,不能重复定义•CREQU0DH;常量•AAEQUASCII_TABLE;变量•VAREQUTEN*2+1024;数值表达式•ADREQUES:[BP+DI+5];地址表达式•GOTOEQUJMP;指令助记符=:与EQU基本相同,可以对一个名字重复定义•NUM=488;定义NUM等于488•NUM=NUM+1;定义NUM等于489第4章汇编语言程序设计伪指令之二:数据定义伪指令格式:[变量名]伪操作操作数[,操作数]DB/DW/DD/DQ/DT:定义变量、分配存储单元等。操作数可以是:数值表达式或表、字符串、?、NDUP表达式1、为数据项分配存储单元NUMDW100*5+88SUMDQ0011223344556677第4章汇编语言程序设计伪操作命令之二:数据定义伪指令2、预留存储单元但不赋值STRDB?SUMDW?3、定义数组ADB?,?,?BUFFERDB10DUP(?)ABDDDW10DUP(0)4、定义字符串STR1DB‘COMPUTER’STR2DW‘AA’,‘BC’,‘DE’5、定义标号或变量的偏移地址或全地址XXDWCYCLEYYDDCYCLE数据定义语句定义了变量的类型,可以使汇编程序对访问的存储器指令产生正确代码例:SUMDW0INCSUM第4章汇编语言程序设计伪操作命令之二:数据定义伪指令分析操作符–SEG、OFFSET–TYPE、LENGTH、SIZE合成操作符–PTR–LABEL(定义一个指定类型的标号或变量)WBYTELABELWORDARRAYDB1,2,3,4MOVAL,ARRAY;01H-ALMOVAX,WBTYE;0201H-AX–THIS(与EQU配合使用具有LABEL同样的作用)BWORDEQUTHISBYTEARRAYDW100DUP(?)第4章汇编语言程序设计伪操作命令之三:段定义伪指令段定义伪指令SEGMENT/ENDS段名SEGMENT[定位类型][组合类型][‘类别’]……….段名ENDS–段名:一个段开始和结尾的段名必须一致,否则会出现语法错误–定位类型:BYTE、WORD(偶地址开始)、PARA(XXXX0H)、PAGE(XXX00H)–组合类型:NONE、PUBLIC(同名段组合成一个段)、COMMON(同名段重叠覆盖)、STACK、MEMORY(放在所有段最后)、AT表达式(指定起始地址)–类别名CODE、DATA、STACK(同名同类别段连续存放)第4章汇编语言程序设计伪操作命令之三:段定义伪指令段寄存器说明伪指令ASSUMEASSUME段寄存器名:段名[段寄存器名:段名[…..]]例:CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKMAIN:……CODEENDSENDSMAIN;指定第一条要执行的指令标号注:1、该伪指令用于明确用SEGMENT定义的段的类型,使编译程序能生成目标代码程序。2、在源程序中,该伪操作放在可执行程序的前面。3、该指令没有给段寄存器赋予实际的初值。这项工作要通过写指令来完成,其中代码段不需要赋值。第4章汇编语言程序设计伪操作命令之三:段定义伪指令组定义伪指令GROUP组名GROUP段名[,段名……]组内各段都装入一个64K的物理段中(P155)指定地址伪指令ORGORG表达式ORG$+表达式例:ORG10H;在10H处开始存放20H,30HXDB20H,30HORG$+5;在数据段17H处存放40H,50HYDB40H,50H第4章汇编语言程序设计伪操作命令之四:过程和宏定义伪指令PROC过程名PROC[NEAR/FAR]…………….RET……………过程名ENDP注:1、程序块被定义后,可用CALL过程名的形式进行调用。2、过程名和标号一样,有三种属性:段、偏移量和类型。类型为NEAR和FAR,缺省为NEAR。3、过程的定义和调用可以嵌套,嵌套深度只受堆栈大小限制。第4章汇编语言程序设计伪操作命令之四:过程和宏定义伪指令MACRO宏指令名MACRO[形参,形参……]…ENDM调用格式:宏指令名[实参,实参……]宏展开(例P158)宏的取消:PURGE宏定义名[,……]第4章汇编语言程序设计伪操作命令之五:模块定义与通信伪指令模块定义伪指令–格式:NAME标识符–┇–END启动标号模块通信伪指令(1)全局符号伪指令格式:PUBLIC符号名1,符号名2,…(2)引用伪指令格式:EX
本文标题:96第四章 汇编语言程序设计
链接地址:https://www.777doc.com/doc-3402605 .html