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

Posted xxzkyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验2 汇编源程序编写与汇编调试相关的知识,希望对你有一定的参考价值。

实验结论

  • 实验任务1 
 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6     mov byte ptr ds:[0], 1
 7     mov byte ptr ds:[1], 1
 8     mov byte ptr ds:[2], 2
 9     mov byte ptr ds:[3], 2
10     mov byte ptr ds:[4], 3
11     mov byte ptr ds:[5], 3
12     mov byte ptr ds:[6], 4
13     mov byte ptr ds:[7], 4
14     
15     mov ah, 4ch
16     int 21h
17 code ends
18 end

汇编:

技术图片

链接:

技术图片

运行:

技术图片

 

使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节: 

技术图片

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

技术图片

使用g命令执行到line16退出执行之前:

技术图片

  • 实验任务2
 1 ; ex2.asm
 2 assume cs:code
 3 code segment
 4     mov ax, 0b810h
 5     mov ds, ax
 6     
 7     mov bx, 0
 8     mov ax, 101H
 9     mov cx, 8
10 s:  mov [bx], ax
11     add bx, 2
12     add ax, 101H
13     loop s
14     
15     mov ah, 4ch
16     int 21h
17 code ends
18 end

汇编:

技术图片

链接:

技术图片

运行:

技术图片

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

技术图片

使用t命令对ex2.exe进行调试:

技术图片技术图片技术图片技术图片技术图片技术图片

使用p命令调试:

技术图片

可见,p命令可以跳过loop循环

 使用g命令调试:

技术图片

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8

汇编:

技术图片

链接:

技术图片

运行:

技术图片

?结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效 果?在具体实现上有什么不同?

??他们实现了相同的功能和效果,但是在具体实现上不同。ex1.asm是通过byte的形式,使用ptr指针,将数据移到对应的字节地址,而ex2.asm是通过循环递增ax,再移入bx。

 

  • 实验任务3

综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。

汇编源代码:

 1 assume cs:code
 2 code segment
 3     mov ax,0b800h
 4     mov ds,ax
 5     mov bx,07b8h
 6     mov ax,0437h
 7     mov cx,16
 8 s:     mov [bx],al
 9     inc bx
10     mov [bx],ah
11     inc bx
12     loop s
13     
14     mov ax,4c00h
15     int 21h
16 code ends 
17 end

运行结果:

技术图片

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果

技术图片 

把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果

技术图片

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

??高位字节里存放的是颜色信息,低位字节里存放的是字形信息。

  • 实验任务4

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

由0~63可知是64字节型数据

 

 1 assume cs:code
 2 code segment
 3     mov ax,20h
 4     mov es,ax
 5     
 6     mov cx,64
 7     mov bx,0
 8     mov dl,0
 9     
10 s:  mov es:[bx],dl
11     inc bx
12     inc dl
13     loop s
14     
15     mov ax,4c00h
16     int 21h
17 code ends 
18 end

 

调试,并使用d命令查看0:200~0:23F:

技术图片

技术图片

简单调试一下,可以发现,是在复制数据的

技术图片

 

 使用p命令跳过循环,查看结果:

技术图片

由结果可知,确认已经将0-3F传送至此段内存区域。

 

  • 实验任务5

 

下面的程序的功能是将“mov ax,4C00H”之前的指令复制到内存 0:200处,补全程序。

ds确定数据从何处来,cx是复制多少个字节。al是8位寄存器,

 1 assume cs:code
 2 code segment
 3     mov ax,cs
 4     mov ds,ax
 5     mov ax,0020h
 6     mov es,ax
 7     mov bx,0
 8     mov cx,23
 9     
10 s:  mov al,[bx]
11     mov es:[bx],al
12     inc bx
13     loop s
14     
15     mov ax,4c00h
16     int 21h
17 code ends 
18 end

进行反汇编,17H-0=23

技术图片

调试:

技术图片

第一个字节是8C,所以al第一个得到的是8C。

技术图片

技术图片

用d命令查看0:200之后的若干字节:

技术图片

观察到已经mov ax, 4c00h之前的指令复制到指定内存

?以文字方式说明空白处填写依据。

??第一空,cs指令指向反汇编的命令,所以应该填cs。第二空,IP=IP+所读指令的字节数,可以将中间的当作一条指令。首先用u命令反汇编,发现mov ax 4c00位于0017h,0017h-0=17h=23,得到23。

实验总结

    ?字母型数据前面要加一个0,eg:mov ax,0B800H,这是翻译软件的规则。

    ?;用作注释

    ?LOOP指令,是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指版令在循环体之后权,至少执行1次循环体,即至少循环1次。执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。

    ?bx中存储的值为一个偏移地址,该指令是将bx中存储的数据段偏移地址所对应的存储器中的值传送给寄存器。


以上是关于实验2 汇编源程序编写与汇编调试的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

实验2 多个逻辑段的汇编源程序编写与调试

实验2 多个逻辑段的汇编源程序编写与调试

实验3 多个段的汇编源程序编写与调试