实验3

1、编写汇编程序t1.asm,如下:

对程序进行汇编、连接、运行:

程序的输出结果为36.

若.asm文件在子目录中,进行汇编需要加上路径,例如,masm s:\code\t1.asm,但是生成的.obj文件仍旧在根目录中。

将line4和line9中dl的值分别修改为7和5,结果输出为75.

下面对修改过后的程序进行debug调试:

 

cs=0016h,ds=075ah,cs=076ah(cx存放的是程序的长度)

确实满足(cs)=(ds)+10h.

从之前的学习我们可以知道,cs是代码段段寄存器,ds是数据段段寄存器,那么为什么它们之间会存在某种关系呢?

从书上我们可以知道,PSP的段地址就等于DS。

验证得出,psp的头两个字节是CD 20

 

对程序进行反汇编:

对以上程序进行单步调试:

当我一直用t命令调试时,执行到int 21时,cs:ip变为 

 

下面遇到int 用p命令调试:

我们可以发现在p命令的下方分别出现了7和5,合起来就是我们的输出结果75.

所以int 21h的作用是什么呢?

 

2、

line3之所以是0B800H而不是b800h是为了与标识符区别开来。

但这种区分可能仅在编译器中有用,之间用debug时,出现了error。

 

确实在屏幕左上方输出了一个红色的36.

在屏幕上方输出一个红色的29。

通过实验1/(4)我们可以发现会有这样的结果是因为我们把数据存入了显存,所以它直接在屏幕上显示出来了。

 

练习1和练习2 输出数值时的不同做法:

练习1是通过int 21h这句系统指令完成输出的,它表式输出的语句是

mov ah,02h
int 21h

这是输出dl的指令。

练习2是通过修改显存的数据,直接显示在屏幕上的。

 

关于分享:

https://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html

这个博客里又关于int 21h的各种用法。

posted @ 2018-11-12 17:34  xxxux_onezero  阅读(322)  评论(1)    收藏  举报