实验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的各种用法。

浙公网安备 33010602011771号