汇编实验
第二部分先将基本的程序结构编好,再进入 debug 程序,先用-u 指令查看一下程序, 结果如下:
再用-a 指令从 142F:000B 后面输入已给出的程序,然后用-u0 指令查看程序,结果 如下:
这时可以先用-t 指令将程序逐步执行到指令 mov ax,bx 之前,然后用-e300 指令安要 求修改相关的内存内容,再用-d300 指令查看一下修改后的内存内容,结果如下:
后,
ax 中的内容为 AX=0B0源自,在执行完指令 MOV AX,0001[BX] 后,ax 中的内容为
AX=0C0B,在执行完指令 MOV AX,[BX][SI]后,ax 中的内容为 AX=0D0C,
在执行完指令 MOV AX,0001[BX][SI] 后,ax 中的内容为 AX=0E0D,这样的结
果应该和我们预期的一样。
三、 源程序清单和执行结果
第一部分的源程序: DATAS SEGMENT DATAS ENDS STACKS SEGMENT STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX MOV AX,3000H MOV BX,5000H PUSH AX mov AX,BX POP BX MOV AH,4CH INT 21H CODES ENDS END START
二、 调试说明
调试程序可以在 debug 中进行,基本步骤和前面的实验大致相同,在软件 Masm 集 成实验环境 2008.4 中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。 调试时可通过-t 指令来逐步运行程序,观察程序是如何进行循环的。修改 AL 中的内 容,可以通过-r 指令来实现,如修改 ax 中的内容,通过指令-r ax 来实现,如下图所 示:
L2:sub al,20h mov cl,al lea dx,string2 mov 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
在 debug 程序中,用-t 指令可以逐步执行指令,可以看到在每条指令执行完后,ax 和 bx 中的内容的变化,通过比较可以看出,ax 和 bx 中的内容从开始时的
AX=3000,BX=5000 变为 AX=5000,BX=3000,说明 AX 和 BX 中的内容发生了交换, 最终执行结果如下:
然后在将断点设置在指令 rep movsb 之后,通过指令-g 运行后,再用-d 指令查看一 下内存块的相关内容,得到的结果如下:
三、 执行结果
第一部分的执行结果: 第二部分地址块加一方法移动块的程序执行结果
实验四 将键盘输入的小写字母用大写字母显示出来
一、 程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用 DOS 功能调 用 INT21H 的 1 号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小 写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去 20h, 从而变为大写字母。在通过 DOS 功能调用 INT21H 的 2 号功能显示出来。若输入的 是 Enter 键,则结束程序。
CODES ENDS END START
做完所有操作,程序的最终的执行结果如下:
实验三、存储器块清零和内存块移动
一、 程序说明
第一个程序用来存储块清零,先设置块起始地址,然后设置块长度,再将当前地 址内容清零,地址加一,然后判断是否清完,若清完则结束,否则返回到上一步。
第二个程序用来移动内存块,先设置块的源地址,再设置块的目标地址,然后设 置移动长度,安长度重复传送数据直到结束。
bl 加 1,si 减 1
是 ch 加 1,si 减 1
是
cl 加 1,si 减 1
dl 是否为 0
是
退出程序
实验一 汇编运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串 string1 和 string2 所含的字符是否相同。若相同则 显示‘Match’,否则显示‘Nomatch’。
在开始编好程序的时候,我发现输出的并不是我想要的结果,后来在调试程序 中我用-t 指令进行逐步运行程序,我才发现我的错误之处。原来我在程序的第二十七 行将 al 的值直接赋给 dl 了,表面上看这是没有问题的,但在调试程序中逐步调试就 会发现这样做是错误的,因为在这之前调用了 DOS 功能调用 INT21H 的 9 号功能, 这样会改变 al 中的值,从而使我赋给 dl 的值并不是我真正想要赋给 dl 的值,所以导 致最终结果出现错误。我通过在调用 INT21H 的 9 号功能之前,先将 al 的值赋给 cl,
第二部分初始时的源程序如下: DATAS SEGMENT DATAS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS MOV DS,AX MOV BX,0300h MOV SI,0002h MOV AH,4CH INT 21H
exit: MOV AH,4CH INT 21H
CODES ENDS END START
程序最终运行结果如下:
实验五:循环程序设计
一、 程序说明
第一个程序是用来显示 AL 寄存器中的两位十六进位制数,通过 DOS 功能调用 INT21H 的 2 号功能显示出来。
第二个程序是用来判别键盘上输入的字符:若是 1-9 字符,则显示之;若为 A-Z 或 a-z 字符,均显示“c”;若是回车字符<CR>,z 则结束程序,若为其他字符则不显示, 继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符, 则结束程序。1-9 字符,则显示之。若是若小于 0,则重新等待输入。若大于 9,则跳 转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’ 比较处,若小于 a 或大于 z,则重新等待输入,否则输出‘c’。
汇编语言实验报告
学号: 姓名: 班级:
2010-12-6
系
班级
同组者
实验报告
实验报告
学号
姓名 指导教师
设置十个学生成
绩
否
是否等 于 100
否
是否大于 等于 90 90
否
是否大于 等于 80 80
否
是否大于 等于 70
否
是否大于 等于 60
是
al 加 1,si 减 1
是
bh 加 1,si 减 1
是
二、 调试说明
第一个程序在进入 debug 后,先用-u 指令查看一下程序,再将断点设置在指令 Loop again 之后,通过指令-g 加上指令 Loop again 后的地址,将程序运行到 Loop again 之后停止,然后再通过-d 指令查看相关内存内容是否被清零。
第二个程序在进入到 debug 后,先用-u 指令查看一下程序,再将断点设置在指令 rep movsb 之前,通过指令-g 运行后,然后用-d 指令查看一下内存块的相关内容,得到的 结果如下:
第一个程序先将 AX 的内容进栈,然后将 BX 的内容赋给 AX,再将出栈的内容赋 给 BX 即可。第二个程序是在进入 debug 后,用-a 指令输入给出的程序,然用-e 指令 安要求修改内存的内容,再用-t 指令逐步执行每条指令,看修改的内存内容对指令执 行结果的影响。
二、 调试说明
第一部分先将程序编好后,在 DOS 环境下用 masm 程序生成 obj 文件,再用 link 程序生成 exe 文件,然后进入 debug 进行调试,用-t 命令逐步运行程序,查看 AX 和 BX 中内容的变化。如果发现 AX 和 BX 中的内容进行了交换,则说明 程序运行成功。 用-t 命令逐步运行:
在程序的数据段先定义两个字符串 string1 和 string2,再定义两个字符串 mess1 和 mess2,分别代表‘Match’和‘Nomatch’。再代码段比较字符串 string1 和 string2, 通过比较判断是否相同。若相同则显示‘Match’,否则显示‘Nomatch’。
二、调试说明
再通过 cl 将我想要的值赋给 dl,这样就避免了这种错误了。在改正之后,整个程序 就运行得到我想要的结果了。
三、 源程序清单和执行结果
DATAS SEGMENT string1 db ' Input error!Please input between a to z!',0ah,0dh,'$' string2 db ' $'
DATA ENDS
code segment main proc far assume cs:code,ds:DATA,es:DATA
start:mov ax,DATA mov ds,ax mov es,ax lea si,STRING1 lea di,STRING2 cld mov cx,25 repz cmpsb jz match lea dx,mess2 jmp short disp match:lea dx,mess1 disp:mov ah,9 int 21h mov ah,4ch int 21h
再 EDIT 中建立 ASM 文件,再用汇编程序对源程序汇编产生目标文件 Obj, 再用连接程序产生执行文件 EXE。再用 Debug 进行调试。
其中常用到的指令有: 用-g 命令来用运行程序,用-u 命令来显示程序,用-d 命令来查看数据段的情况, 用-e 或-f 命令来修改需要改正的部分,用-t 指令来逐步执行程序,用-r 指令来查看寄 存器和修改寄存器的值,-q 命令用来退出 debug 程序。在这些命令的后面加上地址, 可以将命令执行到相应的地方。 如用-g 指令运行程序后,再用-u 指令显示程序的执行借给如下: