实验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



4)d命令查看程序段前缀PSP所占的256个字节:程序的物理地址为SA*16+0+256=SA*16+16*16+0=(SA+16)*16+0,由这段可知段地址和偏移地址表示的为:SA+10H:0,所以PSP地址为CS-10H:IP。

5)使用u命令对ex1.exe进行精确反汇编(应为CX中值为0031),所以此时反汇编的内存单元从76A:0-76A:30

6)g命令执行到程序退出执行之前

;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






注意:t命令在遇到loop指令时会执行每一条循环指令,而p命令遇到循环指令时,会直接执行至CX递减至0。

3. 实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H
编写汇编源程序

1)运行

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

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

4)猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
猜测:高字节存放颜色信息,低字节存放内容信息
1)综合使用[bx]和loop,编写汇编源程序

2)灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

使用d命令查看:

5. 实验任务5
将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序
;ex5.asm
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
题目的要求是把代码段内的指令当作数据,复制到目的地址,所以,源数据段ds和代码段cs相同,所以第一空填 cs
第二空可以随机填入一个十六进制数,对源程序进行反汇编,得到指令总长度为001B,其中mov ax,4C00h之前的指令共占字节为0000-0016共17h个字节,所以要完成复制需要执行mov es:[bx],al指令共17h次,所以CX的值应当设为17h.

cx确定后,对源程序进行单步执行,通过debug命令观察,发现0:200-0:217的内容以及完成复制。

1)复制的是什么,从哪里到哪里
题目的要求是把代码段内的指令当作数据,复制到目的地址,所以,源数据段ds和代码段cs相同,即复制字节数据,从cs代码段到ds数据段,即0:200处
2)复制的是什么,有多少个字节,如何知道要复制的字节数量
cx的值是loop循环的次数,而程序段的长度决定了循环写入的次数,所以cx的值为程序段的长度。
可以用r命令查看一开始cx的值,再用u命令反汇编。

浙公网安备 33010602011771号