|
一、实验目的 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。源代码如下:
; 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
要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使 用debug工具调试可执行文件。 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
使用debug工具对程序进行调试。 结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编 灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g 命令,一次执行多行汇编指令)
t命令
p命令
g命令
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在 具体实现上有什么不同?
ex2.asm和ex1.asm实现的功能和效果相同,但具体表现不同,ex1是直接寻址,ex2是间接寻址。
3. 实验任务3 综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。
assume cs:code,ds:data data segment dw 0237H data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov bx,160*11+60 mov di,0 mov dx,ds:[di] mov cx,16 s: mov es:[bx],dx add bx,2 loop s mov ax,4c00h int 21h code ends end start
把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
高位字节里存放的是颜色信息,低位字节存放的是数字信息。
4. 实验任务4 编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
assume cs:code
code segment
mov ax, 0020h
mov ds, ax
mov cx,64
mov bx,0
s: mov [bx],bx
add bx,1
loop s
mov ah,4ch
int 21h
code ends
end
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。
t命令
p命令
g命令
d命令
5. 实验任务5 教材实验4(3)(P121)
; ex5.asm
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, 16h
s: mov al, ds:[bx]
mov es: [bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
复制开始先要确定起始地址,由于程序的起始地址由CS:IP指定,所以第一个空填cs
第二个空的填写,我是先随便填写,然后用u命令反汇编得出mov ax,4c00h指令的地址为076A:0017,之后分别填写17h和16h,得出第二个空填写的是16h
来源:https://www.cnblogs.com/linjiahao1035/p/13909869.html |