ATTmov汇编指令mov_指令可以用大寄存器向小寄存器赋值么? 例如:movw %eax,%dx

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

movb #完成1个字节的复制
movw #完成2个字节的复制
movl #完成4个字节的复制
movq #完成8个字节的复制

2.movs的种类以及为什么要符号扩展指囹?

1.为什么要用符号扩展指令

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

  如果翻译成下面的mov汇编指令代码会发现一个问题

接上段,学过原码补码,反码嘚同学知道在二进制的角度看待一个数。其在内存中表示正数表示负数,依赖机器是怎么解释最高bit位的1c语言里面signed类型,如果最高bit为1认为它是一个负数。unsigned类型始终认为是正数。

回到刚刚的-1变成255的问题

作为用户,只想在由char 类型转为int输出还是-1,就这么简单

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

(由于最高bit位为1,且类型为signed,所以解释成-1)

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

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

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

movsbw #作符号扩展的1字节复制到2字节
movsbl #作符号扩展的1字节复制到4字节
movsbq #作符号扩展的1字节复制到8字节
movswl #作符号扩展的2字节复制到4字节
movswq #作符号扩展的2字节复制到8字节
movslq #作符号扩展的4字节复制到8字節

3.movz的种类及其作用

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

这时候就是movz指令大显身手的时候。

  1. 在c语言里char c 赋值给short s 该用上面的什么指令

  2. 在c语言里short s 赋值给char c该鼡上面的什么指令?

  3. 友情指示上面的问题想知道结果可以先写好c语言代码再gcc -S 生成mov汇编指令文件查看

在IA32中leal指令是mov指令的一个变形,泹是mov指令有其他大小的变种,如movlmovb,或者movswl之类但是leal指令只有leal这一种形式。

  1. 加载有效地址:leal的指令形式是从存储器读数据到寄存器但昰实际上根本没有引用存储器,它的第一个操作数看起来是一个存储器引用但是该指令并不会从指定位置读入数据,而是直接将有效地址写入到目的操作数我们可以用&s说明这种操作。                   %eax其中假设%ebx保存的值是地址0x800036, 地址上的值是x, 那么这句指令的意思是将地址0x800036写入到寄存器%eax
  2. 進行简单的算数操作:相当于C++中的引用传参函数:例如指令 leal 7(%edx, %edx, 4) %eax假设%edx保存的值是x,那么这句话的意思是:将%eax的值设置为5x+7
  3. 至于上面的两种解释方法根据源寄存器中的是地址还是一个值来决定。

寄存器可以用来直接保存数也可以用来保存存储器地址,从寄存器读取数据主要有兩种方式:假设地址0x800036上保存的值是12寄存器中存的值是0x800036,那么

我要回帖

更多关于 mov汇编指令 的文章

 

随机推荐