0.参考文章
1.配置gcc (dev c++中MinGW64)
path系统变量
新建系统变量:LIBRARY_path
新建系统变量:C_INCLUDE_PATH
cmd测试
2.反汇编
1.c
#include<stdio.h> void main(){ int cx=10; int ax=0; int bx=1; while(cx>0){ ax+=bx; bx++; cx--; } // printf("%d",ax);//55 }
1_at.s
.file "1.c" .def __main; .scl 2; .type 32; .endef .text .globl main .def main; .scl 2; .type 32; .endef .seh_proc main main: pushq %rbp .seh_pushreg %rbp movq %rsp, %rbp .seh_setframe %rbp, 0 subq $48, %rsp .seh_stackalloc 48 .seh_endprologue call __main movl $10, -4(%rbp) movl $0, -8(%rbp) movl $1, -12(%rbp) jmp .L2 .L3: movl -12(%rbp), %eax addl %eax, -8(%rbp) addl $1, -12(%rbp) subl $1, -4(%rbp) .L2: cmpl $0, -4(%rbp) jg .L3 addq $48, %rsp popq %rbp ret .seh_endproc .ident "GCC: (tdm64-1) 4.9.2"
会发现和debug中结果差不多
3.debug简单分析
4.在c代码里内联汇编
一个简单的内联例子
#include<stdio.h> int a; int main(){ printf("Test inline asm\n"); //__asm("mov $789,%eax"); //__asm("mov %eax,a"); __asm("mov $789,%eax\n""mov %eax,a\n"); printf("A is : %d\n",a);//789 return 0; }
纯C语言
#include<stdio.h> void main(){ int ax=0; int bx=1; int cx=10; while(bx<=cx){ ax+=bx; bx++; } printf("%d",ax);//55 printf("%d",bx);//11 }
对应C语言内联汇编
#include<stdio.h> void main() { int ax=0,bx=1,cx=10; __asm("mov ax,%eax\n"); __asm("mov bx,%ebx\n"); __asm("next:\n" "cmp cx,%ebx\n " "jg end\n" "add %ebx,%eax\n" "inc %ebx\n" "jmp next\n" "end:\n" "mov %eax,ax" "mov %ebx,bx" ); printf("%d",ax);//55 printf("%d",bx);//11 }