• 汇编总结: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

  • 相关阅读:
    创建内核对象的专有命名空间
    内核对象句柄表
    Windows小知识(二)
    内核对象与用户对象/GDI对象
    Windows小知识(一)
    Windows中查看错误
    handle(句柄)
    VC中调用其它程序
    消息映射的转变
    实验6.配置链路聚合
  • 原文地址:https://www.cnblogs.com/vspiders/p/7399111.html
Copyright © 2020-2023  润新知