您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 乔第4章 汇编语言程序设计[1]
汇编语言程序结构与语言格式伪指令汇编语言上机过程第4章汇编语言程序设计4.1汇编语言的程序结构与语句格式•4.1.1汇编语言程序的结构•4.1.2汇编语言语句格式4.1.1程序结构STACKSEGMENT┇STACKENDSDATASEGMENT┇DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:…┇CODEENDSENDSTART•(1)汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义,各段顺序任意,段的数目按需要确定,最多4个。•(2)段由若干语句组成,语句以指令和伪指令为主体而构成。一条语句写在一行上。应尽量对齐•(3)汇编语言程序中,代码段至少要有一个启动标号,作为程序开始执行时目标代码的入口地址。启动标号常用START、BEGIN、MAIN等命名。4.1汇编语言的程序结构与语句格式4.1.2语句格式1、指令性语句格式:标号:助记符操作数,操作数;注释经汇编后产生对应的目标代码,CPU执行的操作2、指示性语句格式:名字伪指令操作数,操作数…;注释不产生目标代码,CPU不可执行的语句。编译软件用来对常量和变量的属性及存储器单元分配与其他程序连接等。4.2伪指令4.2.1常数、变量、标号和表达式1.常量:数值常量、字符串常量、符号常量2.变量:伪指令定义数据段(存储器)地址DATASEGMENTDA1DB12H;定义一个字节数据DA2DD0FEDCBA90H;定义一个双字数据DA3DW5678H;定义一个字数据DATAENDS3.标号:控制转移的区间(包括段地址、偏移地址、类型三个属性)4.数值表达式:由常量和运算符组成算术运算符(+-*/)、逻辑运算符(ANDORNOTXOR)数值返回运算符(SEGOFFSETNEARFAR)•例逻辑运算符的应用–MOVAL,NOT10101010B–MOVAL,0F0HAND0BDH;AL=0B0H–MOVAL,50HOR05H;AL=55H例PTR运算符的应用N1DB3,6,9MOVAX,WORDPTRN1;为字类型,(AX)←0603H关系运算符:EQ(相等)NE(不等)LT(小)GT(大)属性运算符:(BYTEPTR,WORDPTR,DWORDPTR)4.2.2伪指令语句•4.2.1符号定义伪指令:EQU、=、LABEL•4.2.2数据定义伪指令:DB、DW、DD•4.2.3段定义伪指令:SEGMENT/ENDS•4.2.4段寄存器定义伪指令:ASSUME•4.2.5过程定义伪指令:PROC/ENDP•4.2.6模块定义伪指令:NAME/END•模块连接伪指令:PUBLICEXTRN•4.2.7宏命令伪指令:MACRO/ENDM•4.2.8偏移地址指定伪指令:ORG4.2.1符号定义伪指令–1.等值语句•例4-10等值语句•CREQU0DH;常量•TENEQU0AH;常量•AAEQUASCII_TABLE;变量•VAREQUTEN*2+1024;数值表达式•ADREQUES:[BP+DI+5];地址表达式•GOTOEQUJMP;指令助记符–2.等号语句•例4-11等号语句•NUM=488;定义NUM等于488•NUM=NUM+1;定义NUM等于4894.2.2数据定义伪指令•DATADB11H,33H•NUMDW50*3+2,01FAH;•SUMDD0FA0H;•STR1DB‘LOVE’;•STR2DW?•STR3DW`BC`•DATA1DB20DUP(?)•DATA2DW?•DATA3DB20DUP(30H)11H`L`33H`O`98H`V`00H`E`FAH---01H---A0H`C`0FH`B`00H00HDB(字节)DW(字)DD(双字)DQ(4个字)DT(10个字)补充题:1、指出以下数据定义伪指令所分配的字节数(8086系统)。(1)DATA1DB10,?,‘A’(2)DATA2DW10DUP(2,3DUP(?),1)(3)DATA3DB‘HELLO,WORLD!’,‘$’(4)DATA4DWDATA4(5)DATA5DQ0,10DUP(?)2、编写一个延时2秒子程序3、在内存2530:0000H为首地址单元存放:12H,34H,56H,78H,9AH,0BCH,0DEH,0F0H的16进制数,请编程由CRT屏幕按顺序循环显示出来。4.2.3段定义伪指令段名SEGMENT定位类型组合类型类别名┇段名ENDS1.段开始和结尾的段名必须一致,否则出现错误2.定位类型:1)BYTE(字节)2)WORD(字)3)PARA(小段)(4)PAGE(页)3.组合类型:1)缺省(2)PUBLIC(代码段)(3)COMMON(数据段)(4)STACK(堆栈段)5)MEMORY(附加段)(6)AT表达式(表达式的值为本段的段首地址)4.类别名:单引号内的任意名字`DATA`4.2.4段寄存器定义伪指令(ASSUME)•例4-15求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。–DATASEGMENTNUMDB95H,83H,36H,2DH,33H,22H,1AH,DB34H,62H,45H,75H,49H–SUMDW?–DATAENDS–STACKSEGMENT–DB100DUP(?)–STACKENDS–CODESEGMENT–ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK–BEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASI,NUMMOVCX,12XORAX,AXNEXT:ADDAL,[SI]ADCAH,0INCSILOOPNEXTMOVSUM,AXHLTCODEENDSENDBEGIN•例4-1编写一个两字相加的程序。(双字节BCD码相加并显示)–DSEGSEGMENT;定义数据段–DATA1DW1234H;定义被加数–DATA2DW5678H;定义加数–DSEGENDS;数据段结束–ESEGSEGMENT;定义附加段–SUMDW2DUP(?);定义存放结果区–ESEGENDS;附加段结束–CSEGSEGMENT;定义代码段–ASSUMECS:CSEG,DS:DSEG,ES:ESEG–START:MOVAX,DSEG;START为程序开始执行的启动标号–MOVDS,AX;初始化DS–MOVAX,ESEG–MOVES,AX;初始化ES–LEASI,SUM;存放结果的偏移地址送SI–MOVAX,DATA1;取被加数–ADDAX,DATA2;两数相加–MOVES:[SI],AX;和送附加段的SUM单元中–HLT–CSEGENDS;代码段结束–ENDSTART;源程序结束4.2.5过程定义伪指令(PROC/ENDP)•格式:过程名PROC[NEAR/FAR]┇[RET]┇RET过程名ENDP例4-16编写一个延时50ms的子程序DELAYPROC;定义一个近过程PUSHBX;保护BX原来的内容PUSHCX;保护CX原来的内容MOVBL,5;外循环次数NEXT:MOVCX,2801;(延时10ms)W10MS:LOOPW10MS;(CX)≠0DECBL;修改外循环值JNZNEXT;(BX)≠0外循环POPCX;恢复CX原来的内容POPBX;恢复BX原来的内容RET;过程返回DELAYENDP;过程结束4.2.6模块定义与连接伪指令解决规模大的程序由多人完成,或1个大的程序分为多个模块编写时如何区分和连接的问题1.模块定义伪指令格式:NAME标识符(可省掉)◦┇◦END启动标号(将标号处的地址给CS,IP赋值,控制程序的执行)2.模块连接伪指令1)全局符号伪指令:PUBLIC符号名1,符号名2(允许其他模块使用本模块定义的变量、标号及过程)2)引用伪指令:EXTRN符号名1:类型,符号名2:类型…(本模块使用的这些是其他模块定义的变量名、标号及过程名)例4-17编程利用乘法模块计算X*Y。NAMEMAINCALL;主模块EXTRNWMUL:FARSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSDATASEGMENTPARA‘DATA’–XDW3355H–YDW8866H–DATAENDS–CODESEGMENTPARA‘CODE’–MAINPROCFAR–ASSUMECS:CODE,DS:DATA,SS:STACK–PUSHDS–MOVAX,0–PUSHAX;返回DOS–MOVAX,DATAMOVDS,AXMOVAX,XMOVBX,YCALLWMUL;调用外部过程RETMAINENDPCODEENDSENDMAIN;主模块结束NAMESUBMUL;子模块CDESGSEGMENTPARA‘CODE’WMULPROCFAR;定义远过程ASSUMECS:CDESGPUBLICWMUL;定义为全局过程名CALLMULAB;嵌套调用RET;过程返回WMULENDP;过程结束MULABPROC;定义一个近过程MULBXRETMULABENDP;过程结束CDESGENDS;代码段结束END;子模块结束4.2.7宏命令伪指令1.宏定义(MACRO/ENDM)4-19宏指令定义两个字节相加,结果存入RESULT单元ADDMMACROOPR1,OPR2,RESULT–MOVAL,OPR1–ADDAL,OPR2–MOVRESULT,AL–ENDM•2.宏调用–┇–ADDM88,36,SUM–┇–ADDMBR,TAB,SUM3.宏展开:┇+MOVAL,88+ADDAL,36+MOVSUM,AL┇+MOVAL,BR+ADDAL,TAB+MOVSUM,AL┇4.宏的取消PURGE宏名表4.2.8其它伪指令1.定位伪指令:ORG表达式◦ORG伪指令用于给内存代码段中的某条指令指定存放的偏移地址2.方式选择伪指令在程序最前面加写◦·286;汇编程序接受8086/8088及286的指令◦·286P;与·286功能相同,还接受286保护方式◦·386,·386P,·486,·486P含义类推,◦·586;汇编程序接受8086/8088、286、386、486及586的指令◦·586P;除与·586功能相同之外,汇编程序还接受586保护方式下的指令4.3程序设计•4.3.1顺序程序设计•4.3.2分支程序设计•4.3.3循环程序设计DATASEGMENTNUMDB12H,34H,56H,78H,9AHDB0BCH,0DEH,0F0HDATAENDSSTAKSEGMENTPARASTACK'STAK'DB100DUP(?)STAKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STAKMAIN:MOVAX,DATAMOVDS,AXMOVCX,08LEASI,NUMLOP:PUSHCXMOVAL,[SI]MOVDL,ALANDDL,0F0HMOVCL,04SHRDL,CL;CMPDL,9JBENEXTADDDL,07HNEXT:ADDDL,30HMOVAH,02HINT21HMOVDL,[SI]ANDDL,0FHCMPDL,9JBENEXT1ADDDL,07HNEXT1:ADDDL,30HMOVAH,02HINT21HPOPCXINCSILOOPLOPMOVAH,4CHINT21HCODEENDSENDMAIN例4-3-1:屏幕显示16进制数•用比较指令和条件转移指令实现两路分支的程序段•…–MOVAX,M;假定M和N为有符号数–MOVBX,N–CMPAX,BX;比较M和N的大小,影响标志位JGNEXT;MN时转移,若M、N为无符号数时–……;分支程序2–JMPDONE–NEXT:;分支程序1–……DONE:RET分支结构程序例题•例4-3-2:已知X是单字节带符号数,编写计算下列表达式的程序。Y=DATASEGMENTXDB?YDB?DATAENDSC
本文标题:乔第4章 汇编语言程序设计[1]
链接地址:https://www.777doc.com/doc-3418298 .html