当前位置: 首页 > 逆向 > 正文

C语言实现MOVSX

很多时候我们在反汇编的时候,都会发现movsx这个汇编指令

比如:

004013F0    0FBE4C24 04     movsx ecx,byte ptr ss:[esp+4]

movsx的意思就是带符号拓展的赋值命令

比如我要赋值的数字是12(10进制),因为12二进制表示为:00001100

最高为0,那么movsx,1100前全部填0,数值依然不变

但是对于0xF7,他的二进制是 11111110

对于MOVSX,因为最高为1,那么值就为FFFFFFF7,其中最高为符号位

总结下我们会发现 0xF7 = 247

对于247进行运算:255-247+1得到了255-247+1 == 9

对于9取反然后化为带符号的16进制,你会惊奇的发现,他等于FFFFFFF7

那么对于c语言怎么使用呢?

很简单

int tmp1;

tmp1=*(tmp+j); //已知*(tmp+j)的十六进制值是C6

那么若经过movsx ,那么应该为FFFFFFC6

因为tmp1为int型,那么c++会自动转换,通过调试你会发现tmp1==-58

那么-58转换成十六进制为FFFFFFC6

那么就达到了类似的效果

另外如果是遇到了类似于

004013FA    C1F8 04         sar eax,4

0040145A    D0E0            sal al,1

等逻辑左移和逻辑右移的话,那么C语言中已经有相应的运算符号了,只不过我们可能忘记了

>> 逻辑右移
<< 逻辑左移

int tmp;

tmp = tmp>>2  <=>  sar ax,2 或者是 shr ax,2

tmp = tmp << 2  <=> shl  ax,2 或者 sal ax,2


本文固定链接: http://kuaile.in/archives/787 | 蒲公英的博客

该日志由 蒲公英 于2012年04月03日发表在 逆向 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C语言实现MOVSX | 蒲公英的博客
关键字:

C语言实现MOVSX:等您坐沙发呢!

发表评论


You must enable javascript to see captcha here!

快捷键:Ctrl+Enter