PA2.2补充

1.填写指令数组时操作数宽度的问题

    所填的宽度为源的宽度,如果某个字节开头的指令在手册中只有一种形式,直接填写对应的描述中源的宽度即可;如果有两种形式,分别为16位和32位形式,说明该指令根据是否有66前缀确定操作数长度(在数组中0x66的位置已经填写了66转义函数),使用IDEX即可。

如下图:
这里写图片描述
则填写结果为:
/* 0xf4 */ EMPTY, EMPTY, IDEXW(xx, xxxxx, 1), IDEX(xx, xxxxx),

如下图:
这里写图片描述
则填写结果为:
/* b0 */ EMPTY, EMPTY, EMPTY, IDEX(X, XXXX),

/* b8 */ EMPTY, IDEXW(X, XXXX, 1), EMPTY, EMPTY,

另外附录A的表格也能确定宽度,译码后缀为b,则为8位,为v,则表示16位或32位(即会有66前缀转义)

2.调试建议

    基本每个程序都有会执行几百几千条指令,所以尽管si几十几百甚至直接一千。实际上,并不需要将每一行都和反汇编的结果一一对照,因为如果指令填写或实现错误的话,要么译码长度不对,导致下一步译码出错,要么寄存器的值发生错误,而这两种情况都能被diff-test检测且定位到错误发生或接近错误发生的位置。

3.Mod R/M字节译码

    有些指令的小注是/0~7或者/r等等,在之前我分享的链接中其实有相关内容的详解。想知道是什么意思的自行查找资料,这里只说明在译码函数中有一个decode_op_rm,这个函数已经实现了对Mod R/M字节的处理(什么是Mod R/M字节请查看手册或上网查找),而该函数又已经在各种DHelper函数中实现了其正确的使用,所以填写指令的时候,内部细节已经不需要我们去考虑,直接调用封装好的译码函数即可。

4.gpr3中的test

    在附录A中,F6\F7都对应着grp3指令组,且译码函数表中分别为Eb\Ev,但查看grp3表格,其他指令的目标都是eax寄存器,但test却是立即数I。而在框架中这两个位置已经填写了译码函数E,故若直接在grp3中填写EX(test)会出错,但又不能修改译码函数,因为这样该指令组中的其他指令又会出错。
    首先我想到的是在grp3中填写IDEX(I, test),但是这样会导致译码长度出错。然后在decode.c中查看了一下那些没用到的译码函数,找到有一个叫test_I的译码函数,填写IDEX(test_I, test)即可。
    这当中主要有两点,一点是gpr中填的不一定都是EX,另外一点是某些指令比较特殊一般套路行不通的时候,不妨去看一下decode.c或者其他文件,看框架中是不是有些没用到的东西。

5.符号扩展

    有一种简便的实现符号扩展的方法:如果默认是算术右移的话,可以采用先左移再右移的方法,实现操作数为负数的时候高位自动补1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值