先贴一段代码:
跟踪后看到:
无论是给bool类型赋值为正整数 还是true,都会转变为1。
那么float和double类型如何转换为bool类型?
将bool类型赋值给int类型变量,就是借助了寄存器eax,将1byte的值放入eax,再从eax取出dword宽度的值即可。但是问题来了,程序在刚开始“初始化”时会有一段代码:
会将eax赋值为:
eax是32位的,存入1byte的时候,会变成CCCCCC01,你如何保证再取出dword(32位)给i1时,其它高位变成0?这就要靠movzx了!这就是movzx与mov不同的地方:
movzx一般用于将较小值拷贝到较大值中。movzx是将源操作数的内容拷贝到目的操作数,并将该值0扩展至16位或者32位。但是它只适用于无符号整数(说白了,填充0,是进行无符号扩展)。 他大致有的三种格式:
总之,movzx其实就是将我们的源操作数取出来,然后置于目的操作数,目的操作数其余位用0填充。
对于signed和unsigned char
同样是赋值以0FFh,但是不同类型的对象对这个二进制数的解释不同:
输出结果为:
将-1赋值给unsigned char ,输出的结果是255,说明0FFh被解释为unsigned char类型了,这也进一步说明,如果一个“式子”中,同时有signed和unsigned 类型,会自动将signed类型转换为unsigned类型。
进一步观察,当我们企图输出c1和sc2时,仔细观察二者汇编代码的区别:
前者是movzx,而后者是movsx,之前讲了movzx,现在我们再来讲讲movsx:
movsx是传送并进行符号扩展,由于sc2是signed,所以,要考虑占用1byte空间的它扩充为dword大小之后,多出来的空间用什么填充,当然是用符号位填充,这样,如果sc2原本是正的,扩充到dword之后仍是正的,如果是负的,扩充到dword之后仍是负的。
例如,MOV BL,80H