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

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

相关推荐
小小龙学IT5 小时前
Qt 6 跨平台开发完全指南:从信号槽机制到实际项目落地
开发语言·qt
leisoo80975 小时前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
wWYy.5 小时前
C++与C的区别
c语言·c++
敢敢のwings5 小时前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
yaoxin5211235 小时前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
LuminousCPP6 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
一个帅气昵称啊6 小时前
.Net C# AI智能体开发-快速开始
开发语言·c#·.net
冬夜戏雪6 小时前
agent的trace 和eval
开发语言·前端·javascript
Sagittarius_A*6 小时前
Burst Lab | PHP 审计 13|反序列化(三):POP 链构造与 Gadget Chain 分析
开发语言·web安全·php·代码审计·反序列化
职场的momo7 小时前
11个后端与AI岗位同时开放:Java、网关、推理优化怎么匹配
java·开发语言·人工智能