1、assume cs:prognam,ds:datarea,es:datareastart: ;starting execution addressset up stack for return push ds ;save old data segment sub ax,ax ;put zero in AX push ax ;save it on stackset DS register to current data segment mov ax,datarea ;datarea segment addr mov ds,ax ;into DS register mov es,ax ;into
2、ES registerMAIN PART OF PROGRAM GOES HERE lea si,string1 lea di,string2 cld mov cx,25 repz cmpsb jz match lea dx,mess2 jmp short dispmatch: lea dx,mess1disp: mov ah,09 int 21hret ;return to DOSmain endp ;end of main part of programprognam ends ;end of code segmentend start ;end assembly四执行结果如下:实验二 用
3、DEBUG编程:使用堆栈段将AX和BX的内容进行交换等一:程序说明: 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中的内容是什么。二:调试说明第一部分先将程序编好后,在DOS环境下用ma
4、sm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试,用-t命令逐步运行程序,查看AX和BX中内容的变化。如果发现AX和BX中的内容进行了交换,则说明程序运行成功。三:源代码程序1的代码如下:STSG SEGMENT STACK SDW 1000 DUP(?)STSG ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,SS:STSGMOV SP,2000 MOV AX,3000H MOV BX,5000H PUSH AX PUSH BX POP AX POP BX MOV AX,4C00H INT 21HMAIN ENDPC
5、ODE ENDS END MAINCODES SEGMENTCODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV BX,0300h MOV SI,0002h MOV AH,4CHCODES ENDS END START四执行结果程序1的结果如下程序2的结果如下:实验三、存储器块清零和内存块移动一第一个程序是存储块清零。程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设
6、置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。调试说明: 第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loop again之后,通过指令-g加上指令Loop again后的地址,将程序运行到Loop again之后停止,然后再通过-d指令查看相关内存内容是否被清零。第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令rep movsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容。三源代码程序1源代码data segment block db 256 dup(55h) data ends code
7、segment assume cs :code ,ds:datastart proc near mov ax,data mov ds ,ax mov bx,offset block mov cx,256 again: mov bx,byte ptr 0 inc bx loop again jmp $ code ends end start程序2源码:DATA SEGMENT source db 256 dup(055h) target db 256 dup(0aah) DATA ENDSCODE,DS:DATA,ES:DATASTART PROC NEAR MOV AX,DATA MOV ES
8、,AXmov si,offset sourcemov di,offset target rep movsb JMP $ CODE ENDS四运算结果程序1结果如下:程序2结果如下:实验四 将键盘输入的小写字母用大写字母显示出来一、 程序说明 本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。二、 调试说明 调试程序可以
9、在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察相关内容变化,来调试程序。DATAS SEGMENT string1 db this not is a zimu!Please input between a to z!,0ah,0dh, string2 db $DATAS ENDSL0:mov ah,1 int 21h cmp al,0dh jz exit cmp al,a jae L1 jb L3 L1:z jna L2 ja L3 L2:sub al
10、,20h mov cl,al lea dx,string2 mov ah,9int 21h mov dl,0 mov dl,cl mov ah,2mov dl,0ahmov dl,0dhmov ah,2 jmp L0 L3: lea dx,string1 jmp L0 exit: int 21Hcodes endsend start四程序结果:实验五:循环程序设计 第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z则结束程序,
11、若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和A、Z比较,若小于A,则重新等待输入,若大于Z,则跳转到和a、z比较处,若小于a或大于z,则重新等待输入,否则输出c。调试时可通过-t指令来逐步运行程序,观察程序是如何进行循环的。修改AL中的内容,可以通过-r指令来实现,如修改ax 中的内容,通过指令-r ax来实现。三程序源代码程序1源代码:CODES mov al,3eh push ax mov dl,al mov cl,4 shr dl,cl cmp dl,9
12、 jbe next1 add dl,7next1:add dl,30h pop ax and dl,0fh jbe next2next2: mov ah,4ch程序2源代码: mov ah,1 jz done0 jb next9 ja charup jmp START charup:cmp al,41h cmp al,5ahja chrdn dispc:mov dl,c next:jmp START chrdn:cmp al,61hjb nextcmp al,7ahja nextjmp dispcdone:MOV AH,4CHEND START四:结果程序1结果:程序2结果:实验六:分支程序设
13、计程序说明若大于9,则跳转到和A、Z比较,若小于A,则重新等待输入,若大于Z,则跳转到和a、z比较处,若小于a或大于z,则重新等待输入,否则输出c三、 调试说明调试时可通过-t指令来逐步运行程序,观察程序是如何进行分支的。四程序结果实验七 统计不同成绩段学生的人数 本程序用来统计在不同分数段的学生人数并显示出来。有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。直到所有分数都完成比较。子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示
14、器上显示一个字符来实现输出相关内容。子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。二调试说明调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。三.源代码 array db 50,69,84,94,73,89,99,58,100,80,100,65,89,91,77The number of 100:The number of 90-99: string3 db The number of 80-89: string4 db The numbe
15、r of 70-79: string5 db The number of 60-69: string6 db the number of low 60:STACKS SEGMENTSTACKS ENDSDATAS,SS:STACKS mov al,0 mov bx,0 mov cx,0 mov dh,0 mov dl,11 call count call output MOV AH,4CH count proc near ; mov si,0 cmp arraysi,100 jz L1 jl next1 next1:cmp arraysi,90 jae L2 jl next2 cmp arra
16、ysi,80 jae L3 jl next3 next3: cmp arraysi,70 jae L4 jl next4 next4: cmp arraysi,60 jae L5 inc dh inc si dec dl jnz next jmp exitinc alinc bhL3:inc bl L4:inc chL5:inc cldec dljnz nextexit:ret count endp output proc near ; mov ah,0 push dx push cx push bx lea dx,string1 ; pop bx mov dl,bl add dl,30h c
17、all enter lea dx,string2 ; mov dl,bh call enterlea dx,string3 ; mov ah,9 lea dx,string4 ;int 21H lea dx,string5 ; lea dx,string6 ;call enter ret output endp enter proc near ; mov dl,0ah mov ah,02h mov dl,0dh enter endp实验心得与体会: 汇编语言是基于计算机硬件的操作,所以具有执行速度快,语言简洁等优点,刚开始做实验时,不怎么明白具体是怎么执行的,只是按照书上的顺序执行,随着实验的深入,渐渐了解汇编语言的特点的,。也让我明白汇编语言和高级语言之间的不同,也更加了解计算机执行程序具体的过程,后面的程序是面向应用的,这样就对编程有了更高的要求,要求学会分解问题,然后再用子程序解决小问题,最后再解决总的问题。通过这次的实验,让我对计算机的硬件工作系统有了更加细致的了解,也希望以后能在这方面加强自己,争取能有一定的专业知识。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1