VC编译的除法的一段汇编代码解释
int main(int argc, char* argv[])
{
int i;
scanf("%d", &i);
int j = i / 2;
printf("%d", j);
return 0;
}
编译后:
10: int j = i / 2;
00401039 mov eax,dword ptr [ebp-4]
0040103C cdq
0040103D sub eax,edx
0040103F sar eax,1
00401041 mov dword ptr [ebp-8],eax
即:M / 2 为
mov eax,M
cdq
sub eax,edx
sar eax,1
这是为什么呢?思考了一段时间后,我给出这样的回答,不知道够不够严谨
M与-M在计算机中的表示是互为补码的
即 [-M]=[M]补
因此 ,[M]/2分2个情况考虑
1,M为正数,正数的除法就是算术右移一位
mov eax , M
sar eax,1 //右移1位,即除以2
2,M为负数,则[M]/2= [ [-M]/2 ]补 = [-[[M]补/2] ]补
M为负数,所以,上面的计算过程是:
M取反加1,算术右移1位,再取反加1
设M为1字节
M取反加1可以表示成 (FF-M+1)
因此,上面的计算过程转化为
FF - ( (FF-M+1)/2 ) +1 = FF-(FF/2) + (M+1)/2
这里的 /2意思为向右带符号移一位,而FF 算术右移1位还是FF
所以可以简化为
(M+1)/2
注意,这里的M是负数
所以:
mov eax, M
sub eax,-1 //减-1就是+1
sar eax,1 //右移1位,除以2
然后解释一下 CDQ指令就可以了
当EAX >=0 ,CDQ结果 EDX=0
当EAX < 0 ,CDQ结果 EDX=-1
因此,M/2可以写成
mov eax, M
cdq //扩展符号位,到EDX
sub eax,edx //EAX>0 ,则EAX - 0 ;EAX<0 ,则EAX - (-1)
sar eax,1 //右移2位
VC编译的除法的一段汇编代码解释相关推荐
- bcs转10 c语言,小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52...
已结贴√ 问题点数:20 回复次数:3 小弟刚学习C语言,怎么把下段汇编代码转化为C语言程序,请高手指教!!!单片机89c52 BIT_COUNT DATA 07FH TIMER0 ...
- c语言编译load,用C语言写汇编代码之LoadLibrary
用C语言写汇编代码之LoadLibrary 2006-6-6 23:29 9868 用C语言写汇编代码之LoadLibrary 2006-6-6 23:29 9868 用C写一个加载msvcrt.dl ...
- 几段小代码解释Python命令式编程和函数式编程
所谓命令式编程,是指How to do,要通过指令告诉计算机如何一步一步地完成预定任务:而所谓函数式编程,可理解为What to do,只需要通过简单的指令告诉计算机要做什么就可以了,代码更加简洁.易 ...
- VC++编译zlib
目录 第1章简介 1 第2章版本1.2.3 2 2.1 编译汇编代码 2 2.1.1 32位汇编 2 2.1.2 64位汇编 5 2.2 Visual C++ 6.0 ...
- GCC如何编译内嵌汇编代码
内核代码绝大部分使用C 语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码.GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计 ...
- VS2005混合编译ARM汇编代码
2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中,发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求,需要直接通过编写ARM汇编指令 ...
- 通过一段汇编,加深对寄存器ESP和EBP的理解
一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指针.还是不能很透彻理解.之后借于一段汇编代码,总算是对两者有个比较清晰的理解. 下面是按调用约定__stdca ...
- java汇编代码段,新手求助,跪求各位大神解答,怎么把这段汇编转成java代码
本人新手,最近在折腾个so文件,通过IDA生成出来的脚本,有一段汇编代码不知道怎么用java去实现,求各位大神指点 loc_2498 LDR R6, [SP,#0x50-0x40] LDR ...
- 从汇编代码的角度观察switch与if...else,乘除与移位的差别
Switch与if-else 有以下两个函数,y值根据x值进行加法运算,功能相同,SumSwitch()是switch版本,SumIfElse()是if else版本: public int SumS ...
最新文章
- (附链接)CVPR 2022 | 模型难复现不一定是作者的错,最新研究发现模型架构要背锅...
- AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
- linux的 vi编辑器在哪,Linux Vi编辑器的使用
- leetcode117. 填充每个节点的下一个右侧节点指针 II(dfs)
- onvif学习笔记1:环境准备
- sigmoid层的输出_keras如何多输入多输出,以及中间层输出
- 免费在线文本分析工具
- 《软件体系结构》 第一章 软件体系结构概论
- Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
- 2018年大数据趋势 :人工智能… 数据分析将包含可视化模型…
- oracle的音标,oracle的意思在线翻译,解释oracle中文英文含义,短语词组,音标读音,词源【澳典网ODict.Net】...
- Tomcat 启动速度慢,一直转圈的原因
- 校企联合学院分析ERP在家具行业中的应用
- 《Effective C++》笔记
- 我可以抱你吗?linux
- matlab特征值归一化,如何用matlab将特征向量归一化呢?
- 关于高通QPST平台功能和选项的一些简单说明
- 11——去哪儿网(总结)
- 谋哥:App开发者的苦逼不值得怜悯!
- C~K的难题(费马小定理)