1、汇编实验报告实验一 汇编语言运行环境及方法、简单程序设计一、 程序说明 本程序用来比较两个字符串string1和string2所含的字符是否相同。若相同则显示Match, 否则显示No match。二、 调试说明 1. 在DOS提示符下,进入MASM目录。2. 在MASM目录下启动EDIT编辑程序,输入源程序。3. 用汇编程序MASM对源文件汇编产生目标文件OBJ。4. 用连接程序产生执行文件EXE。5. 用Debug进行调试。用-g命令来用运行程序,用-u命令来显示程序,用-d 命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修
2、改寄存器的值,-q命令用来退出debug程序。在这些命令的后面加上地址,可以将命令执行到相应的地方。在debug中用-g来运行程序:用-u来显示程序:-g将端点设置在程序的主要部分以前:-d根据其中指示的ds寄存器内容查看数据段情况:-e命令修改数据区的字符串:-q命令退出: 3、源程序DSEG SEGMENTSTRING1 DB move the cursor backwordSTRING2 DB move the cursor backwordMESS1 DB MATCH!,0DH,0AH,$MESS2 DB NO Match!,13,10,$DSEG ENDSCSEG SEGMENTMA
3、IN PROC FAR ASSUME CS:CSEG,DS:DSEG,ES:DSEGSTART: PUSH DS SUB AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX LEA SI,STRING1 LEA DI,STRING2 CLD MOV CX,24 REPZ CMPSB JZ MATCH LEA DX,MESS2 JMP SHORT DISPMATCH: LEA DX,MESS1DISP: MOV AH,9 INT 21H RETMAIN ENDPCSEG ENDS END START实验二 用DEBUG编程:使用堆栈段将AX和BX的内容进行
4、交换等一、 程序说明1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。2、设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。程序清单如下:MOV AX,BXMOV AX,0304HMOV AX,0304HMOV AX,BXMOV
5、 AX,0001BXMOV AX,BXSIMOV AX,0001BXSIHLT二、 调试说明第一部分先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试, -t单步执行,查看AX和BX中内容的变化。如果发现AX和BX中的内容进行了交换,则说明程序运行成功。第二部分先将基本的程序结构编好, 进入debug程序,用-u指令查看一下程序:再用-a指令从145C:000B后面输入已给出的程序,然后用-u0指令查看程序:这时可以先用-t指令将程序逐步执行到指令mov ax,bx之前,然后用-e300指令安要求修改相关的内存内容,再用-d3
6、00指令查看一下修改后的内存内容,结果如下:然后再用-t指令逐步执行程序,观察每步指令执行后,ax中的内容,结果如下:可以看出,在执行完指令MOV AX,0304H 后,ax 中的内容为AX=610E,在执行完指令MOV AX,BX后,ax中的内容为AX=0B0A,在执行完指令MOV AX,0001BX 后,ax中的内容为AX=0C0B,在执行完指令MOV AX,BXSI后,ax中的内容为AX=0D0C,在执行完指令MOV AX,0001BXSI 后,ax中的内容为 AX=0E0D。做完所有操作后,程序最终执行结果:最后AX的内容是0E0DH。三、 源程序第一部分:DATAS SEGMENTD
7、ATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX MOV AX,3000H MOV BX,5000H PUSH AX MOV AX, BX POP BX MOV AH,4CH INT 21HCODES ENDSEND START 第二部分:DATAS SEGMENTDATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV
8、 BX,0300H MOV SI,0002H MOV AH,4CH INT 21HCODES ENDSEND START实验三 存储器块清零和内存块移动1、程序说明第一个程序是存储块清零。首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。 第二个程序是内存块移动。首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,最后按长度重复传送数据直到结束。2、调试说明第一个程序先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进
9、行调试。在进入debug后,先用-u指令查看一下程序: 根据ds寄存器内容,用-d指令查看数据段的情况:用-g执行程序,再用-d指令查看数据段内容是否清零:第二个程序先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试。进入debug后先用-u查看程序:d查看内存的内容 :然后-g运行到指令rep movsb 之前再用,d查看内存的内容 :3、源程序1、存储器快清零DATA SEGMENT BLOCK DB 256 DUP(55H)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART
10、 PROC NEAR MOV AX,DATA MOV DS,AX MOV BX,OFFSET BLOCK MOV CX,256AGAIN: MOV BX,BYTE PTR 0 INC BX LOOP AGAIN JMP $CODE ENDS END START2、内存块移动data segmentsource db 256 dup(055h) target db 256 dup(0aah) data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov es,ax mov si,offset sour
11、ce mov di,offset target mov cx,256 rep movsb jmp $ code ends end start 实验四 将键盘输入的小写字母用大写字母显示出来一、程序说明本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。二、调试说明 将程序编好后,在DOS环境下用masm程序生成obj文件
12、,再用link程序生成exe文件,最后运行程序:3、源程序DATAS SEGMENT string1 db input error!,0ah,0dh,$ string2 db $ DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX L0: MOV AH,1 INT 21H CMP AL,0DH JZ EXIT CMP AL,a JAE L1 JB L3 L1: cmp al,z jna L2 ja L3 L2: sub al,20h mov cl,al lea dx,string2 mo
13、v ah,9 int 21h mov dl,0 mov dl,cl mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h jmp L0 L3: lea dx,string1 mov ah,9 int 21h jmp L0 exit: MOV AH,4CH int 21H codes ends end start 实验五 循环程序实验1、程序说明 编写一个程序,显示AL寄存器中的两位十六进位制数,通过DOS功能调用int 21h 的2号功能显示出来。2、调试说明 先将程序编好后,在DOS环境下用masm程
14、序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试。3、源程序code segment assume cs:codestart: mov al,3Eh push ax mov dl,al mov cl,4 shr dl,cl cmp dl,9 jbe next1 add dl,7next1: add dl,30h mov ah,2 int 21h pop ax mov dl,al and dl,0Fh cmp dl,9 jbe next2 add dl,7next2: add dl,30H mov ah,2 int 21H mov ah,4CH int 21Hcode
15、 ends end start实验六 分支程序实验1、程序说明 判别键盘上输入的字符:若是0-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,则结束程序,若为其他字符则不显示,继续等待新的字符输入。 首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。若是0-9字符,则显示之。若是小于0,则重新等待输入。若大于9,则再和A,Z比较,若小于A,则重新等待输入,若大于Z,则再和a,z比较,若小于a或大于z,则重新等待输入,否则输出c。2、调试说明 先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后运行程序。3、源程序c
16、ode segment assume cs:codestart: mov ah,1 int 21h cmp al,0DH jz done cmp al,0 jb next cmp al,9 ja charup mov dl,al mov ah,2 int 21H jmp startcharup: cmp al,41H jb next cmp al,5AH ja chrdndispc: mov dl,c mov ah,2 int 21Hnext: jmp startchrdn: cmp al,61h jb next cmp al,7AH ja next jmp dispcdone: mov ah
17、,4ch int 21h code ends end start实验七 统计不同成绩段学生的人数1、程序说明 设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序,统计低于60分,6069分,7079分,8089分,9099分和100分的人数,并输出显示统计结果。2、调试说明3、源程序data segment grade db 76,69,84,90,73,88,99,63,100,80 string1 db 60num:,$ string2 db 0ah, 6070num: , $ string3 db 0ah, 7080num: , $ s
18、tring4 db 0ah, 8090num: , $ string5 db 0ah, 90100num: ,$ string6 db 0ah, 100num: , $ count db 10 data ends code segment assume cs:code,ds:data,ss:stack main proc far start: mov ax,data mov ds,ax xor ax,ax xor bx,bx xor cx,cx xor dh,dh call divide call output mov ah,4ch int 21h main endpdivide proc n
19、ear mov di,0 compare: cmp gradedi,60 jb case1 cmp gradedi,70 jb case2 cmp gradedi,80 jb case3 cmp gradedi,90 jb case4 cmp gradedi,100 jb case5 inc cl jmp continue case1: inc ah jmp continue case2: inc al jmp continue case3: inc bh jmp continue case4: inc bl jmp continue case5: inc ch jmp continue co
20、ntinue: inc di dec count jnz compare ret divide endp output proc near push cx push bx push ax lea dx,string1 mov ah,09h int 21h pop bx mov dl,bh add dl,30h mov ah,02h int 21h lea dx,string2 mov ah,09h int 21h mov dl,bl add dl,30h mov ah,02h int 21h lea dx,string3 mov ah,09h int 21h pop bx mov dl,bh
21、add dl,30h mov ah,02h int 21h lea dx,string4 mov ah,09h int 21h mov dl,bl add dl,30h mov ah,02h int 21h lea dx,string5 mov ah,09h int 21h pop bx mov dl,bh add dl,30h mov ah,02h int 21h lea dx,string6 mov ah,09h int 21h mov dl,bl add dl,30h mov ah,02h int 21h mov ah,4ch int 21h output endp code endsend start
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1