AT&T 符号扩展和零扩展
来源:互联网 发布:硬盘使用寿命 知乎 编辑:程序博客网 时间:2024/04/29 05:29
转自:https://my.oschina.net/guonaihong/blog/506102
mov指令的作用:
mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值。
mov指令种类:
1.普通的mov指令2.做符号扩展的movs3.做零扩展的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 _startfmt: .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 = 0xffmovzbl %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 生成汇编文件查看
- AT&T 符号扩展和零扩展
- 关于符号扩展、零扩展
- 符号扩展,零扩展与符号缩减
- C++ 中注意,零扩展和符号位扩展
- 符号扩展和无符号扩展
- 有关计算机运行时的零扩展和符号扩展与移位运算的总结
- 浅谈Java中的补零扩展和补符号位扩展
- 符号性和符号扩展
- 符号扩展和截断
- 关于补零扩展与补符号位扩展
- 零位扩展和符号位扩展
- 符号扩展
- 符号扩展
- 符号扩展
- C语言中的无符号扩展和带符号扩展
- C语言中的无符号扩展和带符号扩展
- c语言的带符号扩展和无符号扩展
- c语言的带符号扩展和无符号扩展
- caffe yolo移植
- [Leetcode] 122. Best Time to Buy and Sell Stock II 解题报告
- mybatis配置文件
- 正则表达式模式修饰符
- 解决Intellij IDEA 突然无法加载主类问题
- AT&T 符号扩展和零扩展
- 坐标距离
- 使用C++filt工具去除C++的名称转义
- 个人笔记之SSM的配置
- codeforces 803E Roma and Poker (dp)
- nginx 事件驱动模型
- [PlantSimulation]层式结构及其动画设置
- 水仙花数
- 5月题目汇总1 (4.30-5.6)