mov指令的作用:

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

mov指令种类:

1.普通的mov指令
2.做符号扩展的movs
3.做零扩展的movz

1.普通mov的种类有:

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

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

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

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

char c = -1;
int i = c;

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

用movb把%al寄存器里的-1,复制到%ebx寄存器,结果变成了255。等等,为什么会这样?

.section .text
.global _start fmt:
    .ascii "%d\n\0" _start:
    movb $-1, %al      #把-1赋值到寄存器al
    xorl %ebx, %ebx    #把寄存器%ebx 赋值为0
    movb %al, %bl      #把al的值赋值到%ebx寄存器的低8位 (引用%ebx寄存器低8位的方法就是使用%bl寄存器)     xorq %rax, %rax
    movl %ebx, %esi
    movq $fmt, %rdi
    call printf        #调用printf 打印ebx寄存器的内容,会发现输出变成了255     movl $0, %edi      #调用exit退出进程
    call exit

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

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

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

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

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

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

使用movb指令把char类型的-1复制到int类型里:

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

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

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

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

2.movs的种类

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

3.movz的种类及其作用

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

unsigned char c = -1;
unsigned i = c;
printf("%x:%d\n", i, i); //输出 0xff, 255

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

movb $-1, %al      #%al  = 0xff
movzbl %al, %ebx   #%ebx = 0x000000ff

2.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字节

练习题

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

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

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

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

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

  6. 在c语言里unsigned short us 赋值给short s该用上面的什么指令?

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

自:https://my.oschina.net/guonaihong/blog/506102

汇编总结:mov指令的更多相关文章

  1. ARM汇编之MOV指令

    http://blog.csdn.net/lsywk/article/details/8799837 一.指令格式 MOV{条件}{S}  目的寄存器,源操作数 二.指令详解 MOV指令可完成从另一个 ...

  2. 汇编-MOV指令

    知识点:  MOV指令  基址  内联汇编  把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...

  3. LEA指令与MOV指令的区别——发现一本汇编好书

    一.汇编语言中PTR的含义及作用mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD”mov ax,word ptr [bx];是把内存地址等于“B ...

  4. 汇编中中括号[]作用以及lea和mov指令的区别

    现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:mov eax,2lea ebx, ...

  5. 汇编,寄存器,内存,mov指令

    一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...

  6. 汇编寄存器(内存访问)基础知识之三---mov指令

     1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1 ...

  7. LDR 和MOV 指令区别

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...

  8. arm mov 指令

    语法格式: mov {条件} 1目的寄存器,2源操作数 作用: MOV指令可完成从另一个寄存器.被移位的寄存器或立即数赋值到目的寄存器.其中S选项为指令的操作结果是否操作CPSR中的条件标志位,当没有 ...

  9. mov指令具体解释

    MOV指令能够在CPU内或CPU和存储器之间传送字或字节.它传送的信息能够从寄存器到寄存器,马上数到寄存器,马上数到存储单元,从存储单元到寄存器.从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄 ...

随机推荐

  1. jquery 变量和原生js变量的关系

    其实js 变量和 jquery没什么不一样, 也可以直接 var  hhhh=$("header"); 但是当用到用到hhh时依然要用jquery 的方式,而不能js原生的方式.

  2. BufferedReaderTest

    package JBJADV003;import java.io.*;public class BufferedReaderTest { /** * @param args */ public sta ...

  3. Linux 教程 技巧集

    Linux 终端操作技巧 CTRL + U - 剪切光标前的内容 CTRL + K - 剪切光标至行末的内容 CTRL + Y - 粘贴 CTRL + E - 移动光标到行末 CTRL + A - 移 ...

  4. 基于GTID的Mysql-Mha高可用方案探索

    声明: 本篇文章内容整理来源于互联网以及本人自己的梳理总结,目的是从零到一的搭建起来mysql mha高可用架构. 一.软件概述 MHA(Master High Availability)目前在MyS ...

  5. CC攻击网站和游戏如何针对性预防?

    1:CC攻击原理 CC = Challenge Collapsar,其前身名为Fatboy攻击,是利用不断对网站发送连接请求致 使形成拒绝服务的目的, CC攻击是DDOS(分布式拒绝服务)的一种,相比 ...

  6. 将Asp.Net Core和corefx移植到.Net 4.0

    引言 因为工作内容的原因需要兼容 XP,而 XP 最多支持到.Net Framework 4.0.因此无法享受到 .Net Core 带来的一堆很好用的库,好在无论 corefx 还是 Asp.Net ...

  7. iOS开发实战-时光记账Demo 网络版

    之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ...

  8. Java设计模式之适配器模式(项目升级案例)

    今天是我学习Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一遍 ...

  9. Android 类似duplicate entry: android/support/v4/internal/view/SupportSubMenu.class问题解决办法汇总

    这种问题一般是v4或者v7包版本不一致导致的. 一般情况下进行在你的工程的入口module的build.gradle 的android标签下defaultConfig子标签中 添加如下的配置就能解决. ...

  10. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...