<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一直很懒,好久没更了。。就前几天把lab4、lab5 y86那一套lab的代码打包上传了也没做特别的说明,在这里一起说了吧。</span>
先扔上下载地址 http://download.csdn.net/detail/u013648407/7626133
说明一下吧,y86是相对于x86简单的一种教学性质的系统,这两个lab分别实现的是y86 assembler和y86 simulator。具体就是做一个汇编语言转机器语言的工作。
lab4做的simulator较为简单,只要把给定的code拆解开转换成实现进行运算并随时更新register和CC的状态就行。
lab5复杂一些,需要把汇编语句解析出来(parse_系列函数就做这个工作),然后根据解析出来的内容更新symbol table和realloc table,这里解释一下,symbol table是一个记录语句中变量的表,realloc table则是帮助重定位的表,记录每个变量调用时需要跳到的位置,以下面一段需要做解析的代码为例:
# Modification of asum code to compute absolute values of entries. # This version uses a conditional jump # Execution begins at address 0 .pos 0 init: irmovl Stack, %esp # Set up Stack pointer irmovl Stack, %ebp # Set up base pointer jmp Main # Execute main program # Array of 4 elements .align 4 array: .long 0x0000000d .long 0xffffff40 # -0xc0 .long 0x00000b00 .long 0xffff6000 # -0xa0000 Main: irmovl $4,%eax pushl %eax # Push 4 irmovl array,%edx pushl %edx # Push array call AbsSum # Sum(array, 4) halt # int AbsSum(int *Start, int Count) AbsSum: pushl %ebp rrmovl %esp,%ebp mrmovl 8(%ebp),%ecx # ecx = Start mrmovl 12(%ebp),%edx # edx = Count irmovl $0, %eax # sum = 0 andl %edx,%edx je End #/* $begin abs-sum-cmov-ys 0 */ Loop: mrmovl (%ecx),%esi # get x = *Start irmovl $0,%edi # 0 subl %esi,%edi # -x cmovg %edi,%esi # if -x > 0 then x = -x addl %esi,%eax # add x to sum irmovl $4,%ebx # addl %ebx,%ecx # Start++ irmovl $-1,%ebx # addl %ebx,%edx # Count-- jne Loop # Stop when 0 #/* $end abs-sum-cmov-ys 0 */ End: popl %ebp ret .pos 0x100 Stack: # The stack goes here #/* $end code-ysa */ #/* $end code-yso */可以看到其中的Stack、End等变量就是需要放到symbol table中的,而当分析到调用这些变量时,就需要从realloc table中取出其位置,并将分析位置设置到该处。
另外,pos align 等工作也是在分析时完成的。
分析完语句后要做的就是重定位(realloc函数)和将二进制结果输出(binfile函数)
具体看代码吧。很基础的东西,写的代码也比较丑,勿黑勿喷。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
再说说lab6,malloc lab,还是先扔上下载链接吧http://download.csdn.net/detail/u013648407/7718777
这个lab是模拟linux的内存分配的实验。
想了想好像也没啥说的,就是按要求从内存里分配一段空间,再分配一段,或者释放以前分配的空间。。。听起来比较弱的样子。。。
所以这个lab除了考察正确性以外还加入了对性能和分配空间占用效率的考察,性能这个好说,就是比速度,空间占用率则是说比如有下面一种分配情况:
malloc a0 100
malloc a1 200
malloc a2 100
free a1
malloc a3 300
在这种情况下,如果前三条我们是这么分配的100|200|100,那么接下来的情况就是100| (200)|100->100|(200)|100|300,这会使我们浪费中间200的空间
如果前三条是100|200|(100)|100,那么接下来就是100|(300)|100->100|300|100,显然空间利用率要高得多。
而对于性能方面,按照linux内核代码使用的rbtree结构自然是最快的,而像我这样不能灵活使用的弱鸡只能按照书上的推荐使用显示空闲链表。
这种链表就是将原本内存分配结构扩充(原本是head(4)|........|tail(4),扩充之后则是head(4)|pred(4)|......|succ(4)|tail(4))增加了两个前驱后继指针来记录当前block的前一个和后一个空闲block。
查找空闲链表中的合适空闲块也有多种办法 ,first fit\next fit\best fit.其中最快的是next fit,就是记录当前搜索到的位置,以此作为下一次搜索的起始位置,优点就是快,缺点是空间利用率可能会很低。。。其他两种都是相对较慢而空间利用率较高的方法。我的代码中有first &next 两种搜索方式的实现,读者可以自己跑一下体会体会就明白了。
这个lab真心反人类。。挂链表摘链表玩到吐。。另外某些测试数据极度变态简直成绩杀手。。po主是最后没有办法了不要脸了直接黑了binary1 binary2两组数据才拿到了满分。。。。。。再次跪求勿黑勿喷。。。。。。