实验一上机练习实验目的:1、掌握用编辑软件编辑程序文本的方法。
在DOS环境下,熟练掌握用MASM5.0宏汇编程序对ASM文件进行编译、连接等操作步骤。
2、熟悉用DEBUG调试程序。
实验要求:选取教科书中一典型例题,用编辑软件在PC机中形成ASM文件,然后编译、连接,生成目标文件和可执行文件。
再用DEBUG程序进行调试。
实验步骤:实验程序如下:data segmentary1 db 12,34,45,56,67,78,89,90,18cont1 equ $-ary1 ;ary1的长度sum1 dw ?ary2 db 13h,24h,57h,68h,9ah,0bch,0cdh,0deh,80h,50hcont2 equ $-ary2sum2 dw ?data endscode segmentassume cs:code, ds:datastart: mov ax,datamov ds,axlea si,ary1mov cx,cont1 ;设定循环次数为ary1的个数call sumlea si,ary2mov cx,cont2call summov ah,4ch ;结束程序功能调用4CHint 21hsum proc ;求和程序段,求该段所有数之和xor ax,ax ;ax清零为下面加法准备next1: add al,[si]adc ah,0inc siloop next1mov [si],axret ;返回调用程序sum endp ;程序段结束code endsend start点击“运行”点击“编译成目标文件”,编译成功后,再“运行”=〉“生成可执行文件”,然后运行,即可。
运行成功以后,可进行调试。
点击工具栏的调试按钮,出现调试框。
其命令如下:输入a,进行逐行汇编,输入c,比较两内存块,输入d,内存信息以16进制显示;输入e,修改内存指定的字节;输入f,可以预置一段内存;输入g,执行程序;输入h,制算术运算;输入i,从指定端口地址输入;输入l,读盘;输入m,内存块传送;输入n,置文件名;输入o,从指定端口地址输出;输入q,结束DEBUG调试;输入r,显示和修改寄存器;输入s,查找字节串;输入t,跟踪执行;输入u,反汇编;输入w,存盘操作。
实验总结:1、通过实验,熟悉了MASM环境,了解了程序书写,编译和运行的方法。
2、实验过程中,在调试的时候,各调试命令的用法十分复杂,如指令P,单输入p只会执行一步,若要一次执行多步,可以在后面加上数字。
通过练习,熟悉了各调试指令。
实验二两个多位十进制数相加实验目的:1、学习数据传送和算术运算指令的用法。
2、熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序过程。
实验要求:将两个多位十进制数(如四位)相加,要求被加数、加数以ASCII码形式按顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前)。
结果显示在屏幕上。
实验步骤:实验程序如下:DATAS SEGMENTnum1 db '3','2','4','5','0' ;被加数num2 db '2','6','7','1','0' ;加数s db '5423+1762=$' ;显示的公式形式,$表示输出结束DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATASSTART:MOV AX,DATASMOV DS,AX ;DS指向数据段mov ES,AX ;ES指向数据段mov cx,5 ;5次循环lea dx,s ;要显示的字符串的首偏移地址mov ah,9h ;9号DOS功能调用显示字符串sint 21hmov si,offset num1 ; si指向num1首地址mov di,offset num2 ; di指向num2首地址clc ;清零进位寄存器CFadds: LODSBadc al, [di] ;有符号加法aaa ;调整ASCII码加法结果指令stosb ;所得结果以字节为单位存储到数据段di指向的位置,di+1loop adds ;循环知道cx为零,cx-1mov ah,02h ;以下为输出加法结果mov cx,5 ;共有5位数循环5次adjust:mov dl,[di-1]or dl,30h ;二进制数转换成其相应ASCII码dec di ;输出下一位int 21hloop adjustMOV AH,4CHINT 21H ;21号功能调用程序退出CODES ENDSEND START输入程序编译成功以后,显示如下图:实验总结:1、通过实验,学会了使用汇编语言实现多位十进制数的相加运算。
2、实验中应注意,在声明data的部分数字的顺序和实际中数字的顺序是相反的,因为存储器是从低位到高位存储的。
3、要为DATAS段指定两个段寄存器DS和ES分别存放加数和被加数,同时相加结果也存放在ES段中。
4、了解LODSB的用法,每次循环后SI都会自动加一,与此类似的STOSB使用时,寄存器DI指向的地址也会自动后移一位。
5、通过实验,我还了解了ASCII码到BCD码运算的转变,以及运算结果的BCD 码通过调整转变成ASCII码存储和显示。
实验三两个数相乘实验目的:掌握乘法指令的用法实验要求:实现一个多位十进制数和一个一位十进制数的乘法,被乘数和乘数均以ASCII码形式存放在内存中,结果显示在屏幕上实验步骤:实验程序如下:DATA SEGMENTA DB '5','7','4','1','3' ;被乘数B DB '7' ;乘数M DB 6 DUP(0) ;6位字节型存储单元S DB ' 31475*7=$' ; 输出的公式DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXCLD ;将方向标志寄存器DF清零,指令LODSB和STOSB中di,si做自增1的处理MOV SI,OFFSET A ;A为源操作数MOV DI,OFFSET M ;B为目的操作数MOV CX,5AND B,0FH ;将ASCII码数据转换成二进制形式MOV BYTE PTR[DI],0L1: mov al,[si] ;乘数与被乘数相乘LODSBAND AL,0FHMUL BAAMADD AL,[DI]AAAmov [di], alinc diSTOSBMOV [DI],AH ; 结果的存储inc siLOOP L1MOV DX,OFFSET SMOV AH,9INT 21HMOV CX,6L2: MOV DL,[DI]ADD DL,30HMOV AH,02HINT 21H ;显示所得数据DEC DILOOP L2MOV AX,4CHINT 21HCODE ENDSEND START实验结果如下图所示:实验总结:1、通过实验学会了,使用汇编语言完成相乘运算。
2、试验中通过设定CX的值控制循环的次数。
3、在LODSB和STOSB指令中,SI和DI会每次自动增加1。
4、在A串中,由于数据是按从低地址到高地址的顺序存放的,所以A DB '5','7','4','1','3'其实表示的是31475 。
5、程序的L2 循环使得所存二进制数据转换成相对应的ASCII码,并通过DOS 功能调用输出。
实验四字符匹配程序实验目的:掌握串操作指令的用法。
实验要求:用串操作指令设计程序。
实现在指定存储区(长度:100H)中寻找匹配字符,遇空格字符(20H)结束,显示查找结果。
实验步骤:实验程序如下:DATA SEGMENTTISHI_1 DB 0dH,0AH,'Please input a character to search: $' TISHI_2 DB 0DH,0AH,'The string to be searched is:'STRING DB 10 DUP('A'),20H,15 DUP('B'),'$'COUNT EQU $-STRINGS0 DB 0DH,0AH,' FOUND! $'S1 DB 0DH,0AH,'NOT FOUND! $'CHAR DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAGO: MOV AX,DATAMOV DS,AXMOV ES,AXmov dx, offset TISHI_1 ;显示字符串mov ah,09int 21H;mov ah,1 ;从键盘输入数据int 21Hmov CHAR, al ;输入数据保存;MOV DI,OFFSET STRINGMOV CX,COUNTCLD ;自增MOV AL,CHARREPNE SCASB ;字符串字节查找直到相等JZ FOUND ;ZF=0时跳到FOUND指令MOV DX,OFFSET S1JMP DSPLYFOUND: MOV DX,OFFSET S0 ;找到DSPLY: MOV AH,09H ;显示INT 21Hmov dx,offset TISHI_2mov ah,09int 21H;MOV AH,4CHINT 21HCODE ENDSEND GO实验总结:1、程序中用到了三个DOS功能调用,分别是9号调用显示字符串,1号调用从键盘输入字符和4CH调用终止程序。
9号使用DX指向字符串首地址,1号结果存在AL中。
通过实验,对DOS功能调有了更加深刻的认识。
2、在对字符串的查找过程中,使用了SCASB指令,并且前面有REPNZ。
该指令表示在一直查找直到ZF=0,即找到与AL寄存器相等的值为止。
这个指令稍微有些复杂,再加上前缀的变化,使其可以满足不同的查找需要。
3、程序中出现了JMP指令。
单独的JMP指令为无条件转移,不过JMP还常常与标志寄存器一起使用,使其功能更强大。
如题目中的JZ指令表示ZF=1即相等时转移。
实验五字符串匹配程序实验目的:掌握提示信息的使用方法及键盘输入信息的用法。
实验要求:编写程序,实现两个字符串比较。
若相同,则显示’MATCH’,否则显示’NO MATCH’。
实验步骤:实验程序如下:DATA SEGMENTSTRING1 DB 'ABCDEFG$'COUNT1 EQU $-STRING1STRING2 DB 'ABCDEDG$'COUNT2 EQU $-STRING2S0 DB ' MATCH$'S1 DB ' NOT MATCH$'SHIFT DB 0DH,0AH,'$' ;回车换行DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAGO: MOV AX,DATAMOV DS,AXMOV ES,AXMOV DX,OFFSET STRING1 ;显示字符串1MOV AH,09HINT 21HMOV DX,OFFSET SHIFT ;回车换行INT 21HMOV DX,OFFSET STRING2 ;显示字符串2INT 21HMOV DX,OFFSET SHIFTINT 21HMOV AL,COUNT1 ;首先比较字符串长度是否相等MOV AH,COUNT2CMP AH,ALJNZ NMATCHMOV DI,OFFSET STRING1 ;长度相等比较内容MOV SI,OFFSET STRING2MOV CX,COUNT1CLD ;自增REPE CMPSB ; 一直比较直到不相等JZ MATCH ;ZF=0相等则跳转NMATCH:MOV DX,OFFSET S1 ;NO MATCH JMP DSPLYMATCH: MOV DX,OFFSET S0 ;MATCH DSPLY: MOV AH,09HINT 21HMOV AH,4CH ;终止程序INT 21HCODE ENDSEND GO实验总结:1、本实验与上一个实验内容类似,不过不同之处在于直接比较两个已存在的字符串内容是否相等。