0 写在前面
为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序。
在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到x86体系结构在目前的广泛应用,我通过两个月左右的时间对x86的相关内容进行了学习。
在《x86汇编语言实践》系列中(包括本篇、x86汇编语言实践(2)、x86汇编语言实践(3)、x86汇编语言实践(4)以及x86汇编语言复习笔记),我通过几个具体案例对x86汇编语言进行实践操作,并记录了自己再编写汇编代码中遇到的困难和心得体会,与各位学习x86汇编的朋友共同分享。
我将我编写的一些汇编代码放到了github上,感兴趣的朋友可以点击屏幕左上角的小猫咪进入我的github,或请点击这里下载源代码。
1 debug练习
(1)使用MASM.EXE EXP41.ASM进行汇编。
(2)使用LINK.EXE EXP41.ASM进行连接。
(3)使用DEBUG.EXE EXP41.ASM进行调试。
(4)使用-e 78a:0指令对数据区的内容进行修改。不要修改第一个字0010H,从第二个字开始修改。每修改一个字节按下一次空格,当全部修改完成后,按下回车。
(5)使用-d 78a:0指令查看一下数据区当前的内容,情况如下图所示,班级学号水印修改成功。
(6)使用-t 500指令,让程序单步执行500次,以保证程序完成排序过程。或直接使用-g指令使程序执行到结束完成为止。
(7)使用-d 78a:0指令,查看排序后的数据区的情况,如下图所示,升序排序成功。
(8)改写源汇编程序为降序排序程序,存为EXP42.ASM重复上述(1)-(7)步,可以得到如下图所示的结果,降序排序成功。
(9)此处应该使用debug指令-a cs:17 来对17处的指令进行修改,重新使用-g或重复上述步骤即可得到降序序列。
【总结】
练习了debug的基本操作。
2 打印内存变量十进制ASCII码
打印内存中两个字x,y,分别为BCD编码表示的我的学号,其中x为1606H,y为1160H。转化为10进制后为56384448。通过在DOS命令中直接运行程序EXP3.EXE的方式,可以得到上述结果以ASCII码的形式打印结果如下:
3 32位乘法
向汇编程序中编写好待计算的两个32位二进制数:
这两个数分别为16061160H和16FFABCDH。
编写好程序后运行可得以下结果。
二进制输出结果:
内存结果查看:
与计算工具计算结果进行比对:
经计算,发现程序运行结果正确。
将程序中的子程序调用改成显示十进制的调用CALL P2,
输出十进制输出结果显示如下:
使用python计算结果:
经计算,发现输出结果正确。