实验2 汇编语言程序设计
一、实验目的
1. 理解并掌握汇编源程序组成与结构
2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法
3. 理解汇编源程序中地址表示、段寄存器的用法
4. 理解和掌握寄存器间接寻址方式[bx]
5. 通过汇编指令loop的使用理解编程语言中循环的本质
二、实验准备
1. 学习/复习第5章使用[bx]和loop实现循环的编程应用示例(教材5.5节,5.8节)
2. 复习第3章「栈」的知识
3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法
4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途
三、实验内容
1. 实验任务1
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:
;ex1.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov byte ptr ds:[0], 1 mov byte ptr ds:[1], 1 mov byte ptr ds:[2], 2 mov byte ptr ds:[3], 2 mov byte ptr ds:[4], 3 mov byte ptr ds:[5], 3 mov byte ptr ds:[6], 4 mov byte ptr ds:[7], 4 mov ah, 4ch int 21h code ends end
要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使
用debug工具调试可执行文件。
使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。


使用debug工具对程序进行调试
使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。

结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果

2.实验任务2
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
assume cs:code code segment mov ax,0b810h mov ds,ax mov bx,0 mov ax,101H mov cx,4 s: mov [bx],ax add bx,2 add ax,101H loop s mov ah,4ch int 21h code ends end
使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe:

结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编:

灵活使用t命令、p命令、g命令,对ex2.exe进行调试:


把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果:


结论:ex2.asm和ex1.asm实现功能和效果相同,都是实现了累加,不同在于ex2.asm使用了loop循环而ex1.asm一条条执行
3. 实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。
要求: 编写汇编源程序 给出运行结果截图
把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。汇编源程序如下:
assume cs:code code segment mov ax,0b800h ;在汇编源程序中,数据不能以字母开头,所以要在前面加0 mov ds,ax mov bx,07b8h mov cx,16 s: mov [bx],0237h inc bx inc bx loop s mov ax,4c00h int 21h code ends end
对该汇编源程序进行汇编和连接,如下图:
1)运行

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。

猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
高位字节里存放的是颜色信息,低位字节存放的是数字信息。
4.实验任务4
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
ex4.asm源程序:
assume cs:code code segment mov ax,0 mov ds,ax mov cs,64 mov dl,0 s: mov [bx],dl inc dl inc bx loop s mov ax,4c00h int 21h code ends end
2)灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

使用d命令查看:

5. 实验任务5
教材实验4(3)(P121)
先随意补全
第一空应该是将段寄存器cs中的值送给ax,所以应该填cs

可以看到 mov ax,4c00所对应的内存单元为0017,要复制之前的内容,应将0017送给cx,所以第二空填0017

反汇编后:



浙公网安备 33010602011771号