zoukankan      html  css  js  c++  java
  • 汇编总结:mov指令

    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
    "
    
    _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
    ", 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

  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/vspiders/p/7399111.html
Copyright © 2011-2022 走看看