P7坑点以及debug总结

P7坑点以及debug总结

开始之前还是先废话几句(

​ 感觉这次的实验很吃理论知识,所以说动手之前建议先仔细琢磨指导书和给的代码(虽然不是全的但是整体框架很清晰),尤其是指导书上那两个思维导图(assemble和link都含有哪些函数,看懂了的话对于后续写程序和debug都有很大帮助)。当然这个过程还是蛮痛苦的(

​ 给的代码的话虽然看上去很复杂(其实就是很复杂),有一些函数只给了声明,但是函数本身好像是在静态库里面,所以说有声明的直接用就可以。建议看一看那几个声明函数的文件,因为自己写的部分也是会用到很多的,所以说把这些函数声明之前的注释看明白,结合着上面提到的思维导图再去写程序,效率会大幅提高。

​ 顺便安利一下strtok函数(太好用了!!),特别适合懒人(我)使用,大家可以查一下,用起来是不难的,在assemble.c的pass_one里也用到过,可以对比着看。

那开始进入正题,下面将说一些遇到的坑点和debug技巧(也只有这些,太详细的没精力写了QAQ)。

1.坑点

确保给的代码是课程中心最新版。(不然将会有极差的debug体验)

Assemble:

1.read_data_segment:

1.助教说会保证data段结束之后空一行再开始text段,所以说读到空行返回就行,不用考虑的太麻烦。

2.如果用strtok()函数来取每一行的每一部分的话,注意分隔符一定要把冒号:考虑进去,也就是char* IGNORE_CHARS_HB = " \f\n\r\t\v,():";命名的时候如果怕重可以自己乱填点后缀。

3.在用strtok()函数的基础上,如果涉及到了copy字符串,建议重新定义个char *指针,然后用create_copy_of_str()函数来复制字符串,不然可能会出现奇奇怪怪的问题。(在linker段更是如此)

4.记得取完标签之后在最开始加%

5.如果用strtok()函数,那么读数字就把每一行第三部分用translate_num()即可,但是注意传入的参数,如果感觉不好用请忽略这句话。

2.add_to_table:

这一部分按部就班写就可以,认真读注释应该问题不大,提一下在表满了的时候试着申请表,申请不到就调用allocation_failed();并返回-1即可。

3.write_lui:

1.在这一步是要判断args[1]是不是合法的标签的,判断的时候注意把结尾可能的@HI删掉再调用is_valid_label()

2.这一步可能用到translate_reg() translate_num() create_copy_of_str()

is_valid_label() add_to_table().其中add_to_table()的参数要改成重定位表,地址用addr就可以。

Linker:

1.fill_data:

1.一定要搞懂传进来的那几个参数是干嘛的,尤其是后两个,结合主函数就可以很清晰的知道了。

2.这一部分就是磨性子,一部分一部分的fgets()

3.input指针是会随着读的过程而不断移动的,所以读到相应位置直接调用calc_data_size(input);

calc_text_size(input);以及add_to_symbol_table(input,symtbl,base_text_offset,base_data_offset);就行。

4.重定位部分其实就有点类似再写一遍add_to_table(),注意strtok()情况下建议新开char*字符串用create_copy_of_str()拷贝,再填入表里面。(好麻烦,谁写的
直接用add_to_symbol_table(input,reldt->table,0,0);就可以。(感谢lc大佬)

2.inst_needs_relocation:

很好写。

2.debug

(我的debug方法超级笨,如果你会用clion之类的或者把cmd连上IDE用断点调试请无视这部分)

1.编译

​ 每一次更改文件之后都是要编译的,做到这一步需要先在devc文件里面搜索mingw32-make.exe,把他复制到你从课程中心下载好的代码解压的文件里,就是跟assemble.c 和linker.c在同一个文件夹里面,然后将它改名为make.exe.这样做就可以帮助我们后续进行编译了 。

​ 在写好代码之后打开cmd(窗户键+R,输入cmd),先转到对应的文件夹下,首先转到对应的盘,比如说D盘,加一个d:按回车就可以,之后加上”cd“+”空格“+”具体路径“,再回车就可以。

在这里插入图片描述

​ 之后按照上图输入make.exe,这一步可能会报错,照着报错信息debug就可以。当然这个时候如果出现的是配置环境的报错信息,比如出现什么什么failed,可以换Vscode或者Clion的mingw32-make.exe重复上述操作,并且把Makefile文件的clean:下的rm改成del。(暗中观察yyds!)

devc的make.exe不行导致的
如果上一步通过了那么一般会有参数类型不对应之类的bug。照着de就可以。(注:这里的照着de是指用dev或者vscode或者其他打开对应的.c文件修改代码,修改完记得保存,然后再到命令行中执行make.exe进行编译)
代码有问题导致的

等什么时候编译完在文件夹里面出现assembler.exe 和linker.exe说明第一阶段成功了。

在这里插入图片描述
在这里插入图片描述

先不用看那几个txt,是要后边自己建立的。

2.debug(内部逻辑)

​ 既然编译好了,说明程序能跑,但是对不对就不一定了,所以说还要继续de,首先我们建立几个文件,我这里建立的assemble1,2以及assembleout就是对应assemble程序里面的input,inter,output。所以说把pdf里面的数据粘贴到assemble1里面就可以。link1,2和

linkout就是要连接的两个文件和输出文件,当然连接多个也是可以的,就是多建立几个文件罢了。

​ 编译成功的情况下,我们输入assemble.exe,就会出现用法。
在这里插入图片描述

(可以看一下函数里面是怎么实现的,对于理解main函数的传参很有帮助,当然不看也行)

所以我们想直接跑就可以这样子输入:assembler.exe 文件名1 文件名2 文件名3 回车

在这里插入图片描述

​ 如果完全正确的话就可以打开txt文件看输出对不对了。当然第一遍一般是不行的(

​ 如果不行为了debug就可以在程序里面各种地方加入debug语句(如果是printf会直接输出到cmd中,看起来还是很方便的),然后记得保存加编译(make.exe),再重复上述操作。(当然这个方法超级笨,然而我不会别的方法,可恶)

​ 对于linker同样的道理,在待链接文件的内容粘贴好之后这样子执行:

在这里插入图片描述

如果输出文件对得上号那就没什么问题了。

来个小彩蛋,那个懒.txt里面是啥嘞:

在这里插入图片描述

因为经常会手残把cmd关掉,所以提前准备了一下,省得每次都得一点一点打(

有错误麻烦及时指出! (睡大觉去了)

最后祝大家P7顺利!! 冬至记得吃饺子!

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值