ics2017pa1.RTFSC

Init_monitor的位置讲义中已经给出:

1在这里插入图片描述

2在这里插入图片描述
在这里插入图片描述
3
在这里插入图片描述
如果命令行个数比较多时,如果按照顺序一个一个定义参数含义很容易造成混乱,而且如果程序只按顺序处理参数的话,一些“可选参数”的功能将很难实现,这个问题在 linux 中用 getopt 等函数可以优雅地解决。
https://www.cnblogs.com/chenliyang/p/6633739.html

可以从讲义找到下面语句的位置debug目录下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

https://www.cnblogs.com/clover-toeic/p/3892688.html

在这里插入图片描述

再回到原来的ui_mainloop函数上
在这里插入图片描述

结合之前的使用,不难分析出能看出这是一个类似于图灵机的C语言实现:不断地修改eip指针(IP),从而从虚拟的内存中取出命令,并解析,从cmd_table中寻找匹配项目,如果是错误的命令就给出提示(“Unknow command”)。

我们再来看问题
在这里插入图片描述
首先在讲义中可以找到这条指令的位置
在这里插入图片描述
搜索这个函数

在这里插入图片描述
在这里插入图片描述
因为unit64是无符号数,所以-1被解释为最大的无符号数(推导见袁阿姨的书),所以指令将被执行最大次数(这是在is_batch_mode==true的情况下,也是就是一开始在monitor的解析函数下,输入了-b)

具体批处理是啥,我们就先不管了哈哈。

然后是前面的一个寄存器写作题目:
在这里插入图片描述
下面是上述的结构体定义

在这里插入图片描述
先来看一下报错的申明
在这里插入图片描述
是reg_w调用错误,查看结构体,发现函数(reg.h)定义如下
在这里插入图片描述
再来看报错的位置(reg.c)
在这里插入图片描述
好吧,我承认我什么都没看出来(希望会的大佬能指点我一下,谢谢)
那就老老实实按照改吧
“32位、16位、8位寄存器物理上并非独立的,所以将其包含在同一共用体中
32位寄存器eax,ebx,ecx,edx,esp,esi,edp,edi之间相互独立,所以包含在同一结构体中
gpr与eax,ebx,ecx,edx,esp,esi,edp,edi都表示寄存器,所以指向同一内存地址,包含在一个共用体中
eip与寄存器与通用寄存器相互独立,所以最终包含在同一结构体中”
回顾一下pa1的前面所说的i386寄存器
在这里插入图片描述
在这里插入图片描述

按照这个思路改一下

在这里插入图片描述

在这里插入图片描述

编译成功!
在这里插入图片描述

再回到之前我们看到的reg_test()上
在这里插入图片描述
比如说,就是随即生成数,扔到regsl和regw中,检验eax的低十六位是否等于ax中的值。
&0xffff的作用就是取低十六位,懒得证明了,就贴个图,袁阿姨也讲过:

在这里插入图片描述

再看下一题
在这里插入图片描述

让我们在该目录下搜索,发现了如下的数组定义:
在这里插入图片描述
然后我们再查看opcode_entry是什么

在这里插入图片描述

Opcode的中文是指令
我们还可以发现,在opcode数组中出现了一些该C文档中的宏定义:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/20191014184526507.png)
在这里插入图片描述
全局再搜索concat函数,得到:
在这里插入图片描述
好了,再纠结我也看不懂了,也不想补习C,等到要用到这个知识的时候再看吧。

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

在这里插入图片描述

然后我再monitot的debug目录下找到使用它的地方

在这里插入图片描述

以后估计可以用这个憨憨函数。
下面是Assert的定义:
在这里插入图片描述
下面是panic的定义:
在这里插入图片描述
他们的使用案例:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值