汇编总结: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\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字节
练习题
在c语言里char c 赋值给short s 该用上面的什么指令?
在c语言里char c 赋值给unsigned short s 该用上面的什么指令?
在c语言里unsigned char c 赋值给short s 该用上面的什么指令?
在c语言里short s 赋值给char c该用上面的什么指令?
在c语言里unsigned short s 赋值给char c该用上面的什么指令?
在c语言里unsigned short us 赋值给short s该用上面的什么指令?
友情指示上面的问题想知道结果可以先写好c语言代码,再gcc -S 生成汇编文件查看
自:https://my.oschina.net/guonaihong/blog/506102
汇编总结:mov指令的更多相关文章
- ARM汇编之MOV指令
http://blog.csdn.net/lsywk/article/details/8799837 一.指令格式 MOV{条件}{S} 目的寄存器,源操作数 二.指令详解 MOV指令可完成从另一个 ...
- 汇编-MOV指令
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- LEA指令与MOV指令的区别——发现一本汇编好书
一.汇编语言中PTR的含义及作用mov ax,bx ;是把BX寄存器“里”的值赋予AX,由于二者都是word型,所以没有必要加“WORD”mov ax,word ptr [bx];是把内存地址等于“B ...
- 汇编中中括号[]作用以及lea和mov指令的区别
现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:mov eax,2lea ebx, ...
- 汇编,寄存器,内存,mov指令
一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...
- 汇编寄存器(内存访问)基础知识之三---mov指令
1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1 ...
- LDR 和MOV 指令区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...
- arm mov 指令
语法格式: mov {条件} 1目的寄存器,2源操作数 作用: MOV指令可完成从另一个寄存器.被移位的寄存器或立即数赋值到目的寄存器.其中S选项为指令的操作结果是否操作CPSR中的条件标志位,当没有 ...
- mov指令具体解释
MOV指令能够在CPU内或CPU和存储器之间传送字或字节.它传送的信息能够从寄存器到寄存器,马上数到寄存器,马上数到存储单元,从存储单元到寄存器.从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄 ...
随机推荐
- one plus 1(一加1)刷 kali nethunter 教程
刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...
- [HDU1512/ZOJ2334]Monkey King-左偏树-可合并堆
Problem Monkey King Solution 本题是裸的左偏树,一个模板就可以过了.对于每个操作对节点先删除/2再合并. 注意本题在HDU上评测特别坑,是多组数据,而且经常出现MLE的情况 ...
- JavaScript中的设计模式:单例模式
定义 单例模式就是一个类只能实例化一个对象,并且提供了一个访问它的全局访问点. 一般在实现登陆框,或者一个全局的控制器都会用到单例模式.现实中有window对象,线程池,全局缓存等. 简单实现 var ...
- 基于python的二元霍夫曼编码译码详细设计
一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...
- 设计模式的征途—14.职责链(Chain of Responsibility)模式
相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新 ...
- 使用Go和Let's Encrypt证书部署HTTPS
为什么要使用HTTPS?使用HTTPS的途径有哪些?如何用Go来部署HTTPS?拿出你的小本本,你要的干货都在这儿! HTTPS的好处我们已在之前的文章中提高好多.它加密浏览器和服务器之间的流量,保障 ...
- ASPCMS改造中
10月中旬的时候,芹芹大神给我接了个做网站的活,一番商量过后,我以低得说出来丢人TT的价格接了.主要是想借此摸清网站制作的一条龙服务. 目前根据ASPCMS开源管理系统,做了个大致的构架,下面上草图: ...
- 将域名转移到 Google Domains
之前存放域名用过 Godaddy.Dynadot.Namesilo 也有阿里云(万网)和腾讯云(新网),这回就用 Google Domains 啦! 话说 Google Domains 早已是 201 ...
- ES6数字扩展
前面的话 本文将详细介绍ES6数字扩展 指数运算符 ES2016引入的唯一一个JS语法变化是求幂运算符,它是一种将指数应用于基数的数学运算.JS已有的Math.pow()方法可以执行求幂运算,但它也是 ...
- 浅谈js中如何动态添加表头/表列/表格内容
我想很多童鞋用js动态向表格中添加数据很熟悉,而且也觉得非常简单!是的,对于写页面的童鞋来说,最喜欢写查询的页面了,动态向表格绑定数据.用for循环就可以轻松搞定. 如果我们的业务需求有所变化,可能我 ...