汇编总结: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外的段寄 ...
随机推荐
- Spring 加载静态资源
<mvc:default-servlet-handler/> JSP 中通过标签加载js文件或者link标签加载css文件等静态资源时要在springmvc的xml文件中配置以上设置请求就 ...
- 深度学习:Keras入门(一)之基础篇
1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深度学习框架. Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结 ...
- mvcSSHweb.xml要配置的信息
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" ...
- 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)
写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...
- (转)基于 Token 的身份验证
原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...
- MySQL存储写入性能严重抖动分析
案例描述: 通过iostat发现存储的写性能长期维持在10MB左右,而且因为写性能差已经导致数据库性能变差: 两个小时以后,iostat发现系统的写性能已经能够到100MB以上,数据库性能也恢复正常. ...
- Entity Framework Core 生成跟踪列
本文翻译自<Entity Framework Core: Generate tracking columns>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意:我使用的是 ...
- kali ssh服务连接问题,无法远程管理
1.修改sshd_config文件,命令为:vi /etc/ssh/sshd_config 2.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 3.将#Per ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- css display:box 新属性
一.display:box; 在元素上设置该属性,可使其子代排列在同一水平上,类似display:inline-block;. 二.可在其子代设置如下属性 前提:使用如下属性,必须在父代设置displ ...