实验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
任务三:
(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 编写调试具有多个段的程序的主要内容,如果未能解决你的问题,请参考以下文章