一   实验结论

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对ex1.asm进行汇编

 使用link对ex1.asm进行链接

执行ex1.exe

 

 可以看到出现了四个不同的图案

在debug中执行ex1.exe

首先使用r命令查看寄存器的值

使用d命令查看程序段前缀PSP所占的256个字节

 

结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
用r命令查看CX的值为0031H,故使用u命令对ex1.exe进行精确反汇编结果如下:

使用g命令执行到程序退出执行之前

由反汇编后的结果可知line 16 mov ah,4ch的偏移地址为002D,所以使用g 002d这个指令

 我们可以看到出现了四个彩色图案

 

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对ex2.asm进行汇编

 使用link对ex2.asm进行链接

运行ex2.exe观察结果

 结果:屏幕上方出现了不同颜色的图案

 使用debug工具对程序进行调试

使用r语言查看寄存器的值
使用u命令对ex2.exe进行精确反汇编

使用g命令调试到move ah,ac 之前,再用t命令进行单步调试,最后使用p调试int 21,结束程序.

没有出现图案的原因可能是因为屏幕滚动图案就消失了,当清屏后就出现了图案。

 

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

 

屏幕上出现了八个图案

ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

他们的功能和效果都相同,都输出了四个不同的图案,但是ex1.asm是直接寻址,而ex2.asm是通过寄存器bx间接寻址,ex2.asm把4改成了8,所以输出了八个图案。

3.实验任务三

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据
0237H。
代码如下所示:
;ex3.asm
assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax
    mov bx,07b8h
    mov ax,0237h
    mov cx,16s:  mov [bx],ax
    add bx,2
    loop s
    mov ah,4ch
    int 21h
code ends
end

对程序进行汇编,链接

为了更好地观察结果,我们清屏之后再运行程序,可以看到屏幕中间出现了许多问号

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
 
可以看到屏幕中间出现了许多9

 
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
可以看到屏幕中间出现了许多红色的7

猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。 

通过结果我们可以发现,改变低位字节,字符变了颜色没变,改变高位字节和低位字节,字符和颜色都变了。所以高位字节存放的是颜色信息,而地位字节则存放的是输出字符的信息。

 

 4.实验任务四

编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)
综合使用[bx]和loop,编写汇编源程序 
代码如下所示:
;ex4.asm
assume cs:code
code segment
    mov ax,0020h
    mov ds,ax
    mov bx,0
    mov cx,40h
s:  mov [bx],bl
    inc bx
    loop s
    mov ah,4ch
    int 21h
code ends
End

 先将程序进行汇编和链接,因为这个程序没有向显存输入信息,所以我们在屏幕上不会看到图案

 

 先使用r命令查看寄存器的信息,再用u命令进行精确的反汇编

 

 使用4个t命令单步运行

 

 再用g命令执行到loop 000b之前

 

 然后对loop指令使用p命令

 

 使用d命令查看内存单元,可以看到实现了向内存0:200~0:23F依次传送数据0~63(3FH)的功能。

 5.实验任务五

教材实验4(3)(P121) 
;ex5.asm
assume cs:code
code segment
    mov ax,___
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,___
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

因为需要将 mov ax,4c00h 前的代码复制到内存 0:200 处,所以需要先确认复制的长度。第一空填cs,第二问先随意填数,对代码进行反汇编。

 

 

 由图可知,mov ax,4c00命令在0018,所以应该将0017赋给cx,代码为:

;ex5.asm
assume cs:code
code segment
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,0017h
s:  mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

 运行后查看0:200的内容

由此我们可以看到,0:200后的内容成功实现了复制。

二 实验总结

 1.通过这次实验,我掌握了如何对程序进行汇编,链接,运行,如何对程序实现精确反汇编。

 2.LOOP指令,是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,至少执行1次循环体,即至少循环1次。

执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。

 3.有时观察不到图形可以使用清屏操作。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文为ypyblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ypyblog/p/13909859.html