微机原理讲义(5)编程_第1页
微机原理讲义(5)编程_第2页
微机原理讲义(5)编程_第3页
微机原理讲义(5)编程_第4页
微机原理讲义(5)编程_第5页
已阅读5页,还剩38页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、PAGE 第五章 汇编语言程序设计汇编语言是一种符号语言,用助记符表示指令的操作码,地址和数据也可用符号表示。比机器语言易于编写、阅读修改。但须经“翻译”成机器语言(或称目标代码)才能执行。汇编程序有小汇编(ASM)和宏汇编(MASM)。汇编语言源程序经过汇编(.obj)和连接得到可执行文件(.exe)。5.1汇编语言程序格式举一个简单的例子:已知X19,Y=43,Z=11,求X+Y-ZDATA SEGMENTXDW19YDW43ZDW11RESULTDW?DATAENDSSTACK SEGMENTSTTTDB100DUP(?)STACK ENDSCODESEGMENTASSUME CS:CO

2、DE, SS:STACK, DS:DATASTART: MOV AX,XADD AX,YSUB AX,ZMOV RESULT,AXCODEENDSEND START注意这只是一个概念性的程序,不能运行。许多辅助性的语句尚未加入,如段寄存器赋值等。5.1.1 汇编语言源程序的格式程序是分段结构,至少要有一个代码段。NAME1 SEGMENT语句1语句nNAME1 ENDSNAME2 SEGMENT语句1语句mNAME2 ENDSNAMEk SEGMENT语句1语句jNAMEk ENDSEND5.1.2源程序语句的种类三种基本语句:指令语句:汇编后要产生机器码的可执行语句。伪指令语句:提供汇编信息

3、汇编时处理,汇编后不产生指令代码。如指定程序或数据存放的起始地址数据段定义宏指令语句:把多次重复使用的程序段用宏伪操作命令定义为一个名字,可以当作指令一样使用宏指令。5.2 语句行的构成5.2.1几个基本规定语句使用的字符集英文字母:大写A-Z和小写a-z;数字字符:0-9;算术运算符: * 关系运算符:;分隔符:, ( ) U(空格)、TAB(制表符)控制符:CR(回车)、LF(换行)、FF(换页);其他字符:$ & _ ? . % !保留字所有的指令操作码助记符:ADD、JCXZ、NOP、TEST、ROL等伪指令:ASSUME ENDP ORG DB LABAL PROC PUBLIC E

4、QU等寄存器名:AX AH DI SI SS 等其他保留字:ABS FAR LE LENGTH NEAR PARA SHORT THIS等标识符(又称名字)程序员自行建立的自定义符号,用作标号、变量名、常量名、段名、过程名等。标识符以字母开头,最多31个字符有效;可出现$ _ . ?等,有.时必须是第一个字符,?不单独用不得包含空格,保留字不能用。正确:START,ABC,NOT_FIND,LOOP2,C_SEG,X,Y,2等错误:3FD6,Y+C,ADC,EQU,AH,等5.2.2源程序语句的格式指令性语句格式:标号:助记符号参数,参数;注释伪指令语句格式:名字助记符 参数 ,参数;注释标号

5、标号是为语句起的名字;标号以冒号结束;标号不一定每行都有,需要引用的才加标号;标号中若有数字,大小不代表执行顺序;同一程序中的两个标号不得相同;标号代表本语句的符号地址,汇编时赋予实际值(存储地址)标号有三种属性:段属性(SEGMENT):标号所在的段,SEG运算符求之CS偏移量(OFFSET):所在语句与段首的偏移量类型属性(TYPE):又叫距离属性,NEAR段内引用、FAR段间伪指令语句定义的名字伪指令中的名字:段名、过程名、常量变量名 属于标识符常量名:用符号形式表示的常数。有数字、字符变量名:一个或一些存储单元的符号地址,其内容为变量的值。变量名下的一组数据数组。变量名也有三种属性:段

6、、偏移量、类型(字节 字 双字等)伪指令定义的名字后面没有冒号。和机器语言相比,是用汇编语言来编写程序的突出优点是可以使用符号助记符。汇编语言的指令和机器语言的指令之间有一一对应的关系,汇编成的目标代码程序容量为源程序的几倍,汇编语言和机器密切相关。汇编语言可使程序员直接控制目标代码,可对输入输出端口进行控制。实时性好,用于系统程序、实时通信程序、实时控制程序等,还可被各种高级语言嵌用。举例:一个规范程序DATASEGMENT;数据段开始DA1DB2AH,6,33;DBPROGRAM ASMDB 40 DUP(?)BUFDMADB 80H DUP(?)DATAENDSSTACK SEGMENT

7、;堆栈段开始ME1DB 80H DUP(?)STACK ENDSCODESEGMENT;代码段开始ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATAORG200HSTART:MOVAX,DATA ;MOVDS,AXMOVDX,OFFSET DA1;删除同名文件MOVAH,13H;INT21HMOVDX,OFFSET BUFDMA;设置磁盘缓冲区MOVAH,1AH;INT21HMOVAX,OFFSET DA1+12;当前块号为0MOVBX,AXMOVBX,0MOVSI,2000H ;设文件已在2000H开始的缓冲区MOVE:MOVDI,OFFSET BUFDMA;传递

8、一个数据块MOVCX,80HCLDPUSHCS;是CS和ES指向同一个段POPESREPMOVSB;执行数据传送MOVCX,80H;检索是否遇到结束符MOVAL,1AH;Z的ASC码MOVDI,OFFSET BUFDMAPUSHCSPOPESREPNZSCASB;检索ZJZ CLOSE PUSH SI;保留数据区地址MOVDX,OFFSET DA1 ;写一个记录MOVAH,15H;INT21 POPSI恢复数据地址JMPMOVECLOSE:MOVDX,OFFSET,DA1;写最后一个记录MOVAH,15H;INT21HMOVDX,OFFSET DA1;关闭文件MOVAH,10HINT21HCO

9、DEENDSEND3. 界符一个程序或一条指令中两个部分之间的间隔,见表3.8表3.8 ASM86可用的界符;*,:+()*?./ 4. 常数指令中出现的固定值,如立即数、立即直接寻址时所用地址等。二进制表示:01011101B十进制表示:1996D或1996八进制表示:1267Q16进制表示:0F01AH浮点数表示:2.05E5字符串表示:STUDENTS相当于给出了ASC码ASM86 规定常数不能以字母开头,16进制数以AF开头时添加05. 注释汇编时不作处理汇编源程序为便于理解常加注释,用;隔开,续航也应用;开头6.表达式操作数一个操作数在内容上可能代表一个数据,也可能代表一个存储单元的

10、地址,最简单的数据是常数,如100H,也常用标号表示数据 PORT存储器地址也常用标记符(标号)表示,实际包含段值和偏移量。运算符操作数和运算符构成表达式,有5类运算符。算术运算符(arithmetic operators)。逻辑运算符(logical operators)。关系运算符(relational operators)。分析运算符(analytic operators)。综合运算符(synthetic operators)算术运算符加减乘除*和MOD求两数相除余数的如20 MOD 3结果为2常用的地址运算操作是标号一个数,地址相乘等无意义START+2 DA14逻辑运算符包括与.或.

11、非.异或AND.OR.NOT.XOR如:0FH OR 0F0H 0FFH 01H XOR 81H 80H注意:逻辑运算符只能对常数进行运算,结果也是常数。AND.OR.NOT.XOR既是助记符又是运算符,助记符在程序执行时执行逻辑运算符在汇编时执行运算,不会混淆。例如:AND DX,PORT1 AND 0FEH 表示将DX中的内容和逻辑与的结果相与,结果在DX中关系运算符相等EQ(equal)不等NE(no equal)小于LT(less than)大于GT(greater than)小于等于LE(less than or equal)大于等于GE(greater than or equal)

12、如 PORT LE 5 中,含有关系运算符要指出的是参与关系运算的两个操作数必须是数据,或是同一段中的存储单元地址,关系成立,结果为FFFFH,否则0MOV AX,2 GE 3;因为2 GE 3不成立,结果为0,相当于MOV AX,0关系运算符不能单独使用,与逻辑运算符组合使用,比如:MOV BX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)当PORT小于5时,则汇编后上面语句相当于MOV BX,20否则相当于MOV BX,30分析运算符和综合运算符分析运算符把存储单元地址分解为段地址和偏移量以及求取性质OFFSET、 SEG 、TYPE、 SIZE、 LENG

13、TH综合运算符规定存储单元的性质PTR(BYTE/WORD) 、THISOFFSET 用来取地址的偏移量,如:MOV DX,OFFSET DA1此语句将DA1处的地址的偏移量取到DX中SEG运算符用来取存储单元地址的段值,如:MOV AX,SEG ABCMOV DS,AX这两个语句使得DS中存放对应于ABC的段地址TYPE用来取存储单元的类型如KKK存储区是用伪指令:KKK DB 20 DUP(?)来定义的,那么TYPE KKK 等于1LENGTH用来计算一个存储区中的元素(字节 字 双字)数目。SIZE用来计算一个存储区的字节总数。伪指令定义如下:DA1 DD 20 DUP(?) 则TYPE

14、 DA1等于4LENTH DA1等于20SIZE DA1等于80综合运算符有PTR、THISPTR用来对存储单元规定类型,常与伪指令BYTE、WORD联用MOV WORD PTRDI,01将使DI单元为01,DI+1单元为00PTR也用来更改已经规定了类型的存储单元的类型,如原先定义:HHH DB 20 DUP(?)即HHH作为20个字节的存储区可更改为:PP EQU BYTE PTR HHHQQ EQU WORD PTR HHH2KK EQU DWORD PTR HHH8前2字节仍为字节单元,中6字节3个字,后12字节放3个双字THIS和PTR类似,也可改变存储区类型比如,希望存储区XYZ既

15、可作为字类型,有可作为字节类型,可在XYZ的类型语句:XYZ DW ?之前,加上两个含运算符THIS的语句,变成:XYZ_2 EQU THIS BYTEXYZ_1 EQU THIS BYTEXYZ DW ?因为XYZ_1、XYZ_2和XYZ具有相同的段地址和偏移量,所以后面的程序段中,如用标号XYZ,则存储单元为字类型,否则字节类型。因此上面3句相当于:XYZ DW ?XYZ_1 EQU BYTE PTR XYZXYZ_2 EQU BYTE PTR XYZ+15.2.3伪指令ASM-86约有20条伪指令,常用的有:。标号赋值伪指令EQU。定义存储单元伪指令DB、DW、DD。定义存储单元类型伪指

16、令BYTE、WORD、DWORD。段定义伪指令SEGMENT、ENDS、ASSUME、ORG。过程定义伪指令PROC、ENDP、NEAR、FAR。程序结束伪指令END标号赋值伪指令EQU用标号代表数值时,必须在源程序前面赋值,EQU可使标号等于表达式(或任何字符组),也可使新标号等于旧标号标号 EQU 表达式 或新标号 EQU 旧标号 旧标号是已经赋过值的标号ABC EQU 220XYZ EQU ABCCOUNT EQU CXARR EQU BYTE PTR SIPURGE和EQU相反,用来解除标号的赋值,如 PURGE ABC2.等号伪指令:A=5MOV AX,A ; 5AXA=34H ;

17、。置汇编地址计数器伪指令DATA SEGMENTBUF DB 01234CDEFCOUNT EQU $-BUFDATA ENDS汇编地址计数器的值也可用ORG设置DATA SEGMENTORG 10BUF DB ABCDORG $+5NUM DW 50DATA ENDS3.定义符号名伪指令语句格式:变量名或标号 LABEL 类型功能相当于:变量名或标号 EQU THIS 类型WBUF LABEL WORD ;定义了一个字类型变量,地址BUFBUF DB 100 DUP(?)标号也是如此:OUT2 LABEL FAR ;定义了一个远标号,(EXIT是近标号)EXIT: LEA DX,BUF;EX

18、IT与OUT段,偏移量相同(一句双号)定义存储单元的伪指令DB、DW、DD、DQ、DT分别用来定义程序中需要的字节、字、双字、4字、10字节存储空间。如:CR DB 0DHLF DB 0AH;BUF DB ? ;BUF单元无初值,可存放中间结DO-2 DB 9 DUP(?) ;DO-2等9个字节单元留下备用DONT DW 10 DUP(?);留下10个字空间备用ST DB How are youTABLE DB 00,01,03,02,06,04,05,07 DB 0FH,0EH,0CH,0DH,09 ,0BH,0AH,08EXPR DB 2*3+4AB DB AB ;存入41H,42HBA

19、DW AB ;存入42H,41HABDD DD AB ;存入42H,41H,00,00OFFAB DW AB ; 存入AB的偏移地址ADDAB DD AB;存入AB的偏移地址,再存段地址NUM DQ 0011223344556677H;存入77H,66H,55H,44H33H,22H,11H,00HCONT DT 1234567890H;存入90H,78H,56H,34H,12H,00DB与EQU的区别,第一句使CR单元中的值为0DHCR EQU 0DH 表示CR这个标号的值为0DH使用定义存储单元的伪指令时,初值也可用表达式来表示,如PORT已赋过值 PORT EQU 50H 则可有: IN

20、-PORT DB PORT OUT-PORT DB PORT+1表示INPORT单元中存放的是端口号50H,OUT-PORT单元为51H5.定义存储单元类型的伪指令BYTE、WORD、DWORD定义存储单元类型伪指令不能单独使用,要和8086指令相结合,如:MOV BYTE PTRDI,00;DI所指单元清零MOV WORD PTR1000,00;1000 1001两单元清零INC BYTE PTR SI;SI所指单元1JMP DWORD PTR2000 ;段间间接转移,目的地在20002003单元中6.段定义伪指令SEGMENT、ENDS、ASSUME、ORGSEGMENT和ENDS成对使用

21、,每对为一个段:数据段 堆栈段 代码段ASSUME告诉汇编程序,当前数据段、哪是堆栈段、代码段等ORG 规定目标程序存放单元的偏移量,比如:ORG 200H使得IP200H , 规定目标程序的第一个字节放在200H单元为什么用伪指令来表示有关段的信息?关系到转移调用时除16位偏移量外,有无16位段地址的问题例子:两个16位2进制数相乘DATA SEGMENTM1DW00FFH;M1中放乘数M2DW00FFH;M2中放被乘数P1DW?P2 DW?DATA ENDSSTACK SEGMENTST DB100 DUP(?)TOP EQULENGTH STSTACK ENDSCODESEGMENTAS

22、SUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVBX,OFFSET M1MOVAX,BXMOVDX,00MOVBX,OFFSET M2MULWORD PTRBXMOVBX,OFFSET P1;存积的低16位MOVBX,AXMOVBX,OFFSET P2;存积的高16位MOVBX,DXHLTCODEENDSENDSTART几点说明:SEGMENT前面的标号可以是任意的ASSUME语句使得汇编程序得知那一段是数据段、代码段、堆栈段,但除CS段外,段码要用MOV指令赋

23、值。7.段定义的一般形式:段名 SEGMENT 定位类型组合类型类别。段名 ENDS定位类型有:PARA指定段从小段边界XXXX0H,缺省定位类型BYTE从任何地址开始WORD从字边界开始PAGE从页边界开始XXX00H组合类型有:不组合(缺省),不同程序中同名段不组合PUBLIC该段与同名段连接时在一起。COMMON连接时同名段重叠,不能同时调入内存AT表达式指定段从表达式左移4物理地址开始STACK不同程序中的同名段连成一个逻辑段MEMORY几个逻辑段连接时该段在地址最高处类别: 决定各逻辑段的装入顺序,相同类别名连续装8.定义过程的伪指令PROC、ENDP、NEAR、FARASM86的子

24、程序含义与其他语言相同,最后一句总是返回语句PROC和ENDP总是成对出现,两者之间为一子程序。段间返回和段内返回都是RET,但汇编时代码不同段内C3H 段间CBHFAR和NEAR指明到底是段间调用还是段内调用,两方面提供汇编信息。子程序头部标有FAR,则段间调用,产生段地址,返回代码CBH例子:BCD码相加程序DATASEGMENTFIRSTDB11,22,33,44;第一个加数SECONDDB55,66,77,88;第二个加数SUMDB 20 DUP(?);结果存放单元DATAENDSSTACK SEGMENTSTADB 20 DUP(?);设堆栈长度为20个字节TOPEQULENGTH

25、STASTACK ENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START:MOVAX,DATA;设数据段寄存器的值 MOV DS, AX MOV AX,STACK;设堆栈段寄存器的值 MOVSS,AX MOVAX,TOP;设堆栈指针,指向预留栈区底部MOV SP ,AX MOVSI,OFFSET FIRST;SI指向第一个加数MOVDI,OFFSET SUM;DI指向结果单元MOVBX,OFFSET SECOND;BX指向第二个加数MOVCX,04;共长4个字节CLDCLC;清进位标志ADITI:CALLAAA1;完成多字节加法LOOPADIT

26、I。 。AAA1PROCNEAR;单字节加法子程序,NEAR可省去LODSB;取第一个加数ADCAL,BX;相加DAA;十进制调整STOSB;结果送DI所指单元INCBXRET;返回AAA1ENDP;子程序结束CODEENDS;程序段结束ENDSTART;程序结束9.源程序结束伪指令ENDENDPPROCENDSSEGMENTEND不和其他伪指令配对使用,源程序结束标志END之后的内容不予理睬END语句形式:END 表达式 表达式就是程序第一条指令前的标号。5.3 汇编语言程序设计1.概述设计一个好的程序,除能正常运行外,还应满足:。程序要结构化(简明、易读、易调试)。执行速度快。占用存储空间

27、小汇编程序的基本步骤是:。分析问题,描绘出数学模型。确定算法。绘制程序框图。分配存储器及工作单元。编制程序。检查程序程序的基本结构。顺序程序设计。分支程序设计(不完全分支和完全分支)。循环程序设计。子程序设计子程序与主程序的信息交换(1)通过寄存器交换信息例5.7:求y=(x2+x.f(x).f(x2)其中f(t)=4t3+2t2+3t+7=(4t+2).t+3).t+7两处用到f(x),可定义为子程序,主程序存x于CX中,子程序存结果于AX中。DATA SEGMENTX DW 2Y DW ?DATA ENDSSTAC SEGMENT STACKSTA DW 100 DUP(?)STAC EN

28、DSCODEG SEGMENT CODEASSUME CS:CODEG,DS:DATA,SS:STACBEG: MOV AX,DATAMOV DS,AXLEA SP,STA+200MOV CX,X ;CX=xCALL FX;AX=f(x)MUL X ;AX=x.f(x) MOV BX,AX ;BX=x.f(x)MOV AX,XMUL AXADD BX,AX ;BX=x2+x.f(x)MOV CX,AX ;CX=X2CALL FX ;AX=f(x2)MUL BX ;AX=(x2+x.f(x). f(x2)MOV Y,AXMOV AH,4CHINT 21HFX PROC NEARMOV AX,4M

29、UL CX ;AX=4xADD AX,2 ;AX=4x2MUL CX ;AX=(4x2).xADD AX,3 ;AX=(4x2).x3MUL CX ;AX=(4x2).x3).xADD AX,7 ;AX=(4x2).x3).x7 ;=4x3+2x2+3x+7RETFX ENDPCODEG ENDSEND BEG(2)通过内存变量传递信息上述程序中可把变量x保存在内存单元t中实现参数传递子程序返回结果仍通过AX传递FX PROC NEARMOV AX,4MUL tADD AX,2MUL tADD AX,3MUL tADD AX,7RETFX ENDP(3)通过堆栈区传递参数例5.8:求y=(x2

30、+x.f(x).f(x2)其中f(t)=at3+bt2+ct+d=(at+b).t+c).t+d程序如下:DATA SEGMENT DATAX DW 2A DW 4B DW 2C DW 3D DW 7Y DW ?DATA ENDSSTAC SEGMENT STACKDB 100 DUP(?)STAC ENDSCODEG SEGMENT CODEASSUME DS:DATA,SS:STAC,CS:CODEGBEG: MOV AX,DATAMOV DS,AXPUSH APUSH BPUSH CPUSH DPUSH XCALL FXPOP AX ;取出信息AX=f(x)MUL XMOV BX,AX

31、;BX=x.f(x)MOV AX,XMUL AX ;AX=x2ADD BX,AX ;BX=x2+x.f(x)POP CX ;CX=xPUSH AX ;x2压入栈顶CALL FXPOP AX ;AX=f(x2)MUL BX ;AX=(x2+x.f(x).f(x2)MOV Y,AXADD SP,10 ;退栈MOV AH,4CHINT 21HFX PROCMOV BP,SP ;虽然栈顶未变内容变成x2MOV AX,WORD PTRBP+8 ; AAXMUL WORD PTRBPADD AX,WORD PTRBP+6MUL WORD PTRBPADD AX,WORD PTRBP+4MUL WORD P

32、TRBPADD AX,WORD PTRBP+2PUSH AXRETFX ENDPCODEG ENDSEND BEG关于现场保护(CPU寄存器状态)(1)主程序子程序分开使用存储器和寄存器(2)子程序使用临时寄存器和堆栈单元(3)保留恢复现场(子程序中保留恢复现场较好,尤其是中断子程序,随机发生)5.4 DOS功能调用DOS、BIOS系统功能不用CALL指令调用,而用INT n不连接用户有两种途径使用DOS功能,普通用户从键盘输入DOS命令,COMMAND.COM接收、识别、执行之。高级用户通过用户程序调用DOS、BIOS中的服务程序。用户程序控制PC机硬件的方式使用高级语言提供的功能控制硬件高

33、级语言中的IO语句方便,但少,速度慢。使用DOS提供的程序控制硬件DOS提供近百种I/O程序,使用简单可移植性好,效率低。使用BIOS提供的程序控制硬件BIOS驻留ROM中,运行效率高,可移植性差。4.直接访问硬件常用DOS功能调用INT n 软中断调用DOS、BIOS功能,n=5-1FH,BIOS调用N=20-3FH为DOS功能调用,见表5-4。所有的DOS功能调用格式都是相同的,分4个步骤:;在AH寄存器中设置调用功能号;在指定寄存器中设置入口参数(有些不需要);用INT 21H指令执行功能调用(有些不需要);根据出口参数分析功能调用执行情况键盘输入(1号调用)INT 21H 常用功能调用

34、格式: MOV AH,1INT 21H ;功能是等待从键盘输入一个字符的ASCII码送入寄存器AL中,并送显示器显示输出(2号调用)调用格式:MOV DL,待显示字符的ASCII码;如A MOV AH,2 INT 21H打印输出(5号调用)MOV DL,待打印字符的ASCII码;例如$MOV AH,5INT 21H ;打印出了字符 $四、检查键盘状态 0BH号功能,如dir/p、放错启动软盘等LOOP:。MOV AH,0BHINT 21H ;检查键盘状态CMP AL,00H ;有键按下AL=FFH,否则AL=00JE LOOP ;无字符键入,循环RET ;有键入字符,停止循环返回五、单字符键入

35、 功能1、7、8都可直接键入字符,回答提示信息,7、8不回显可用于保密信息输入。MAIN。KEY:MOV AH,1;等待字符键入,按下后INT 21H;AL=字符CMP AL,Y JE YES ;键入字符“Y”,转YES语句处CMP AL,NJE NOTJMP KEY。 ;继续等待键入字符YES:。NOT:。六、显示字符串(9号调用)LEA DX,字符串首偏移地址;字符串要以$结尾MOV AH,9INT 21H;将DS:DX所指以$结尾的字符串送显示七、键盘输入字符串(10号调用)LEA DX,缓冲区首偏移地址MOV AH,10INT 21H;从键盘往DS:DX所指输入缓冲区输入并显示例题:字

36、符串键入与显示DATA SEGMENTBUFSIZE DB 50ACTCHAR DB ?CHARTEX DB 50 DUP(20H) DB S。DATA ENDS。CODE SEGMENT。MOV DX,OFFSET BUFSIZEMOV AH,0AHINT 21H ;键入字符串,放入缓冲区。MOV DX,OFFSET CHARTEX MOV AH,09H INT 21H ;显示键入的字符串5.4 MASM5.0宏汇编语言上机过程实验一 MASM5.0宏汇编语言编程调试实验目的为了深入理解汇编语言指令系统常用指令的含义,掌握汇编语言程序的编辑、连接和调试方法,用MASM5.0进行编程调试实验。

37、MASM5.0是在DOS环境下运行的一种功能很强的宏汇编程序,除具有一般汇编程序的功能外,还支持宏处理、条件汇编。实验方法MASM5.0宏汇编语言系统只有数百K字节,主要由EDIT.COM,MASM.EXE,LINK.EXE和DEBUG.EXE四个文件组成,系统不需要安装。由于Windows2000以上版本的操作系统没有MS-DOS方式,需从开始菜单的运行子菜单处键入CMD或COMMAND命令,进入命令行方式,设法进入汇编系统所在的文件夹子目录后。操作过程如下:1.EDIT 文件名.ASM 进入编辑状态,编辑汇编语言源程序。文件名.ASM2.MASM文件名.ASM 对源程序进行汇编,根据提示输

38、入三次文件名,分别得到目标代码文件:文件名.OBJ ;列表清单文件:文件名.LST和交叉参考文件:文件名.CRF。如果出错重新汇编。直到显示0 warning errors0 savior errors3.LINK 文件名.OBJ 连接系统与目标文件,得到可执行文件:文件名.EXE;和列表文件:文件名.MAP。通常不要选择连接库文件,直接回车即可。4.调试过程:F:DEBUG MASM5文件名.EXE 屏幕上出现一个闪动的短横,表示已进入调试状态。应按如下规定:所使用的数均为16进制数,且不写后缀H地址形式为:段地址:偏移量,如DS:1000 CS:0 134A:100 1200:10C.“地

39、址范围”形式为:段地址:始偏移量 末偏移量或:地址 L 字节数,如DS:100 13F 100 41F(当前段) CS:100 L 60调试命令如下:_R寄存器名 显示寄存器内容(还可修改)U反汇编命令_U 或 U 或 U_U 0 ;从CS:0开始反汇编,每次不超过20H字节_U CS:10 5A从10到5A反汇编。_U ;接着前一个地址继续反汇编。G执行命令_G ;从CS:IP开始执行,直到程序结束。_G=;从指定地址开始执行,直到程序结束。_G=从指定地址执行到断点地址。_G=0 4E从CS:0执行到CS:4E。_G=10 从CS:10到程序结束。_G 从当前CS:IP执行到最后。_G 4

40、B 从当前CS:IP执行到4B。D显示内存单元命令_D DS:0 显示数据段从0开始的128个单元。_D 25D3:0 F 显示25D3段的0到F单元的数据。_D CS:0 3F 显示CS段的0到3F单元的机器码。_D 从当前地址往下显示128单元E修改内存单元内容。T单步执行(跟踪),每次执行一条指令。Q结束调试,返回DOS 运行程序键入文件名五、打印实验结果用EDIT命令打开.ASM、.LST、.MAP文件,打印并阅读实验结果。4.2 汇编语言编程例题解析1、下列指令中,指令 先执行CX-1送的CX操作,然后再根据CX的值决定是否转移、循环或进行重复操作。(A)JNC (B)REP (C)

41、JCXZ (D)LOOP答案:(D),LOOP指令的执行过程就是先将CX1送CX,然后判断CX是否为零,不等于零继续循环,等于零循环终止,跳出循环,执行下面的语句。JCXZ不仅执行以上过程,同时还要检查ZF标志位是否为1,ZF=1,且CX0才继续循环,否则跳出循环。2、将寄存器AX的内容求反的正确指令是 。(A)NEG AX (B)CMP AX,OFFFFH(C)NOT AX (D)CMP AX,AX答案:(C),只有NOT指令能取反。NEG是求补指令。CMP指令不改变AX中的内容。3、计算机系统软件中的汇编程序是一种 。汇编语言程序 (B)编辑程序(C)翻译程序(D)将高级语言程序转换成汇编

42、语言程序的程序答案:(C),计算机系统软件中的汇编程序起作用就是将汇编语言编写的程序翻译成机器语言,这一过程通常也称为汇编。4、使得JB指令执行转移操作的条件是 。(A)CF=1 且ZF=0 (B)CF=1(C)CF=0或ZF=1 (D)ZF=0答案:(A),CF=1说明相减后有借位,ZF=0说明结果不为0,显然无符号数被减数低于减数,满足转移条件。5、设(SP)=2800H,使(SP)=27FEH的正确指令是 。(A)NEG A (B)MOV SP,27FEH(C)POP AX (D)MOV SP,27FEH答案:(B),NEG A指令与此无关。POP AX 使SP内容22802H,最后一个

43、选择使内存中2800、2801两单元分别为0FEH、27H6、8086 CPU在基址加变址的寻址方式中,已知BX=2000H,SI=1234H,则指令“MOV AX,BX+SI+2”的源操数作在 中。(A)数据段中偏移量为3236H的字节(B)数据段中偏移量为3234H的字节(C)附加段中偏移量为3236H的字节(D)附加段中偏移量为3234H的字节答案:(A),按规定,用BX间接寻址的,默认数据在数据段,具体偏移量由.中结果确定。7. 执行下列程序后,指出相应寄存器的当前值。 MOV SP, 2000H ;(SP)2000HMOV AX, 0F0H ;(AX)0F0HMOV SI, 1234

44、H ;(SI)1234HMOV DX, 5678H ;(DX)5678HPUSH SI ;2000H-21234HPOP DI ;(DI)1234HTEST AX, DX ;AX不变,只影响标志PUSH DX ;2000H-2=5678HHLTSP= ; DL内容所在存储器的偏移地址为_; AX=_; DX=_;标志位ZF为_。答案要点: 1FFEH; 1FFEH; 00F0H; 5678H; 08.执行下列指令后:STR1 DW ABSTR2 DB 16 DUP(?)CNT EQU $-STR1 ;CNT=18 MOV CX, CNT ;(CX)18 MOV AX, STR1 ;(AX)41

45、42H HLT寄存器CL的值是_;寄存器AX的值是_;如将STR1 DW AB 改为STR1 DB AB用“MOV AX,WORD PTR STR1” 代替“MOV AX,STR1”后,寄存器AX的值是_。答案要点: 18 4142H; 4241H;9.执行下列指令后: MOV AX,1234HMOV CL,4ROL AX,CLDEC AXMOV CX,4MUL CXHLT寄存器AH的值是_;寄存器AL的值是_。 答案要点 :8DH;00H。10. 下列程序执行后,AX和DX的内容是多少?CF、SF、ZF、OF和PF的状态是多少? MOV DX,8F70H MOV AX,54EAH OR AX

46、,DX AND AX,DX NOT AX XOR AX,DX TEST AX,DX答案要点:CF=0,SF=0,ZF=1,OF=0,PF=0 AX=0FFFFH, DX=8F70H 11. 阅读下列程序段,指出其实现的功能: CMP AX, BX JAE NEXT XCHG AX, BX NEXT: CMP AX, CX JAE EXIT XCHG AX,CX EXIT:答案要点 :求放在AX、BX、CX中的最大值 ,最大值最后放在AX 中。13. 分析下面程序,并回答问题:MOV CL, 5SAL DX, CLMOV BL, AHSAL AX, CLSHR BL, CLOR DL, BL如执

47、行前(AX)=0304H,(DX)=0102H,则该程序执行后,(AX)=_;(BL)=_; (DX)=_。答案要点 :(AX)=6080H ; (BL) =00H ; (DX) =2040H 14. 下面程序实现将AX中无符号二进制数转化为十进制数存放在NUM为起始地址的连续五个字节单元中,并将它显示出来,请将程序补充完整,实现上述功能: PP PROC FAR MOV DI,10000 MOV DX, 0 DIV DI MOV NUM,AL ;万位数MOV AX, DX MOV DI, _ MOV DX,_ _ MOV NUM+1,AL; 千位数MOV DI,100 MOV AX, DX

48、_ DIV DI MOV NUM+2,AL MOV AX,DX MOV DI ,10 DIV DI MOV NUM+3,AL MOV NUM+4,DL MOV NUM+5,$ LEA DX, NUM MOV AH,_ INT 21H RET PP ENDP答案要点:1000 0 DIV DI MOV DX ,0 09H 15. 阅读下面程序(BCD码转换为二进制数程序)DSEG SEGMENTTABLE DW 2710H,03E8H,0064H,000AH,0001HBDATA DW ?BCDD DB 02H,00H,01H,03H,08HCOUNT EQU $-BCDDDSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGMAIN PROC _*_ PUSH DS XOR AX, AX PUSH AX MOV AX, DSEG MOV DS, AX MOV BX, 0 MOV SI, OFFSET BCDD MOV DI, OFFSET TABLEL1: MOV AL, SIOR AL, AL JZ L3L2:

温馨提示

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

评论

0/150

提交评论