汇编语言中最最常用的指令 -- 数据传送指令,也是我们接触的第一种类别的汇编指令。其指令的格式为:“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”时再细说。

转载于:https://www.cnblogs.com/johnnyflute/p/3597352.html

movzbl和movsbl相关推荐

  1. Linux下的ATT语法(即GNU as 汇编语法)入门

    学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本和资料中都难以找到答案.程序员是追求完美的一个种群,其头 脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁.不久前在it ...

  2. x86的cpu处理int类型并不是处理char高效多少

    很多文章上说int类型是最高效的类型,cpu处理这种类型要比其它类型快,比如要比处理char类型快,原因是什么,原因就是他们学过一本国人的教科书,教科书上就这么写的,所以人们就记住了,然而事实为何如此 ...

  3. c语言整形提升规则,C语言进阶:整型提升

    几乎每个程序员都学过C,而且大多数在他们的工作中使用C.很显然C是TIOBE(2012年11月时排榜首)上最流程的编程语言之一.然而,有时,C的行为会让人意外和困惑.其中一个例子就是**整型提升**. ...

  4. linux内核第一个函数,通过内核源码看函数调用之前世今生 - 极光 - CSDN博客

    通过内核源码看函数调用之前世今生 作者:杨小华 栈(Stack):一个有序的积累或堆积 韦氏词典 对每一位孜孜不倦的程序员来说,栈已深深的烙在其脑海中,甚至已经发生变异.栈可以用来传递函数参数.存储局 ...

  5. 汇编语言快速入门学习笔记

    程序计数器(PC)在x86-64中用%rip表示,其中给出了将要执行的下一条指令在内存中的地址 在Linux下查看汇编代码的两种方式: 对于一可执行文件hello,使用objdump -d hello ...

  6. 2017-2018-1 20155313 《信息安全系统设计基础》第五周学习总结

    2017-2018-1 20155313 <信息安全系统设计基础>第五周学习总结 课堂笔记 宿主机(x86):linuxhello >gcc 目标机->实验箱:armhello ...

  7. c语言如何实现全部参数加9,从C语言到汇编(九)函数参数

    C语言参数依照从右到左的顺序依次传入栈中.有几个参数就传入几个参数. int fun(int a,int b) { return a-b; } int main(void) { fun(5,-1); ...

  8. 进程虚拟地址空间之数据分区存放【转】

    转自:http://blog.csdn.net/bullbat/article/details/7318269 作者:bullbat 在前面的<对一个程序在内存中的分析 >中很好的描述了程 ...

  9. 【汇编语言与计算机系统结构笔记06】地址计算指令,lea / leal,x86-32与x86-64下的swap对比,汇编的格式对比(Intel/Microsoft Differs from GAS)

    本次笔记内容: 07.寻址模式与数据传输指令等-2 文章目录 变址寻址 寻址模式实例 总结mov指令 地址计算指令 lea 整数计算指令 将leal指令用于计算 实例1 实例2 x86-32与x86- ...

最新文章

  1. Floodlight 处理交换机增加/移除过程
  2. 用python画xy散点图-python画时间序列散点图
  3. c++ primer 5th p289页练习题自己的解答程序
  4. 域名相关的一些基础知识
  5. html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
  6. 程序员面试的 3 大反面案例!看灯大侠最可怜!
  7. 信息学奥赛一本通 1232:Crossing River | OpenJudge NOI 4.6 702:Crossing River
  8. (48)FPGA面试技能提升篇(数字采样、射频存储、频谱搬移)
  9. Android 新一代多渠道打包神器
  10. 基于Spring Security角色的访问授权示例
  11. 信息安全习题(含答案)
  12. ISO27145协议解析
  13. 伊诺伊香槟分校计算机世界排名,2020年伊利诺伊大学香槟分校QS世界排名
  14. MyBatis_查询缓存01
  15. 解决Windows11打不开Windowsdefender(安全中心)
  16. python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...
  17. Missing Marketing Icon - iOS Apps must include a 1024x1024px Marketing Icon in PNG format
  18. H3C R6900 G3服务器虚拟化实施(VMware vSphere 7)
  19. 《Python编程:从入门到实践》读书笔记:第13章 外星人来了
  20. canvas画布js代码实现大风车的动画

热门文章

  1. Python Django安装MySQL库
  2. eureka客户端获取服务列表时间间隔配置
  3. redis缓存穿透、缓存击穿、缓存雪崩概念及解决方案
  4. Javaweb-AJAX快速入门及案例实战
  5. s l m 尺码排序 php,m l xl xxl是什么意思?服装尺码s m l xl xxl含义
  6. cordova 更改app版本_ionic项目中使用cordova-hot-code-push插件
  7. linux bash 局部变量赋值,linux之bash的基础特性(四)变量,配置文件及env,printenv,export,declare,set,unset,readonly简单命令...
  8. android 时间差 秒_Android进阶之使用时间戳计算时间差
  9. 自走棋电脑版_巨鸟公布自走棋正版自研手游:龙渊发行
  10. 启明云端分享| IDO-SOM2D01-V1-2GW核心板SPI调试总结