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

减法对应的汇编是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

相关推荐
邪修king1 小时前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
泡海椒2 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
Navigator_Z12 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
君顾113 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
Escalating_xu13 小时前
【C语言数据类型和变量·上】从内置类型到变量模型:一次讲透 sizeof、signed/unsigned 与作用域
c语言
香菜TTT14 小时前
大模型上下文协议(MCP):AI 应用的“USB-C”接口技术
开发语言·人工智能·经验分享
aramae14 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
jimy115 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
ctlover15 小时前
排序与查找算法详解
开发语言·python
YYYing.15 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti