用汇编语言角度来理解C语言的一些问题
在汇编的世界里,整数的存在和表示是没有有符号数和无符号数之分的,都是用数的补码表示,有无符号的计算是靠指令来进行确定。如JA/JB是用于无符号数的跳转指令,而JG/JL则是用于有符号数的指令。汇编中的指令目的非常明确,也更加容易理解,而在C语言层次,有了一定的抽象,有些含义可能不是很确定,下面会看一些例子,结合汇编代码的实现,来更好里面C语言代码的含义。
下面思考 一些问题:
1.将短整数值赋值给长整数,是采用符号扩展还是零扩展?还有这是由谁来决定的?
2.移位运算?
...
问题1:看下面一段代码
char c = 0xFF;
unsigned char uc = 0xFF;
int i = c;
unsigned int ui = c;
int ii = uc;
unsigned uii = uc;
printf("i=0x%x, ui=0x%x, ii=0x%x, uii=0x%x\n", i,ui,ii,uii);
i,ui, ii, uii分别是什么呢?
运行结果:
i=0xffffffff, ui=0xffffffff, ii=0xff, uii=0xff
看下他们的汇编代码:
MOV BYTE PTR SS:[EBP-8],0FF
; char c=0xFF;
MOV BYTE PTR SS:[EBP-18],0FF
; unsigned char uc = 0xFF;
MOVSX EAX,BYTE PTR SS:[EBP-8]
; 符号扩展c放入EAX (EAX)=0xFFFFFFFF
MOV DWORD PTR SS:[EBP-10],EAX ; i = (eax) = 0xFFFFFFFF;
MOVSX ECX,BYTE PTR SS:[EBP-8]
; 符号扩展c放入ECX (ECX)=0xFFFFFFFF
MOV DWORD PTR SS:[EBP-C],ECX ; ui = (ecx) = 0xFFFFFFFF;
MOV EDX,DWORD PTR SS:[EBP-18]
AND EDX,0FF
; (edx) = 0xFF;
MOV DWORD PTR SS:[EBP-4],EDX
; ii = (edx) = 0xFF;
MOV EAX,DWORD PTR SS:[EBP-18]
AND EAX,0FF
; (eax) = 0xFF
MOV DWORD PTR SS:[EBP-14],EAX
; uii = (eax) = 0xFF
从汇编代码可以看出,对于c采用符号扩展,而对于uc采用的是零扩展,可以看出对于有符号的短整数将采用符号扩展,无符号的短整数将采用零扩展,这些都只是由源操作数来决定。
问题2看下面代码
int i = 0xFFFFFFFF;
unsigned int ui = 0xFFFFFFFF; int lefit_i = i << 4;
int left_ui = ui << 4;
int right_i = i>>4;
int right_ui = ui >> 4; int left_imm = 0xFFFFFFFF << 4;
int right_imm = 0xFFFFFFF >> 4;
printf("left_i=0x%x, left_ui=0x%x, right_i=0x%x, right_ui=0x%x, left_imm=0x%x,right_imm=0x%x \n", left_i,left_ui,right_i,right_ui,left_imm,right_imm);
运行结果:
left_i=0xfffffff0, left_ui=0xfffffff0, right_i=0xffffffff, right_ui=0xfffffff, left_imm=0xfffffff0,right_imm=0x0ffffff
看下他们的汇编代码:
MOV DWORD PTR SS:[EBP-14],-1 ; i=0xFFFFFFFF;
MOV DWORD PTR SS:[EBP-C],-1 ; ui=0xFFFFFFFF;
MOV EAX,DWORD PTR SS:[EBP-14]
SHL EAX,4 ; (eax)= i<<4;
MOV DWORD PTR SS:[EBP-4],EAX ; left_i=(eax)
MOV ECX,DWORD PTR SS:[EBP-C]
SHL ECX,4
; (ecx)=ui<<4;
MOV DWORD PTR SS:[EBP-8],ECX ; left_ui=(ecx)
MOV EDX,DWORD PTR SS:[EBP-14]
SAR EDX,4 ; (edx)=i>>4
MOV DWORD PTR SS:[EBP-18],EDX ; right_i=(edx)
MOV EAX,DWORD PTR SS:[EBP-C]
SHR EAX,4 ; (eax)=ui>>4
MOV DWORD PTR SS:[EBP-20],EAX ; right_ui=(eax)
MOV DWORD PTR SS:[EBP-1C],-10 ; 0xFFFFFFFF << 4 = 0xFFFFFFF0
MOV DWORD PTR SS:[EBP-10],0FFFFFFF ; 0xFFFFFFFF >> 4 = 0x0FFFFFF
可以看出,有符号和无符号整数的左移都使用的是SHL,而右移操作有符号数用的是SAR,而无符号数用的是SHR,对于常量可以看出,他们是按照无符号数来进行移位的。
用汇编语言角度来理解C语言的一些问题的更多相关文章
- 从四个属性的角度来理解C语言的指针也许会更好理解
文章会在文末更新! 关于指针是什么,很多教材已经作出了定义,大多数都会定义为"存放变量内存地址的变量".从这句话中我觉得除了让我知道这个定义有11个字以外,其他就没什么用了.我个人 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- 深入理解c语言_从编译器的角度考虑问题_纪念Dennis Ritchie先生
开源中国: Dennis Ritchie教授过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言.一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影 响,C++,Java,C ...
- 深入理解C语言的函数调用过程 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258 本文 ...
- 从需求的角度去理解Linux系列:总线、设备和驱动
笔者成为博客专家后整理以前原创的嵌入式Linux系列博文,现推出以让更多的读者受益. <从需求的角度去理解linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文 ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
- Android AsyncTask完全解析,带你从源码的角度彻底理解
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...
- 从逆向的角度去理解C++虚函数表
很久没有写过文章了,自己一直是做C/C++开发的,我一直认为,作为一个C/C++程序员,如果能够好好学一下汇编和逆向分析,那么对于我们去理解C/C++将会有很大的帮助,因为程序中所有的奥秘都藏在汇编中 ...
- 【转载】理解C语言中的关键字extern
原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻 ...
随机推荐
- 慢阻肺疾病管理APP——第一次迭代心得
时光匆匆,不知不觉就到了第十二周.——第一次迭代都完成了,最终迭代还会远吗? 一.第一次迭代的设想和目标: 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ...
- [转]sqlldr 导入乱码,Oracle客户端字符集问题
1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...
- explor img file
1, get offset # parted bone-debian----4gb.img GNU Parted 3.1 Using /workspace/bone-debian----4gb.img ...
- springboot快速开发(简单web)
这是一个springboot基础配置文件介绍的demo.只涉及到 控制层与前端的简单交互,用于验证代码的畅通. spring-boot pom.xml解释 <?xml version=&quo ...
- 可编程逻辑控制器(PLC)漏洞挖掘思路与验证
mailto wangkai0351@gmail.com 随时记录千奇百怪的漏洞挖掘思路,主要针对STEP7 v5+西门子S7-300/400系列PLC,欢迎同行前来交流. 组态信息下载完整性攻击 思 ...
- browser_action' is only allowed for extensions but this is a legacy packaged app
manifest.json中不可包含调试代码: "app": { "launch": { "local_path": ...
- Window下,利用Anaconda2创建jupyter-notebook的python3环境方法
随着深度学习的火热,越来越多的人去学习和了解这门技术.而做算法的同学为了能够更快,更高效的写出相关的深度学习算法出来,需要比较方便的开发环境.今天主要介绍一下在jupyter notebook中,新增 ...
- Debian 系linux切换登录管理器(display manager)
在控制台中sudo dpkg-reconfigure <你的dm包名>即可dm选择列表,选择自己需要的dm 例如ubutu18默认使用gdm3,则输入命令: sudo dpkg-recon ...
- 网络原因导致的 spring cloud config 读取git上的配置文件时报错:Cannot clone or checkout repository
今天在公司使用spring cloud config搭建配置中心的时候,出现了读取不到git库的问题:Cannot clone or checkout repository.在网上百度,前面几个答案都 ...
- RemindMe
[最新版本:1.0.0.1] [公告:感谢使用!\r\n欢迎访问软件主页:http://www.cnblogs.com/dubuyunjie/p/8895488.html\r\n]