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

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

 

一   实验结论

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工具调试可执行文件。
 

首先编写ex1.asm:

 

对ex1.asm用masm工具进行汇编:

 

 

再对生成的ex1.obj用link工具进行连接:

 

 

生成ex1.exe:

 

直接运行ex1.exe:

 

 发现有四个图案。

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

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

 

 

 2)结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编:

 

 

 

 3)使用g命令执行到line16退出执行之前 由反汇编后的结果可知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进行汇编链接

 

运行ex2.exe观察结果

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

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

1)使用u命令对ex2.exe进行精确反汇编

 

 

 

3)使用r语言查看寄存器的值,使用g命令调试到move ah,ac 之前,再用t命令进行单步调试,最后使用p调试int 21,结束程序.

 

 清屏之后可以看到有四个图案

 

 

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

 

屏幕上出现了八个图案

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

通过对比发现,改变前后的结果不同可能是由于循环的次数不相同,mov cx,4所表示的意思是将循环进行4次,mov cx,8是将循环进行8次,一个得出的是4个图案,另一个得出的是8个图案,ex1.asm也循环了四次,出现的也是4个图案。

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.LOOP指令是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,至少执行1次循环体,即至少循环1次。

 

 

 

posted @ 2020-11-05 09:47  gd_li  阅读(240)  评论(3)    收藏  举报