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位

相关文章
|
2月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
3月前
|
存储 算法 程序员
神秘代码世界惊现高效秘籍!究竟是什么让汇编语言编程如此强大?快来一探究竟!
【8月更文挑战第31天】《代码之美:探索高效汇编语言编程的最佳实践》介绍了汇编语言在系统内核、嵌入式系统及高性能应用中的不可替代作用。书中强调了深入理解处理器架构、提升代码可读性、优化算法与数据结构及有效利用寄存器等最佳实践的重要性。通过具体示例,如在 x86 架构下实现高效的加法函数,展示了如何运用这些技巧编写出既高效又可靠的汇编代码,充分展现了汇编语言的独特魅力及其在现代软件开发中的价值。
40 0
|
2月前
|
Windows
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码2--黑屏保护程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
【原创】DOS下TSR程序的汇编演示代码1--自动按键程序
|
3月前
|
NoSQL 前端开发 程序员
【震撼揭秘!】程序员绝不会告诉你的秘密:掌握汇编语言调试,轻松从软件故障中全身而退——透视代码底层,成为Bug猎人!
【8月更文挑战第31天】《调试的艺术:如何利用汇编语言追踪和解决软件问题》探讨了使用汇编语言进行高效调试的方法。无论是初学者还是资深开发者,面对棘手的 bug 时,高级语言的信息往往不足。文章通过具体示例展示如何通过汇编代码定位问题,如 C 语言中数组求和函数的崩溃问题。借助 `gcc -S` 生成的汇编代码和 GDB 调试器,可以深入理解程序行为,从而更准确地解决问题。掌握这一技能,将使你在复杂问题面前更加从容。
41 2
|
3月前
|
C语言
51单片机汇编语言流水灯代码
51单片机汇编语言流水灯代码
|
3月前
|
C# 开发者 图形学
Xamarin 竟在游戏开发领域大胆探索,跨平台优势与强大功能结合,开启游戏开发新潮流!
【8月更文挑战第31天】《Xamarin在游戏开发领域的探索》介绍了Xamarin作为跨平台开发框架,在移动游戏开发中的应用。它利用C#语言的优势,提供高效的开发体验,并结合各平台图形库实现高质量画面。本文还展示了Xamarin如何简化游戏逻辑处理、支持多线程编程及与Unity等工具集成,提升游戏质量和开发效率。此外,Xamarin还支持热更新和多平台发布,进一步优化游戏维护流程。
40 0
|
6月前
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
94 1
|
5月前
|
Python
python 代码脚本汇编
python 代码脚本汇编
46 0
|
6月前
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
40 0