实验2 汇编源程序编写与汇编、调试

四、实验结论

1. 实验任务1

使用任意一款文本编辑器,编写8086汇编源程序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工具调试可执行文件。
1)ex1.asm源代码(使用文本编辑器):
2)使用masm、link工具汇编、链接的命令行及运行结果截图:
 

3)给出使用debug调试的截图

①进入debug调试环境,通过r命令查看当前寄存器的状态

由上图的DS=075A,可知PSP的地址为075A:0。

使用d命令查看程序段前缀PSP所占的256个字节,截图如下:

②结合可执行文件加载后,可知寄存器CX的值为0031H,使用u命令精确反汇编截图

③使用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工具调试可执行文件。
1)ex2.asm源代码,截图如下:

 

 2)使用masm、link工具汇编、链接的命令行,如下:

 运行结果截图:

 

3)使用debug调试的截图
①首先进入debug环境,通过r命令查看此时寄存器的状态,如下:
② 由上可知ex2加载后寄存器CX的值为001C H,使用u命令进行精确反汇编,截图如下:

③使用t命令/p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)

若一直使用p命令单步调试,则一直执行至CX值为0,最后部分截图如下:

若使用t命令则一直在重复循环。 

在单步执行到loop命令后,IP重新变成了000E H,再次进入循环,下面可以使用g命令跳过循环步骤,并继续单步调试,执行完剩下两个指令,截图如下:

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

 

 结果出现了8个彩色小图标。

 回答问题

结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同。
ex2.asm和ex1.asm,它们实现的功能和效果都一样,都是将01 01 02 02 03 03 04 04 写入了显存b810:0 7中;但在具体实现上ex2.asm是通过循环来实现的,而ex1.asm则是一个个按顺序手动写入。

3. 实验任务3

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。
要求:编写汇编源程序,给出运行结果截图(运行前先使用 cls 命令清屏,更便于观察运行结果)
1)汇编源程序代码如下:

; ex3.asm
assume cs:code
code segment
mov ax, 0b800H
mov ds, ax
mov bx, 07b8H
mov ax, 0437H
mov cx, 16
s: mov [bx], ax
add bx, 2
loop s
mov ah, 4ch
int 21h
code ends
end

2)截图如下:

3)把填充的字数据,从0237H 改成0239H

再次保存后,汇编、链接、运行,结果截图如下:

 

 4)把填充的字数据,从0237H 改成0437H

 

 再次保存后,汇编、链接、运行,结果截图如下:

 

分析结果可知:这个字数据中高位字节里存放的是颜色信息,低位字节里存放的是内容信息。

 4. 实验任务4

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

必做:综合使用[bx]和loop,编写汇编源程序;灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。

选做*:利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序;灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。

①必做:

1)综合使用[bx]和loop,编写汇编源程序,代码如下:

; ex4-1.asm
assume cs:code
code segment
    mov ax,0000H
    mov ds,ax
    mov bx,0200H
    mov cx,40H
s:  mov ds:[bx],al
    inc ax
    inc bx
    loop s
    mov ax,4c00H
    int 21H
code ends
end

2)源代码汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200~0:23F,确认是否将0~63传送至此段内存区域。

 

②选做:
1)利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序,代码如下:
; ex4-2.asm
assume cs:code
code segment
    mov ax,0000H
    mov ss,ax
    mov sp,0240H
    mov ax,3F3EH
    mov cx,20H
s:  push ax
    add ax, -0202H
    loop s
    mov ax,4c00H
    int 21H
code ends
end

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

 

 

5. 实验任务5

教材实验4(3)(P121)
1)填空以后的源代码如下:
assume cs:code
code segment
    mov ax,cs
    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
2)汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,截图如下:

 

 

3)空白处填写依据:

cs:第一空需要把代码段内的指令当做数据复制到指定内存,而源数据段与代码段相同,故这里填了code(cs)。

18h:第二空先随便填了一个值,后通过编译连接后进入debug用u命令反汇编后可知mov ax,4c00h之前的指令共占18h即24个字节,故这里填了18h。

五、实验总结

1)在实验一中,通过直接运行ex1.exe时,屏幕上确实可以显示出彩色图标,但是在debug环境下,却没有出现彩色图标。后来进行多次测试,虽然在debug环境下对应的内存单元已经被我修改,但是彩色图标依旧没有显示,我觉得可能是dos系统和正常的操作系统对于屏幕区域显示的处理是有所不同的。

2)在实验二中,单步调试时,分别使用了t命令和p命令,总结出其两者的区别如下:

①T命令:单步执行,每bai次只du执行一条代码语句,遇到子程序后进入子程序逐条执行指令;
②P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;
3)通过此次实验,我熟悉了汇编语言源程序编写→汇编→链接→调试的工具和方法 ,对寄存器间接寻址方式和指令loop的使用有了一定的了解。

posted @ 2020-11-03 23:44  Winnie77  阅读(298)  评论(3)    收藏  举报