汇编中的减法与补码转换奥秘

减法对应的汇编是sub。

虽然计算机指挥做加法但是,可以通过补码将减法转换为加法。

算式:y+y(反)=0-y<==>y(反+1)<==>-y<==>y(补)=-y

代码

#include <stdio.h>

int main(int argc, char* argv\[\]){
int n1 = argc;
int n2 = 0;
scanf("%d", &n2);
n1 = n1 - 100;
n1 = n1 + 5 - n2;
printf("n1 = %d\r\n", n1);

return 0;
}

汇编

wingw

main(int, char**):

push %rbp

mov %rsp,%rbp

sub $0x30,%rsp

mov %ecx,0x10(%rbp)

mov %rdx,0x18(%rbp)

call 0x7ff7f77b1827 ; <__main> mov 0x10(%rbp),%eax

mov %eax,-0x4(%rbp) ;n1 = argc

movl $0x0,-0x8(%rbp) ;n2 = 0

lea -0x8(%rbp),%rax

mov %rax,%rdx

lea 0x118f1(%rip),%rax ; 0x7ff7f77c3000 mov %rax,%rcx

call 0x7ff7f77c1b70 ; <scanf(char const*, ...)> subl $0x64,-0x4(%rbp) ;n1 = n1 - 100

mov -0x4(%rbp),%eax

add $0x5,%eax

mov -0x8(%rbp),%edx

sub %edx,%eax

mov %eax,-0x4(%rbp) ;n1 = n1 + 5 -n2

mov -0x4(%rbp),%eax

mov %eax,%edx

lea 0x118ce(%rip),%rax ; 0x7ff7f77c3003 mov %rax,%rcx

call 0x7ff7f77c1bd0 ; <printf(char const*, ...)> mov $0x0,%eax

add $0x30,%rsp

pop %rbp

ret

msvc

64->64

main(int,char **):

movq %rdx, 0x10(%rsp)

movl %ecx, 0x8(%rsp)

pushq %rdi

subq $0x50, %rsp

leaq 0x20(%rsp), %rdi

movl $0xc, %ecx

movl $0xcccccccc, %eax ; imm = 0xCCCCCCCC rep stosl %eax, %es:(%rdi) ;n1 = argc

movl 0x60(%rsp), %ecx

movl 0x60(%rsp), %eax

movl %eax, 0x20(%rsp)

movl $0x0, 0x34(%rsp) ;n2 = 0

leaq 0x34(%rsp), %rdx

leaq 0x8691(%rip), %rcx

callq 0x1400011a9 ; scanf movl 0x20(%rsp), %eax

subl $0x64, %eax ;n1 = n1 -100

movl %eax, 0x20(%rsp)

movl 0x20(%rsp), %eax

addl $0x5, %eax

subl 0x34(%rsp), %eax

movl %eax, 0x20(%rsp) ;n1 = n1 + 5 -- n2

movl 0x20(%rsp), %edx

leaq 0x866f(%rip), %rcx

callq 0x14000119a ; printf xorl %eax, %eax

movl %eax, %edi

movq %rsp, %rcx

leaq 0x86b4(%rip), %rdx

callq 0x140001046 ; _RTC_CheckStackVars movl %edi, %eax

addq $0x50, %rsp

popq %rdi

retq

64->32

main(int,char **):

pushl %ebp

movl %esp, %ebp

subl $0x10, %esp

movl $0xcccccccc, %eax ; imm = 0xCCCCCCCC movl %eax, -0x10(%ebp)

movl %eax, -0xc(%ebp)

movl %eax, -0x8(%ebp)

movl %eax, -0x4(%ebp)

movl 0x8(%ebp), %eax

movl %eax, -0x4(%ebp)

movl $0x0, -0xc(%ebp)

leal -0xc(%ebp), %ecx

pushl %ecx

pushl 0x197b30 *; imm = 0x197B30* calll 0x4010eb *; _scanf* addl 0x8, %esp

movl -0x4(%ebp), %edx

subl $0x64, %edx

movl %edx, -0x4(%ebp)

movl -0x4(%ebp), %eax

addl $0x5, %eax

subl -0xc(%ebp), %eax

movl %eax, -0x4(%ebp)

movl -0x4(%ebp), %ecx

pushl %ecx

pushl 0x197b34 *; imm = 0x197B34* calll 0x40119f *; _printf* addl 0x8, %esp

xorl %eax, %eax

pushl %edx

movl %ebp, %ecx

pushl %eax

leal 0x19155c, %edx

calll 0x401050 ; @_RTC_CheckStackVars@8 popl %eax

popl %edx

addl $0x10, %esp

cmpl %esp, %ebp

calll 0x4010ff ; __RTC_CheckEsp movl %ebp, %esp

popl %ebp

retl

addl %eax, (%eax)

addb %al, (%eax)

adcl $0xfff40019, %eax ; imm = 0xFFF40019

相关推荐
lhbweilai5 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
Wang's Blog8 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
inrichtt8 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
砚底藏山河9 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年9 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym9 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen9 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室9 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
quantdash_cc9 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun10 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统