实验5 编写调试具有多个段的程序

Posted sun-yiwen-blog

tags:

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

四、实验结论:

任务一:

(1)对源程序 ex5_1.asm 进行汇编、连接、运行;

(2)利用debug来对源程序进行调试;

step1:用r命令查看当前的各个寄存器的值;

技术分享图片

step2:根据当前CS的值并且用u命令进行反汇编;

技术分享图片

step3:根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

技术分享图片

因此,可以知道此时(即程序返回前):

CS=076C

SS=076B

DS=076A

 step4:因为已经将data的值传进了ax中,所以查看data段中的数据;

技术分享图片

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1;


 任务二:

(1)程序返回前,data段中的数据为:

技术分享图片

(2)根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

技术分享图片

CS=076C

SS=076B

DS=076A

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1;

(4)该段实际占有的空间为:(N/16+1)*16

   注:在8086CPU架构上,段是以paragraph(16-byte)对齐的。程序默认以16字节为边界对齐,所以不足16字节的部分数据也要填够16字节。“对齐”是alignment,这种填充叫做padding。16字节成一小段,称为节。

任务三:

(1)程序返回前,data段中的数据为:

技术分享图片

(2)根据反汇编得到的结果,用g命令执行到程序返回前,即执行到001D之前;

技术分享图片

CS=076A

SS=076E

DS=076D

(3)设程序加载后,code段的段地址为X,则data段的段地址为X+2,stack段的段地址为X+4;


 任务四:

第(1)和(2)个程序不能执行,因为找不到程序入口就无法执行第一条语句;


任务五:

源代码:

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c segment  
  db 8 dup(0)
c ends       
code segment
start:
  mov bx,0
  mov dx,0
  mov cx,8
s:mov dx,0
  mov ax,a
  mov ds,ax
  add dl,[bx]
  mov ax,b
  mov ds,ax
  add dl,[bx]
  mov ax,c
  mov ds,ax
  mov [bx],dl
  inc bx
  loop s
  mov ax,4c00h
  int 21h

code ends
end start

step1:利用t命令单部执行到mov [bx],dl命令之前,此时上一条命令mov ds,ax已经执行完毕,此时ds中保存的就是c段的段地址

技术分享图片

step2:用d命令查看未加载数据之前的c段中的内容

 技术分享图片

step3:运行到程序返回前,此时的DS中保留的就是c段的段地址,查看c段中的数据;

技术分享图片

Conclusion:验证得知,数据得到了相加。


 任务六:

源代码:

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
  mov ax,a
  mov ds,ax
  mov ax,b
  mov ss,ax
  mov sp,0fh
  mov bx,0
  mov cx,8
s:push [bx]
  add bx,2
  loop s
  mov ax,4c00h
  int 21h
  
code ends
end start

 step1:用t命令执行到mov bx,0之前,此时栈顶的位置已经完成初始化;

技术分享图片

此时SS=076C,SP=F

step2:查看push操作前,b段中的位置;

技术分享图片

step3:运行到程序返回前,此时的SS中保留的就是b段的段地址,查看b段中的数据;

技术分享图片

Conclusion:验证得知,数据在b段得到了逆置。


 五、总结体会 

Question:在根据CX中存放的代码长度来进行反汇编的时候会出现反汇编出来的前面一段是我们所写入的汇编指令,但是后面会出现一些其他的指令或数据,

CX中保存的是整个程序段的长度,如何计算数据段的长度从而用CX和数据段长度之差得到代码段的长度?

总结:通过将不同的的数据和代码写在不同的段中,使程序段的分工更加清晰,更具有可读性。在自己设计完成对数据的操作的时候,使自己对汇编中指令更加理解。

以上是关于实验5 编写调试具有多个段的程序的主要内容,如果未能解决你的问题,请参考以下文章

实验 5 编写调试具有多个段的程序

|实验 5 编写调试具有多个段的程序

实验5 编写调试具有多个段的程序

实验5 编写调试具有多个段的程序

实验5 编写调试具有多个段的程序

实验 5 编写调试具有多个段的程序