zoukankan      html  css  js  c++  java
  • movzbl和movsbl

    汇编语言中最最常用的指令 -- 数据传送指令,也是我们接触的第一种类别的汇编指令。其指令的格式为:“mov 源操作数, 目的操作数”。
    mov系列支持从最小一个字节到最大双字的访问与传送。其中movb用来传送一字节信息,movw用来传送二字节,即一个字的信息,movl用来传送双字信息。这些不详说了。除此以外mov系列还提供两个带位扩展的指令movsbl和movzbl,我们举个例子来说明一下这两个特殊指令的作用何在:

    a) movzbl指令
    void dummy1() {
     unsigned char c = 'a';
     unsigned int a = c;
    }
    其对应的GNU汇编为(省略部分内容):
     movb $97, -1(%ebp)   //'a'的ASCII码为97
     movzbl -1(%ebp), %eax
     movl %eax, -8(%ebp)
    说明:在dummy1函数中“unsigned int a = c”语句完成的是一个从unsigned char到unsigned int的赋值操作,由于int的类型长度大于char类型长度,所以实际是将一个字节的内容拷贝到一个可以容纳4个字节的地方,这样的话需要对源数据进行一下扩展,即填充高位的3个字节。

    如何填充呢?由于变量a和c都为无符号整型,所以只需要填充0即可。而movzbl就是干这个活的。movzbl指令负责拷贝一个字节,并用0填充其目的操作数中的其余各位,这种扩展方式叫“零扩展”。

    b) movsbl指令
    void dummy2() {
     signed char c = 'a';
     unsigned int a = c;
    }

    其对应的GNU汇编为(省略部分内容):
     movb $97, -1(%ebp)   //'a'的ASCII码为97
     movsbl -1(%ebp), %eax
     movl %eax, -8(%ebp)
    说明:在dummy2函数中“unsigned int a = c”语句完成的是一个从signed char到unsigned int的赋值操作,由于int的类型长度大于char类型长度,所以实际是将一个字节的内容拷贝到一个可以容纳4个字节的地方,这样的话需要对源数据进行一下扩展,即填充高位的3个字节。如何填充呢?GNU汇编告诉我们它使用了变量c的最高位来填充其余的3个字节。movsbl指令负责拷贝一个字节,并用源操作数的最高位填充其目的操作数中的其余各位,这种扩展方式叫“符号扩展”。实际上dummy2中变量a还是保留了变量c的符号位的,起码GCC是这么做的。

    c) 在CS.APP中pushl和popl也别归入“数据传送指令”类别,但对于刚入门选手这两个指令还是稍显复杂,在以后谈到“procedure”时再细说。

  • 相关阅读:
    【作业四】软件案例分析之必应词典
    【番外篇001】意外的“黄马褂”
    收藏的好资源
    【作业三】结队任务二-----CourseManagement
    【作业二】结对项目之需求分析与原型模型设计
    【实践练习一】Git以及Github的使用
    [iOS 多线程 & 网络
    Objective-c 单例设计模式
    优化tableView性能(针对滑动时出现卡的现象)
    iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3597352.html
Copyright © 2011-2022 走看看