分类:硬件方向个人札记评论:3条作者:SimolluS Heinz日期:2012-04-15阅读:597 views
有一段时间没有写这方面的东西了,原因很简单,寒假之后由16位汇编转向了32位汇编,显然刚开始非常水,实在不好意思发文章来找鄙视的~直到今天写了一个有点意思的递归程序,虽说班里的大牛,也就是我们的malash同学听说后还是直接把我狠狠鄙视了一顿,觉得这完全是少见多怪递归应该打回去重学的缘故,但是嘛……姑且反以为荣地写一下吧,大牛们轻拍~
这次学习32位汇编使用的教材是《Intel 高级语言程序设计》(第五版),也就是Irvine的那本书,题目出自8.3.3.6,大意是写出生成斐波那契数列的前20个整数的递归算法。利用之前对例题,也就是递归求阶乘的经验,最初对解题过程做此分析:
1:本题与阶乘题的区别在于每一步骤所需的两个操作数都是之前的结果
2:此区别将导致需要在某一或不同位置存入之前两次运算的数据
3:其中一次的数据可以直接由递归过程依次传递,另一次需要长时间保存
故创建堆栈框架如此:
Val20
ReturnMain
EBP0
Val19
ReturnFact
EBP1
Val18
……
其中Valn代表在此前的某一次递归中应当引用的另一个“古老”些的数据,首次产生的代码如下图:
主程序中首先初始化参数,将递归次数压入堆栈,进…
分类:硬件方向个人札记评论:0条作者:SimolluS Heinz日期:2012-02-28阅读:643 views
晚上有点懒得看书了,于是决定发一篇文总结一下今天所学的内容,同时作为对第一篇行数破百汇编源程序圆满完成的献礼~
长话短说,这个程序的任务要求在书197页下方,也就是实验十的第三部分,要求编程将123,12666,1,8,3,38这六个分别占据一字空间的数字以十进制字符的形式打印到屏幕上,打印的三个参数(行数,列数,属性)在源程序中给出。题目中给出编程指导并要求分别写成子程序模块:
(1)将用二进制信息存储的数据转变为十进制形式的字符串
(2)显示十进制的字符串
长话短说,直接发程序:
初始化代码区(CODESG),数据区(DATASG),额外数据区(ELSESG),堆栈区(STACKSG);这里需要提及一点,在书上所给的程序头之中是将六个数据直接放到DS区的,但如果这样的话,由于之后还要开辟空白空间放置转换后的字符,内存的定位只得使用【BX+SI+Idata】或类似格式,这不但使得定位语句难以书写,而且更多次地使用了本就将使用许多次的BX寄存器,导致普通寄存器的分配愈发复杂,通过堆栈有序储存数据的难度也随之加大,以至于可能不得不使用其他的内存空间储存中间值;但与造成了这么多的麻烦相反的是,段寄存器ES完全是闲置的,程序整…
分类:硬件方向个人札记评论:1条作者:SimolluS Heinz日期:2012-02-26阅读:360 views
嗯嗯……估计发了这么多文史青年的东西已经没人还记着我的本行是计算机系了……然后就从今天起另开一个专题以正视听吧。话说我这个人一向不喜欢按部就班地学东西——显然不像好孩子是不——前一阵子自学逻辑电路,后来却因为缺少实验的支撑不得不中途停滞,随后寒假里痛定思痛决定学习一些不这么难以亲手一试的东西,于是在接下来很长一段时间里,我要学习汇编语言。
学汇编的老规矩,从王爽先生的《汇编语言》(第二版)入门,测试环境:
Windows 7 (Ultimate) + Windows XP mode + MASM 5.0
发这第一篇文的初衷源于今天遇到的一个很奇怪的问题,有关第九章“转移指令的原理”最后的实验九,第一次利用汇编语言向屏幕输出内容。首先是试验向屏幕左上角输出一行白色字母,写下的程序如下:
然后下意识地用Debug调试,结果居然一片混乱!每一次单步运行后,无论是否修改显示缓冲区B800:0000起的32KB空间,这一部分内存中的内容总是不断变化的:
想了半天个中奥妙却百思不得其解,最后忽然发现右边翻译出的ASCII码很有意思,貌似是各寄存器名……忽然意识到也许这个缓冲区是与寄存器不同的,寄存器在单步运行时只会作受控改变,但缓冲区内容永远指向当前(或…
近期评论