汇编语言-mov指令总结

本文转载自点击打开链接

1.mov指令的作用

mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值。

2.mov指令的种类

普通的mov指令;做符号扩展的movs;做零扩展的movz。

普通mov的种类有:movb完成1个字节的复制;movw完成2个字节的复制;movl完成4个字节的复制;movq完成8个字节的复制。

3.movs的种类及其作用

如果要完成下面的c语言代码:

char c = -1;
int i = c;

翻译成下面的汇编代码,会发现一个问题:用movb把%al寄存器里的-1,复制到%ebx寄存器,结果变成了255。

movb $-1,%al      
xorl %ebx,%ebx     
movb %al,%bl        
xorq %rax,%rax
movl %ebx,%esi
movq $fmt,%rdi
call printf             
movl $0,%edi       
call exit

一个数,其在内存中表示正数,表示负数,依赖机器是怎么解释最高bit位的1。c语言里面signed类型,如果最高bit为1,认为它是一个负数。unsigned类型,始终认为是正数。

(事实上c语言已经做了自动转换,这里的char,int只是指代上面的汇编代码里的类型)

char类型的-1在内存中的表示:11111111

char类型的-1复制到int类型在内存中的表示:00000000000000000000000011111111

int类型的-1在内存中的表示:11111111111111111111111111111111

两边一对比就知道,char复制到int需要把多出来的字节作符号位扩展。

做符号扩展的movs的种类:movsbw作符号扩展的1字节复制到2字节;movsbl作符号扩展的1字节复制到4字节;movsbq作符号扩展的1字节复制到8字节;movswl作符号扩展的2字节复制到4字节;movswq作符号扩展的2字节复制到8字节;movslq作符号扩展的4字节复制到8字节。

4.movz的种类及其作用

回到上面的例子,如果i和c都是无符号数,这时候就是movz指令大显身手的时候。

做零扩展的movz的种类:movzbw作0扩展的1字节复制到2字节;movzbl作0扩展的1字节复制到4字节;movzbq作0扩展的1字节复制到8字节;movzwl作0扩展的2字节复制到4字节;movzwq作0扩展的2字节复制到8字节;movzlq作0扩展的4字节复制到8字节。



你可能感兴趣的:(汇编语言-mov指令总结)