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