实验3
1.1
先利用指令打开记事本==(这样可能比较有b格?哈哈)
然后把要打的汇编代码输入到记事本中:
将这个文件名改为t1.asm,存于masm环境文件中(这样后面的操作就很简便)
之后打开dosbox开始操作:
一步 老操作不多说;
先type编译一下,与原码相同;(记得用type加文件全名)
masm用来查错,0 errors!来解释一下这些东西哈:
浅蓝色的那行表示你要对它操作的文件名称
橙色是表示你要输出的目标文件名
深蓝色表示是否要生成产生中间结果的文件
绿色表示输入交叉引用文件的名称
(一般的话只要输入你要操作的文件名,其他是不需要的,enter就完事了)
link链接将t1.obj链接成可执行文件t1.exe
当然masm和link也可以简化操作就是在他们之后加文件名,在文件名后加分号就行了,
可以自动忽略中间文件的生成。
最后一步:执行t1,输入文件名(不要后缀)
输入结果是36
1.2
前面改成了dl,4后面改成了dl,5
重新masm ,link输出是45;由此观之,输出的就是dl的值==这两次小分段代码就是
对dl的赋值及输出。
1.3
进入t1.exe的debug环境
用r命令查看cx的值是0016,为什么是0016呢?了解到因为代码占用的字节是16。
ds=075A,cs=076A,相差10H,没毛病。
1.3.2
查看psp的内容即查看ds:ip的地址:
用d命令查看16位,前两位就CD 20。
1.3.3
有16行机器码==
1.3.4
附一张代码图,忘记把代码改回去了,索性就算到底了吧
使用t指令执行一个指令,在这里p指令与它的区别在于执行int的时候会把整个int执行完毕,
不是跳转到这个中断程序去跟踪执行。
第一次到int时,用p指令执行:
输出了dl=4,并且ax的值从02FF变成了0234,这正是dl=34的值,我怀疑int操作将
al,dl了,不知道与int 这个21的值有没有关系。
第二次到int时,用p指令执行:
输出了dl=5,并且ax同上变化为0235.
最后一次,p指令跟进,系统执行完毕,正常结束。
2.1.1
操作和上面相同
操作失误:被盖住了==,注释后面才注意到
经改正出现了红色的36
2.1.2
修改后:
变成了红色的29了!!!
2.1.3
经过修改:
出现了蓝色的36!!!
我自己还有疑问:尝试改变了十位数试一试:
附上t指令单步执行的图:
我有个思考:地址处于显存地址A0000~BFFFF之间:而且【bx】,0433h这个命令前面两位
是用来改变输出颜色的,而后两位是用来改变其输出为什么值的。
小结:通过这次实验,我想了蛮多的,但是还是不能很好的解答疑问,但也有很多收获吧,对自己
的汇编还是很有信心的,毕竟写了第一个汇编程序嘛,哈哈。