当前位置:文档之家› 汇编语言实验

汇编语言实验

实验一 DEBUG命令实验一.实验目的:掌握DEBUG 的基本命令及其功能二.实验内容:DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。

1、DEBUG的主要命令(1)汇编命令A,格式为:-A[地址];该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。

例如:-a136B:0100 mov ax,100136B:0103 mov bx,200136B:0106 mov cx,300136B:0109 mov dx,400136B:010C-(2)反汇编命令U,有两种格式:1)-U[地址]该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。

例如:-u2)-U范围该命令对指定范围的内存单元进行反汇编,例如:(3)运行命令G,格式为:-G [=地址1][地址2[地址3。

]]其中地址1规定了运行起始地址,后面的若干地址均为断点地址。

例如:(4)追踪命令T,有两种格式:1)逐条指令追踪:-T[=地址];该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。

2)多条指令追踪:-T[=地址][值],该命令从指定地址起执行n条命令后停下来,n由[值]确定。

(5)显示内存单元内容的命令D,格式为:-D[地址]或-D[范围](6)修改内存单元内容的命令E,它有两种格式:1)用给定的内容代替指定范围的单元内容:-E地址内容表例如:-E 2000:0100 F3 “XYZ” 8D其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元049e:0005到0008的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。

2)逐个单元相继地修改:-E地址例如:此命令是将原5号单元的内容f3改为89>89是程序员键入的。

(7)检查和修改寄存器内容的命令R,它有三种方式:1)显示CPU内部所有寄存器内容和标志位状态;格式为:-RR命令显示中标志位状态的含义如下表所示:标志名置位复位溢出Overflow(是/否)OV NV方向Direction(减量/增量)DN UP中断Interrupt(允许/屏蔽)EI DI符号Sign(负/正)NG PL零Zero(是/否)ZR NZ辅助进位Auxiliary Carry(是/否)AC NA奇偶Parity(偶/奇)PE PO进位Carry(是/否)CY NC2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名例如打入:-R AX表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如:-R BXBX 0369:059F则BX内容由0369改为059F3)显示和修改标志位状态,命令格式为:-RF系统将给出响应,如OV DN EI NG ZR AC PE CY-这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。

如OV DN EI NG ZR AC PE CY-PONZDINV三、实验任务1.参照附录1,掌握DEBUG程序的各种命令,重点是命令R,D ,A,U,T,P,G 命令的使用。

2.用命令A汇编下列指令,判断指令正误并说明原因。

(1)ROR AX,8(2)LEA DI,[AX](3)MOV DS,2010(4)PUSH AL(5)OUT 900,AL(6)MOV [BX],03.用命令查看8086/8088 CPU在开机后执行的第一条指令。

4.用命令D查看DS:200~22F和F000:200~22F两内存块内容,用命令F将字符“A”分别填入这两个内存块,比较填入前后结果,了解可读写内存RAM和只读内存ROM的区别。

5.用A命令汇编一条INT 1C指令,用命令T单步执行该指令,比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况,了解什么是中断向量表,中断向量和中断子程,掌握中断指令的执行过程。

6.利用T,P,G命令,执行下列指令段,注意它们的不同之处。

(1)MOV DI,300MOV SI,400MOV CX,3CLDREP MOVSBINT 3(2)MOV AH,2 MOV DL,41INT 21INT 3(3)先在CS:200处汇编一条RET指令,再在CS:100处汇编。

MOV BX,200CALL BXINT 3然后从MOV BX,200处开始执行。

实验三分支程序实验一、实验目的1)掌握分支程序的设计方法。

2)掌握利用DEBUG修改参数、检查结果的方法。

3)掌握汇编语言源程序的编辑、汇编、连接及调试过程。

二、实验内容1)编写一个程序,显示AL寄存器中的两位十六进制数2)编写一个程序,判别键盘上输入的字符;若是0-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

1)显示AL中两位十六进制数程序:;DISPHEX.ASMCODE SEGMENTASSUME CS:CODESTART: MOV AL,3EH 0011 1110MOV BL,ALMOV DL,ALMOV CL,4SHR DL,CL 逻辑右移4位,dl= 0000 0011CMP DL,9 比较JBE NEXT1 小于等于ADD DL,7NEXT1: ADD DL,30H 0000 0011+0011 0000 dl=33hMOV AH,2 ah=0000 0010INT 21H ;显示高位ASCII码MOV DL,BLAND DL,0FH 0ehCMP DL,9JBE NEXT2ADD DL,7NEXT2: ADD DL,30HMOV AH,2INT 21H ;显示低位ASCII码MOV AH,4CHINT 21HCODE ENDS ;返回DOSEND START2)显示键入字符程序;DISPKEY.ASMCODE SEGMENTASSUME CS:CODESTART: MOV AH,1 ;1号功能调用INT 21H ;等待键入字符,送AL CMP AL,0DH ;是否是回车符?JZ DONE ;是则转DONE退出程序CMP AL,’0’JA NEXTCMP AL,’9’JB CHARUPMOV DL,ALMOV AH,2INT 21H ;显示0~9 JMP STARTCHARUP: CMP AL,41HJA NEXTCMP AL,5AHJB CHRDNDISPC: MOV DL,’C’MOV AH,2INT 21HNEXT: JMP STARTCHRDN: CMP AL,61HJB NEXTCMP AL,7AHJA NEXTJMP DISPCDONE: MOV AH,4CHINT 21H ;返回DOS CODE: ENDSEND START首先运行程序:对程序进行但不执行,了解程序的运行过程:程序流图:实验四循环程序实验一、实验目的:1)掌握循环程序的设计方法2)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

3)学会针对不同的问题,选用不同的组织循环的方法。

二、实验内容1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。

统计结果存于N单元中。

2)存储单元DAT1及DAT2中各有10字节的二进制数,高位字节放在高位地址中。

试编写一程序将这两个数据相加,结果存放在从DAT3开始的单元中。

1)偶校验程序清单:;EX56.ASMDESG SEGMENTSTRN DB ‘ASCDEfghijkLMNOPQuvw’,‘$’N DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXLEA SI, STRNMOV DL, 0AGAIN: MOV AL, [SI]CMP AL, ‘$’JE DONETEST AL, 0FFHJPE NEXTOR AL, 80HMOV [SI], ALINC DLNEXT: INC SIJMP AGAINDONE: MOV N, DLMOV AH, 4CHINT 21HCSEG ENDSEND START;以上是条件控制的循环。

因为事先不知道字符串STRN共有多少字符,故采用条件控制的循环程序实现。

可以看出,有十个字符进行了偶校验2)加法程序清单:;ADDHEX.ASMCODE SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, CSMOV DS, AXLEA SI, DAT1LEA DI, DAT2LEA BX, DAT3MOV CX, 10XOR AL, AL ;0→CFAGAIN: MOV AL, [SI]ADC AL, [DI]MOV [BX], ALINC SIINC DIINC BXLOOP AGAINMOV AH, 4CHINT 21HDAT1 DB 70H, 80H, 90H, A0H, A1H, A2H, A3HDB 74H, 65H, 56HDAT2 DB 45H, 67H, 89H, 1AH, 2BH, 3CHDB 4DH, 5EH, 6FH, 04HDAT3 DB 10 DUP(?)CODE ENDSEND START ;本程序中,DS及CS同处一个逻辑段CODE中,所以,应将CS值送至DS中。

相当于计算实验五子程序实验(1)一、实验目的1)掌握主程序与子程序之间的调用关系及调用方法。

2)掌握子程序调用过程中近程调用与远程调用的区别。

3)掌握通过堆栈转送参数的方法。

二、实验内容1)将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

在转换过程中,通过子程序DISP实现显示。

2)编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

1)码型转换程序清单:;CONV.ASMDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFAGAIN: MOV AL, [BX]CALL HEXASCINC BXLOOP AGAINMOV AH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;显示高位HEX数MOV DL,ALAND DL,0FHCALL DISP ;显示低位HEX数RETHEXASC ENDPDISP PROPCMP DL,9JBE NEXTADD DL,7NEXT: ADD DL,30H ;将一位HEX数转为ASCII码MOV AH,2INT 21H ;显示RETDISP ENDPCODE ENDSEND START2)统计并显示某键入字符的个数的程序: :COUNTER.ASMDATA SEGMENTCHAR DB ‘b’BUF DB 50H, ? 50H DUP(?)DATA ENDSMCODE SEGMENTASSUME CS: MCODE, DS: DATASTART: MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,9INT 21HLEA SI BUFMOV CL, [SI+1]MOV CH, 0 ;CX中为字符串长度INC SIINC SI ;SI指向串首址TABLE MOV AL,CHARMOV AH,0 ;AX中为待查字符PUSH SIPUSH CXPUSH AX ; 参数送堆栈CALL CHECKPOP AX ;统计个数在AL中MOV DL,CHARMOV AH,2INT 21H ;显示待检字符MOV DL,ALAND DL, 0FHCMP DL,9JBE NEXTADD DL,7NEXT: ADD DL,30HMOV AH,2INT 21H ;显示统计个数MOV AH,4CHINT 21HMCODE ENDSSCODE SEGMENTASSUME CS:SCODECHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX,[BP+8]MOV AX,[BP+6]XOR AH,AHAGAIN: CMP AL,[SI]JNE NEXT1INC AHNEXT1: INC SILOOP AGAINMOV AL,AHMOV [BP+10],AXPOP BPRET .4CHECK ENDPEND START实验六子程序实验(2)本实验目的在于使读者掌握模块间调用子程序的编写方法。

相关主题