实验三

实验内容

练习1

编写汇编源程序t1.asm

在此软件下完成

输出结果为36

将line4和line9中寄存器dl的值分别修改为0-9中任何一个数字,重新汇编,连接,运行,观察程序输出结果的变化。

 结果为寄存器dl中值的逐个输出。

 用debug对生成的可执行文件t1.exe进行调试。

1.使用r命令查看。观察寄存器cx的值是多少,观察寄存器ds和cs的值是多少,它们之间是否满足关系(cs)=(ds)+10h。

cx=0016 ds=075a cs=076a  满足(cs)=(ds)+10h

2.psp(程序段前缀)的头两个字节是CD 20,用debug查看psp的内容,验证是否如此。

百度上说

program segment prefix ,简称PSP(程序段的前缀)
当输入一个外部命令或通过EXEC子功能(系统功能调用INT 21h的子功能号为4BH)加载一子程序时,COMMAND确定当时内存可用空间的最低端作为程序段起点。在程序所占内存空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息,可以通过研究psp定位文件名信息,进而获取文件名。
从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0 (其中SA为系统为程序分配内存的起始位置的段地址即当前寄存器DS的内容)

的确如此

3.使用u命令对t1.exe进行反汇编,观察反汇编得到的源代码。

4.使用t命令和p命令(遇到int命令时,用p命令)单步调试,观察结果。

练习2

同样的软件下出错了

编写汇编源程序t2.asm

实验3中第2个程序写法,里面隐藏着一个error,尽管在dosbox环境中汇编器没有报错,但在masm for windows集成软件环境里,明确定位了错误行,请尝试后,结合错误提示,把错误找出来并修正。

 

无效的指令操作数

 大佬处得知 word ptr 指定长度

8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。

 

 

line6-7相当于mov [0], 0433h line9-10相当于mov [2], 0436h 至于为什么这样使用两条指令,而不直接简化写成上面的形式,有两个原因。其中一个 是方便以后循环;另一个原因,留待第5章再解释说明。暂时,先这样使用。 

对源程序 t2.asm 进行汇编、连接、运行、调试

1.对t2.asm进行汇编、连接后,得到可执行文件t2.exe。运行t2.exe,观察程序运行 结果,验证是否在屏幕左上方出现红色的数值36。

 

经测试,有些平台在 dosbox 下运行这个程序时有些问题,如果屏幕左上方没有 输出结果,请运行程序t2.exe前,先输入cls命令清空一下屏幕,然后再执行t2.exe。

2. 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h→0432h, line10 的 0436h→0439h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清 屏后,再次观察程序运行结果。

 

3. 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h→0333h, line10 的 0436h→0336h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清 屏后,再次观察程序运行结果。

延伸思考和分析

 练习一程序结果为寄存器dl中值的逐个输出。练习二为【bx】最低位输出,通过改变,高位控制颜色。

二种方法输出位置不同,练习一直接输出,练习二位左上方输出。

总结与体会

在操作系统中,执行可执行文件时,操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置cs:ip指向第一条要执行的指令),然后由CPU执行程序。

 mov ax,4c00h

int 21h

这两条指令所实现的功能就是程序返回。

 

 

 

posted on 2018-11-18 13:51  学习疯子  阅读(284)  评论(0编辑  收藏  举报