实验2 汇编源程序编写与汇编、调试
实验任务1
给出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
给出使用masm、link工具汇编、链接的命令行及运行结果截图

给出debug运行截图
- 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
- 查看PSP的命令及截图
- 使用g命令执行到line16退出执行之前,操作截图
![]()
实验任务2
给出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
给出使用masm、link工具汇编、链接的命令行及运行结果截图

给出使用debug调试的截图
-
结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
![]()
-
灵活使用t命令/p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以
用g命令,一次执行多行汇编指令)
![]()
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
- 效果上,实现了相同的功能,产生了三个小图标
- 原理上,都是通过修改内存中对应的地址改变显示的内容
- 实现上,实验一手动对对应内存进行修改,试验二则使用循环进行,分别改成0101H,0202H,0303H,和试验一中一致
发现在debug时使用d指令查看对应内存单元时并没有发生改变,且小图标也没有出现,可能是因为被刷新掉了
实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H,给出源代码
;综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H
assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov bx,07b8H
mov ax,3902H
mov cx,16
s: mov [bx],ax
add bx,2
loop s
mov ah,4ch
int 21h
code ends
end
给出运行结果截图

基于以下实验操作的发现和文字说明
- 把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
![]()
- 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
![]()
- 猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
- 39变成39,图案发生变化,低位控制图案,测试发现为ascii码
- 02变成04,颜色发生变化,高位控制颜色
实验任务4
实现向内存0:2000:23F依次传送数据063(3FH),综合使用[bx]和loop,编写汇编源程序
;实现向内存0:200~0:23F依次传送数据0~63(3FH),综合使用[bx]和loop,编写汇编源程序
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bl
add bx,1
loop s
mov ah,4ch
int 21h
code ends
end
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:2000:23F,确认是否将03F传送至此段内存区域。

利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序。
;利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过的指令实现)
assume cs:code
code segment
mov ax,0020h
mov ss,ax
mov ax,0040h
mov sp,ax
mov bx,3f3eh
mov cx,32
s: push bx
add bx,-0202h
loop s
mov ah,4ch
int 21h
code ends
end
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:2000:23F,确认是否将03F传送至此段内存区域。

实验任务5
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。
assume cs:code
code segment
mov ax,code
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,18h
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截图,并以文字方式说明空白处填写依据。

- 关于第一空,因为要复制当前代码的数据,结合上下文,ax要得到代码开始的段地址,所以填入code
- 关于第二空,cs显然是循环变量,每次复制一个byte,所以计算程序的总byte数为18h,所以填入18h





浙公网安备 33010602011771号